获取ML NET模型zip文件流时Blazor中出现错误

问题描述

我对Blazor有问题。 我试图做有关从远程源加载现有模型的文档中所说的事情。 (https://docs.microsoft.com/en-us/dotnet/machine-learning/how-to-guides/save-load-machine-learning-models-ml-net

这是我想出的:

@page "/analyzer"
@inject HttpClient _client
<h1>Analyzer</h1>

<input class="form-control" @bind:event="oninput" @bind="InputText"/>

@if (InputText != null)
{
    <h1>@InputText</h1>
}

@code {
    private string _inputText,mlPrediction;
    DataViewSchema modelSchema;
    MLContext mlContext = new MLContext();
    public string InputText
    {
        get
        {
            return _inputText;
        }
        set
        {
            _inputText = value;
            GetPrediction();
        }
    }
    private PredictionEngine<ModelInput,ModelOutput> _predictionEngine;
    protected override async Task OnInitializedAsync()
    {
        Stream modelFile = await _client.GetStreamAsync("<MODEL.ZIP ENDPOINT>");
        ITransformer trainedModel = mlContext.Model.Load(modelFile,out modelSchema);
        _predictionEngine = mlContext.Model.CreatePredictionEngine<ModelInput,ModelOutput>(trainedModel);
    }
    private void GetPrediction()
    {
        ModelInput mlInput = new Modelinput();
        mlInput.Sentiment = InputText;
        ModelOutput mlOutput = _predictionEngine.Predict(mlInput);
        mlPrediction = mlOutput.Prediction;
    }
}

当我初始化页面时,出现错误,我唯一了解的是第32行出现错误

_predictionEngine = mlContext.Model.CreatePredictionEngine<ModelInput,ModelOutput>(trainedModel);

我找不到任何遇到相同问题的人。 这是错误代码

Microsoft.AspNetCore.Components.WebAssembly.Rendering.WebAssemblyRenderer[100]
      Unhandled exception rendering component: Exception has been thrown by the target of an invocation.
System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.IO.FileNotFoundException: Could not load the file 'microsoft.ml.Transforms,Version=1.0.0.0,Culture=neutral,PublicKeyToken=cc7b13ffcd2ddd51'.
  at (wrapper managed-to-native) System.Reflection.RuntimeMethodInfo.InternalInvoke(System.Reflection.RuntimeMethodInfo,object,object[],System.Exception&)
  at System.Reflection.RuntimeMethodInfo.Invoke (System.Object obj,System.Reflection.BindingFlags invokeAttr,System.Reflection.Binder binder,System.Object[] parameters,System.Globalization.CultureInfo culture) <0x296c470 + 0x000ce> in <filename unkNown>:0 
   --- End of inner exception stack trace ---
  at (wrapper managed-to-native) System.Reflection.RuntimeMethodInfo.InternalInvoke(System.Reflection.RuntimeMethodInfo,System.Globalization.CultureInfo culture) <0x296c470 + 0x000ce> in <filename unkNown>:0 
   --- End of inner exception stack trace ---
  at System.Reflection.RuntimeMethodInfo.Invoke (System.Object obj,System.Globalization.CultureInfo culture) <0x296c470 + 0x000f6> in <filename unkNown>:0 
  at System.Reflection.MethodBase.Invoke (System.Object obj,System.Object[] parameters) <0x296bd98 + 0x00014> in <filename unkNown>:0 
  at microsoft.ml.Runtime.ComponentCatalog+LoadableClassInfo.CreateInstanceCore (System.Object[] ctorArgs) <0x545e428 + 0x000dc> in <filename unkNown>:0 
  at microsoft.ml.Runtime.ComponentCatalog+LoadableClassInfo.CreateInstance (microsoft.ml.Runtime.IHostEnvironment env,System.Object args,System.Object[] extra) <0x545e070 + 0x000c4> in <filename unkNown>:0 
  at microsoft.ml.Runtime.ComponentCatalog.TryCreateInstance[TRes] (microsoft.ml.Runtime.IHostEnvironment env,System.Type signatureType,TRes& result,System.String name,System.String options,System.Object[] extra) <0x545d848 + 0x001c8> in <filename unkNown>:0 
  at microsoft.ml.Runtime.ComponentCatalog.TryCreateInstance[TRes,TSig] (microsoft.ml.Runtime.IHostEnvironment env,System.Object[] extra) <0x545d488 + 0x00018> in <filename unkNown>:0 
  at microsoft.ml.ModelLoadContext.TryLoadModelCore[TRes,System.Object[] extra) <0x5365f30 + 0x00068> in <filename unkNown>:0 
  at microsoft.ml.ModelLoadContext.TryLoadModel[TRes,microsoft.ml.RepositoryReader rep,microsoft.ml.Repository+Entry ent,System.String dir,System.Object[] extra) <0x535cb38 + 0x00068> in <filename unkNown>:0 
  at microsoft.ml.ModelLoadContext.LoadModel[TRes,System.Object[] extra) <0x535c980 + 0x00038> in <filename unkNown>:0 
  at microsoft.ml.ModelLoadContext.LoadModelOrNull[TRes,System.Object[] extra) <0x5351628 + 0x00064> in <filename unkNown>:0 
  at microsoft.ml.ModelLoadContext.LoadModel[TRes,System.Object[] extra) <0x5351438 + 0x00034> in <filename unkNown>:0 
  at microsoft.ml.ModelOperationsCatalog.Load (System.IO.Stream stream,microsoft.ml.DataViewSchema& inputSchema) <0x5243828 + 0x000a0> in <filename unkNown>:0 
  at Deployments.Pages.SentimentAnalyzer2.OnInitializedAsync () [0x00096] in <PROJECTDIRECTORY>\Pages\SentimentAnalyzer2.razor:32 
  at Microsoft.AspNetCore.Components.ComponentBase.RunInitAndSetParametersAsync () <0x2ecb9b0 + 0x0013a> in <filename unkNown>:0 
  at Microsoft.AspNetCore.Components.RenderTree.Renderer.GetErrorHandledTask (System.Threading.Tasks.Task taskToHandle) <0x31219d8 + 0x000b6> in <filename unkNown>:0

我真的不知道该怎么办。

我用过:

  • ASP.NET Core 3.1
  • ML.NET 1.5
  • .NET Standard 2.1

我发现有人在相似类型的项目上似乎很成功,并且我们的程序在结构上是相同的:https://www.luisquintanilla.me/2020/03/01/deploy-machine-learning-mlnet-models-blazor-webassembly

我将ML模型托管在DigitalOcean和wwwroot上,但是存在相同的错误

解决方法

如果这是Blazor WASM应用程序,那么很遗憾,ML NET不兼容。 ML NET需要WebAssembly中不存在的x86。因此,您必须在服务器上处理ML模型,然后通过HTTP将结果发送给客户端。