Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Узнайте, как развернуть предварительно обученную модель машинного обучения ML.NET на вебе с помощью ASP.NET Core Web API. Обслуживание модели через веб-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прогнозируемые тональности комментария пользователя и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, которое создает объекты ObjectPool (PredictionEngine) для использования во всем приложении.
См. дополнительные сведения о внедрении зависимостей в 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.