Развертывание модели в веб-API ASP.NET Core
Узнайте, как использовать предварительно обученную модель машинного обучения ML.NET через интернет с помощью веб-API ASP.NET Core. Обслуживание модели через веб-API позволяет формировать прогнозы с помощью стандартных методов HTTP.
Необходимые компоненты
- Visual Studio 2022 с рабочей нагрузкой ASP.NET и веб-разработка.
- PowerShell.
- Предварительно обученная модель. Используйте учебник по анализу тональности ML.NET, чтобы создать собственную модель, или скачайте эту предварительно обученную модель машинного обучения для анализа тональности
Создание проекта веб-API ASP.NET Core
Запустите Visual Studio 2022 и нажмите Создать проект.
В диалоговом окне Создание нового проекта выполните следующие действия.
- Введите
Web API
в поле поиска. - Выберите шаблон Веб-API ASP.NET Core и нажмите кнопку Далее.
- Введите
В диалоговом окне настройки проекта:
- Назовите проект SentimentAnalysisWebAPI.
- Выберите Далее.
В диалоговом окне Дополнительные сведения выполните следующие действия.
- Снимите флажок Не использовать операторы верхнего уровня.
- Нажмите кнопку создания.
Установите следующие пакеты NuGet:
Дополнительные сведения об установке пакетов NuGet в Visual Studio см . в руководстве по установке и использованию пакета NuGet в Visual Studio .
Добавление модели в проект веб-API ASP.NET Core
Скопируйте предварительно созданную модель в каталог проекта SentimentAnalysisWebAPI .
Настройте проект для копирования файла модели в выходной каталог. В Обозреватель решений:
- Щелкните правой кнопкой мыши ZIP-файл модели и выберите "Свойства".
- В разделе "Дополнительно" измените значение копирования в выходной каталог, чтобы скопировать, если это еще больше.
Создание моделей данных
Чтобы определить схему входных и выходных данных модели, необходимо создать некоторые классы.
Примечание.
Свойства классов входных и выходных схем зависят от столбцов набора данных, используемых для обучения модели, а также задачи машинного обучения (регрессия, классификация и т. д.).
В файле Program.cs:
Затем добавьте следующие
using
директивы:using Microsoft.ML.Data; using Microsoft.Extensions.ML;
В нижней части файла добавьте следующие классы:
Входные данные модели
Для этой модели входные данные содержат одно свойство
SentimentText
, представляющее комментарий пользователя.public class ModelInput { public string SentimentText; }
Выходные данные модели
После оценки входных данных модель выводит прогноз с тремя свойствами:
Sentiment
,Probability
иScore
. В этом случаеSentiment
прогнозируемые тональности комментария пользователя иProbability
Score
меры доверия для прогнозирования.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 на локальном компьютере
Завершив настройку параметров, протестируйте приложение:
Запустите приложение.
Откройте 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.