Развертывание модели в веб-API ASP.NET Core

Узнайте, как использовать предварительно обученную модель машинного обучения ML.NET через интернет с помощью веб-API ASP.NET Core. Обслуживание модели через веб-API позволяет формировать прогнозы с помощью стандартных методов HTTP.

Необходимые компоненты

Создание проекта веб-API ASP.NET Core

  1. Запустите Visual Studio 2022 и нажмите Создать проект.

  2. В диалоговом окне Создание нового проекта выполните следующие действия.

    • Введите Web API в поле поиска.
    • Выберите шаблон Веб-API ASP.NET Core и нажмите кнопку Далее.
  3. В диалоговом окне настройки проекта:

    • Назовите проект SentimentAnalysisWebAPI.
    • Выберите Далее.
  4. В диалоговом окне Дополнительные сведения выполните следующие действия.

    • Un проверка Не используйте инструкции верхнего уровня.
    • Нажмите кнопку создания.
  5. Установите следующие пакеты NuGet:

    Дополнительные сведения об установке пакетов NuGet в Visual Studio см . в руководстве по установке и использованию пакета NuGet в Visual Studio .

Добавление модели в проект веб-API ASP.NET Core

  1. Скопируйте предварительно созданную модель в каталог проекта SentimentAnalysisWebAPI .

  2. Настройте проект для копирования файла модели в выходной каталог. В Обозреватель решений:

    • Щелкните правой кнопкой мыши ZIP-файл модели и выберите "Свойства".
    • В разделе "Дополнительно" измените значение копирования в выходной каталог, чтобы скопировать, если это еще больше.

Создание моделей данных

Чтобы определить схему входных и выходных данных модели, необходимо создать некоторые классы.

Примечание.

Свойства классов входных и выходных схем зависят от столбцов набора данных, используемых для обучения модели, а также задачи машинного обучения (регрессия, классификация и т. д.).

В файле Program.cs:

  1. Добавьте операторы using:

    using Microsoft.ML.Data;
    using Microsoft.Extensions.ML;
    
  2. В нижней части файла добавьте следующие классы:

    Входные данные модели

    Для этой модели входные данные содержат одно свойство SentimentText , представляющее комментарий пользователя.

    public class ModelInput
    {
        public string SentimentText;
    }
    

    Выходные данные модели

    После оценки входных данных модель выводит прогноз с тремя свойствами: Sentiment, Probabilityи Score. В этом случае Sentiment прогнозируемые тональности комментария пользователя и ProbabilityScore меры доверия для прогнозирования.

    public class ModelOutput
    {
        [ColumnName("PredictedLabel")]
        public bool Sentiment { get; set; }
    
        public float Probability { get; set; }
    
        public float Score { get; set; }
    }
    

Регистрация класса PredictionEnginePool для использования в приложении

Для формирования одного прогноза необходимо создать PredictionEngine. PredictionEngine не является потокобезопасным. Кроме того, необходимо создать его экземпляр везде, где он понадобится в вашем приложении. По мере увеличения размера приложения этот процесс может стать неуправляемым. Для улучшенной производительности и потокобезопасности используйте сочетание внедрения зависимостей и службы PredictionEnginePool, которое создает объекты PredictionEngine (ObjectPool) для использования во всем приложении.

См. дополнительные сведения о внедрении зависимостей в ASP.NET Core.

Добавьте следующий код в файл Program.cs :

builder.Services.AddPredictionEnginePool<ModelInput, ModelOutput>()
    .FromFile(modelName: "SentimentAnalysisModel", filePath: "sentiment_model.zip", watchForChanges: true);

Вкратце, этот код инициализирует объекты и службы автоматически для использования в дальнейшем по запросу приложения, вместо того чтобы вы делали это вручную.

Модели машинного обучения не являются статическими. По мере появления новых данных для обучения модель переобучается и развертывается повторно. Одним из способов получения последней версии модели в приложении является повторный запуск или повторное развертывание всего приложения. Однако это приводит к простою приложения. Служба PredictionEnginePool предоставляет механизм перезагрузки обновленной модели без перезапуска или повторного развертывания приложения.

Задайте для параметра watchForChanges значение true. В таком случае PredictionEnginePool запустит объект FileSystemWatcher, который прослушивает уведомления об изменениях файловой системы и вызывает события при изменении файла. При наличии изменений PredictionEnginePool автоматически перезагружает модель.

Модель определяется параметром modelName, поэтому при изменении может быть перезагружено несколько моделей на одно приложение.

Совет

Кроме того, можно использовать метод FromUri при работе с моделями, сохраненными удаленно. Вместо наблюдения за событиями изменения файлов FromUri опрашивает удаленное расположение на предмет изменений. Интервал опроса по умолчанию равен 5 минутам. Вы можете увеличить или уменьшить интервал опроса в зависимости от требований вашего приложения. В приведенном ниже примере кода PredictionEnginePool опрашивает модель, сохраненную по указанному универсальному коду ресурса (URI), каждую минуту.

services.AddPredictionEnginePool<SentimentData, SentimentPrediction>()
  .FromUri(
      modelName: "SentimentAnalysisModel",
      uri:"https://github.com/dotnet/samples/raw/main/machine-learning/models/sentimentanalysis/sentiment_model.zip",
      period: TimeSpan.FromMinutes(1));

Сопоставление конечной точки прогнозирования

Чтобы обработать входящие HTTP-запросы, создайте конечную точку.

Замените конечную точку / следующим образом:

var predictionHandler =
    async (PredictionEnginePool<ModelInput, ModelOutput> predictionEnginePool, ModelInput input) =>
        await Task.FromResult(predictionEnginePool.Predict(modelName: "SentimentAnalysisModel", input));

app.MapPost("/predict", predictionHandler);

Конечная /predict точка принимает HTTP-запросы POST и использует пул обработчика прогнозирования для возврата прогноза с помощью предоставленных входных данных.

По завершении Program.cs должны выглядеть следующим образом:

using Microsoft.ML.Data;
using Microsoft.Extensions.ML;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddPredictionEnginePool<ModelInput, ModelOutput>()
    .FromFile(modelName: "SentimentAnalysisModel", filePath: "sentiment_model.zip", watchForChanges: true);

var app = builder.Build();

var predictionHandler =
    async (PredictionEnginePool<ModelInput, ModelOutput> predictionEnginePool, ModelInput input) =>
        await Task.FromResult(predictionEnginePool.Predict(modelName: "SentimentAnalysisModel", input));

app.MapPost("/predict", predictionHandler);

app.Run();

public class ModelInput
{
    public string SentimentText;
}

public class ModelOutput
{
    [ColumnName("PredictedLabel")]
    public bool Sentiment { get; set; }

    public float Probability { get; set; }

    public float Score { get; set; }
}

Тестирование веб-API на локальном компьютере

Завершив настройку параметров, протестируйте приложение:

  1. Запустите приложение.

  2. Откройте PowerShell и введите следующий код, где PORT — это порт, который прослушивается приложением.

    Invoke-RestMethod "https://localhost:<PORT>/predict" -Method Post -Body (@{SentimentText="This was a very bad steak"} | ConvertTo-Json) -ContentType "application/json"
    

    В случае успешного выполнения результат должен выглядеть, как показано ниже:

    sentiment probability score
    --------- ----------- -----
    False         0.5     0
    

Поздравляем! Вы успешно использовали модель для прогнозирования через Интернет с помощью веб-API ASP.NET Core.

Next Steps