Wdrażanie modelu w internetowym interfejsie API platformy ASP.NET Core
Dowiedz się, jak obsługiwać wstępnie wytrenowany model uczenia maszynowego ML.NET w Internecie przy użyciu internetowego interfejsu API platformy ASP.NET Core. Obsługa modelu za pośrednictwem internetowego interfejsu API umożliwia przewidywanie za pośrednictwem standardowych metod HTTP.
Wymagania wstępne
- Program Visual Studio 2022 z pakietem roboczym tworzenia aplikacji ASP.NET i aplikacji internetowych.
- Program PowerShell.
- Wstępnie wytrenowany model. Skorzystaj z samouczka analizy tonacji ML.NET, aby utworzyć własny model lub pobrać wstępnie wytrenowany model uczenia maszynowego analizy tonacji
Tworzenie projektu internetowego interfejsu API platformy ASP.NET Core
Uruchom program Visual Studio 2022 i wybierz pozycję Utwórz nowy projekt.
W oknie dialogowym Tworzenie nowego projektu:
- Wprowadź
Web API
w polu wyszukiwania. - Wybierz szablon internetowego interfejsu API platformy ASP.NET Core i wybierz pozycję Dalej.
- Wprowadź
W oknie dialogowym Konfigurowanie projektu:
- Nadaj projektowi nazwę SentimentAnalysisWebAPI.
- Wybierz Dalej.
W oknie dialogowym Dodatkowe informacje:
- Usuń zaznaczenie pola wyboru Nie używaj instrukcji najwyższego poziomu.
- Wybierz pozycję Utwórz.
Zainstaluj następujące pakiety NuGet:
Aby uzyskać więcej informacji na temat instalowania pakietów NuGet w programie Visual Studio, zobacz Przewodnik Instalowanie i używanie pakietu NuGet w programie Visual Studio .
Dodawanie modelu do projektu internetowego interfejsu API platformy ASP.NET Core
Skopiuj wstępnie utworzony model do katalogu projektu SentimentAnalysisWebAPI .
Skonfiguruj projekt, aby skopiować plik modelu do katalogu wyjściowego. W Eksplorator rozwiązań:
- Kliknij prawym przyciskiem myszy plik zip modelu i wybierz polecenie Właściwości.
- W obszarze Zaawansowane zmień wartość kopiuj do katalogu wyjściowego, aby skopiować , jeśli jest nowsza.
Tworzenie modeli danych
Aby zdefiniować schemat danych wejściowych i wyjściowych modelu, należy utworzyć kilka klas.
Uwaga
Właściwości klas schematów wejściowych i wyjściowych zależą od kolumn zestawu danych używanych do trenowania modelu, a także zadania uczenia maszynowego (regresja, klasyfikacja itp.).
W pliku Program.cs:
Dodaj następujące
using
dyrektywy:using Microsoft.ML.Data; using Microsoft.Extensions.ML;
W dolnej części pliku dodaj następujące klasy:
Dane wejściowe modelu
W przypadku tego modelu dane wejściowe zawierają jedną właściwość
SentimentText
, która jest ciągiem reprezentującym komentarz użytkownika.public class ModelInput { public string SentimentText; }
Dane wyjściowe modelu
Po obliczeniu danych wejściowych model generuje przewidywanie z trzema właściwościami:
Sentiment
,Probability
iScore
. W tym przypadkuSentiment
jest to przewidywana tonacja komentarza użytkownika, aProbability
wartości iScore
są miarami ufności przewidywania.public class ModelOutput { [ColumnName("PredictedLabel")] public bool Sentiment { get; set; } public float Probability { get; set; } public float Score { get; set; } }
Rejestrowanie puli PredictionEnginePool do użycia w aplikacji
Aby utworzyć pojedyncze przewidywanie, musisz utworzyć element PredictionEngine
. PredictionEngine
nie jest bezpieczny wątkowo. Ponadto należy utworzyć wystąpienie wszędzie tam, gdzie jest potrzebne w aplikacji. W miarę rozwoju aplikacji ten proces może stać się niezarządzany. W celu zwiększenia wydajności i bezpieczeństwa wątków należy użyć kombinacji wstrzykiwania zależności i PredictionEnginePool
usługi, która tworzy ObjectPool
PredictionEngine
obiekty do użytku w całej aplikacji.
Poniższy link zawiera więcej informacji, jeśli chcesz dowiedzieć się więcej o iniekcji zależności w programie ASP.NET Core.
Dodaj następujący kod do pliku Program.cs :
builder.Services.AddPredictionEnginePool<ModelInput, ModelOutput>()
.FromFile(modelName: "SentimentAnalysisModel", filePath: "sentiment_model.zip", watchForChanges: true);
Na wysokim poziomie ten kod inicjuje obiekty i usługi automatycznie do późniejszego użycia w przypadku żądania przez aplikację zamiast konieczności ręcznego wykonania.
Modele uczenia maszynowego nie są statyczne. Gdy nowe dane szkoleniowe staną się dostępne, model jest ponownie trenowany i wdrażany ponownie. Jednym ze sposobów pobrania najnowszej wersji modelu do aplikacji jest ponowne uruchomienie lub ponowne wdrożenie aplikacji. Jednak powoduje to przestój aplikacji. Usługa PredictionEnginePool
udostępnia mechanizm ponownego ładowania zaktualizowanego modelu bez ponownego uruchamiania lub ponownego wdrażania aplikacji.
watchForChanges
Ustaw parametr na true
wartość , a PredictionEnginePool
parametr uruchamia FileSystemWatcher
element , który nasłuchuje powiadomień o zmianie systemu plików i zgłasza zdarzenia w przypadku zmiany pliku. Spowoduje to wyświetlenie monitu o PredictionEnginePool
automatyczne ponowne załadowanie modelu.
Model jest identyfikowany przez modelName
parametr, aby można było ponownie załadować więcej niż jeden model na aplikację po zmianie.
Napiwek
Alternatywnie można użyć FromUri
metody podczas pracy z modelami przechowywanymi zdalnie. Zamiast obserwować zdarzenia zmienionego pliku, FromUri
sonduje zdalną lokalizację pod kątem zmian. Interwał sondowania domyślnie to 5 minut. Możesz zwiększyć lub zmniejszyć interwał sondowania na podstawie wymagań aplikacji. W poniższym PredictionEnginePool
przykładzie kodu sonduje model przechowywany w określonym identyfikatorze URI co minutę.
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));
Mapuj przewidywanie punktu końcowego
Aby przetworzyć przychodzące żądania HTTP, utwórz punkt końcowy.
Zastąp /
punkt końcowy następującym kodem:
var predictionHandler =
async (PredictionEnginePool<ModelInput, ModelOutput> predictionEnginePool, ModelInput input) =>
await Task.FromResult(predictionEnginePool.Predict(modelName: "SentimentAnalysisModel", input));
app.MapPost("/predict", predictionHandler);
Punkt /predict
końcowy akceptuje żądania HTTP POST i używa puli aparatów przewidywania do zwrócenia przewidywania przy użyciu podanych danych wejściowych.
Po zakończeniu Program.cs powinny wyglądać następująco:
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; }
}
Lokalne testowanie internetowego interfejsu API
Po skonfigurowaniu wszystkich elementów należy przetestować aplikację.
Uruchom aplikację.
Otwórz program PowerShell i wprowadź następujący kod, w którym port to port, na którym nasłuchuje aplikacja.
Invoke-RestMethod "https://localhost:<PORT>/predict" -Method Post -Body (@{SentimentText="This was a very bad steak"} | ConvertTo-Json) -ContentType "application/json"
W przypadku powodzenia dane wyjściowe powinny wyglądać podobnie do poniższego tekstu:
sentiment probability score --------- ----------- ----- False 0.5 0
Gratulacje! Model został pomyślnie obsłużyny w celu przewidywania za pośrednictwem Internetu przy użyciu internetowego interfejsu API platformy ASP.NET Core.