Ошибка в Blazor при получении потока zip-файла модели ML NET

#c# #blazor #ml.net #blazor-webassembly #ml.net-model-builder

#c# #blazor #ml.net #blazor-webassembly #ml.net-model-builder

Вопрос:

У меня проблема с Blazor. Я попытался сделать то, что сказано в документации о загрузке существующей модели из удаленного источника. ( https://learn.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.Exceptionamp;)
  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,object,object[],System.Exceptionamp;)
  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,object,object[],System.Exceptionamp;)
  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 System.Reflection.RuntimeMethodInfo.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, 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, TResamp; 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, TResamp; result, System.String name, System.String options, System.Object[] extra) <0x545d488   0x00018> in <filename unknown>:0 
  at Microsoft.ML.ModelLoadContext.TryLoadModelCore[TRes,TSig] (Microsoft.ML.Runtime.IHostEnvironment env, TResamp; result, System.Object[] extra) <0x5365f30   0x00068> in <filename unknown>:0 
  at Microsoft.ML.ModelLoadContext.TryLoadModel[TRes,TSig] (Microsoft.ML.Runtime.IHostEnvironment env, TResamp; result, 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,TSig] (Microsoft.ML.Runtime.IHostEnvironment env, TResamp; result, Microsoft.ML.RepositoryReader rep, Microsoft.ML.Repository Entry ent, System.String dir, System.Object[] extra) <0x535c980   0x00038> in <filename unknown>:0 
  at Microsoft.ML.ModelLoadContext.LoadModelOrNull[TRes,TSig] (Microsoft.ML.Runtime.IHostEnvironment env, TResamp; result, Microsoft.ML.RepositoryReader rep, System.String dir, System.Object[] extra) <0x5351628   0x00064> in <filename unknown>:0 
  at Microsoft.ML.ModelLoadContext.LoadModel[TRes,TSig] (Microsoft.ML.Runtime.IHostEnvironment env, TResamp; result, Microsoft.ML.RepositoryReader rep, System.String dir, System.Object[] extra) <0x5351438   0x00034> in <filename unknown>:0 
  at Microsoft.ML.ModelOperationsCatalog.Load (System.IO.Stream stream, Microsoft.ML.DataViewSchemaamp; inputSchema) <0x5243828   0x000a0> in <filename unknown>:0 
  at Deployments.Pages.SentimentAnalyzer2.OnInitializedAsync () [0x00096] in <PROJECTDIRECTORY>PagesSentimentAnalyzer2.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 Ядро 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, но у нее такая же ошибка.

Ответ №1:

Начиная с .NET 5 RC1 (.NET 5 или .NET 6), теперь вы можете размещать ML.NET модели машинного обучения в памяти в клиентском приложении Blazor WASM.

Моя ссылка на демонстрации сервера Blazor и WASM с ML.NET :https://github.com/bartczernicki/Blazor-MachineIntelligence

Ответ №2:

Если это приложение Blazor WASM, то, к сожалению, ML NET несовместим. Для ML NET требуется x86, которого нет в WebAssembly. Поэтому вы должны обработать свою модель ML на сервере и отправить результаты клиенту по HTTP.

Комментарии:

1. Возможно, я неправильно понимаю, но ML.NET требуется x64. Однако могут быть и другие причины, по которым это несовместимо.

2. Что ж, это печально. В любом случае спасибо. Вы бы порекомендовали сервер Blazor или размещенный WASM для ML.NET ?

3. Вы можете следить за блогом Сета, там есть несколько примеров ML NET. sethjuarez.com/2020/09/10 /…

4. Или вы можете использовать сервер Blazor вместо Wasm. github.com/EdCharbeneau/BlazePort