Bereitstellen eines Modells in einer ASP.NET Core-Web-API
Hier erfahren Sie, wie Sie ein vorab trainiertes ML.NET-Machine Learning-Modell mithilfe einer ASP.NET Core-Web-API im Internet bereitstellen. Das Bereitstellen eines Modells über eine Web-API ermöglicht Vorhersagen über HTTP-Standardmethoden.
Voraussetzungen
- Visual Studio 2022 mit der Workload ASP.NET und Webentwicklung.
- PowerShell.
- Vorab trainiertes Modell. Verwenden Sie das Tutorial für die ML.NET-Standpunktanalyse, um Ihr eigenes Modell zu erstellen, oder laden Sie dieses vorab trainierte Machine Learning-Modell für die Standpunktanalyse herunter.
Erstellen eines ASP.NET Core-Web-API-Projekts
Starten Sie Visual Studio 2022, und wählen Sie Neues Projekt erstellen aus.
Im Dialogfeld Neues Projekt erstellen:
- Geben Sie
Web API
in das Suchfeld ein. - Wählen Sie die ASP.NET Core-Web-API-Vorlage aus, und klicken Sie auf Weiter.
- Geben Sie
Im Dialogfeld Projekt konfigurieren:
- Benennen Sie Ihr Projekt SentimentAnalysisWebAPI.
- Wählen Sie Weiter aus.
Im Dialogfeld Zusätzliche Informationen:
- Deaktivieren Sie Keine Anweisungen der obersten Ebene verwenden.
- Klicken Sie auf Erstellen.
Installieren Sie die folgenden NuGet-Pakete:
Weitere Informationen zum Installieren von NuGet-Paketen in Visual Studio finden Sie im Leitfaden Installieren und Verwenden eines NuGet-Pakets in Visual Studio.
Hinzufügen eines Modells zum ASP.NET Core-Web-API-Projekt
Kopieren Sie Ihr vordefiniertes Modell in Ihr Projektverzeichnis für SentimentAnalysisWebAPI.
Konfigurieren Sie Ihr Projekt so, dass die Modelldatei in das Ausgabeverzeichnis kopiert wird. Im Projektmappen-Explorer:
- Klicken Sie mit der rechten Maustaste auf die ZIP-Datei des Modells, und wählen Sie Eigenschaften aus.
- Ändern Sie unter „Erweitert“ den Wert von „In Ausgabeverzeichnis kopieren“ in Kopieren, wenn neuer.
Erstellen von Datenmodellen
Sie müssen einige Klassen erstellen, um das Schema der Modelleingabe und -ausgabe zu definieren.
Hinweis
Die Eigenschaften Ihrer Eingabe- und Ausgabeschemaklassen hängen von den Datasetspalten ab, die zum Trainieren Ihres Modells sowie für die Aufgabe des maschinellen Lernens (Regression, Klassifizierung usw.) verwendet werden.
In Ihrer Program.cs-Datei:
Fügen Sie die folgenden
using
-Anweisungen hinzu:using Microsoft.ML.Data; using Microsoft.Extensions.ML;
Fügen Sie am Ende der Datei die folgenden Klassen hinzu:
Modelleingabe
Für dieses Modell enthält die Eingabe eine einzelne
SentimentText
-Eigenschaft, eine Zeichenfolge, die einen Benutzerkommentar repräsentiert.public class ModelInput { public string SentimentText; }
Modellausgabe
Nachdem das Modell die Eingabe ausgewertet hat, gibt es eine Vorhersage mit drei Eigenschaften aus:
Sentiment
,Probability
undScore
. In diesem Fall istSentiment
die vorhergesagte Stimmung des Benutzerkommentars, undProbability
undScore
sind Konfidenzmaße für die Vorhersage.public class ModelOutput { [ColumnName("PredictedLabel")] public bool Sentiment { get; set; } public float Probability { get; set; } public float Score { get; set; } }
Registrieren von PredictionEnginePool zur Verwendung in der Anwendung
Um eine einzelne Vorhersage zu treffen, müssen Sie eine PredictionEngine
erstellen. PredictionEngine
ist nicht threadsicher. Außerdem müssen Sie eine Instanz davon überall dort erstellen, wo diese in Ihrer Anwendung erforderlich ist. Wenn die Anwendung wächst, kann dieser Prozess ggf. nicht mehr verwaltet werden. Um eine bessere Leistung und Threadsicherheit zu erzielen, verwenden Sie eine Kombination aus Abhängigkeitsinjektion (Dependency Injection, DI) und dem PredictionEnginePool
-Dienst, der einen ObjectPool
aus PredictionEngine
-Objekten für die Verwendung in Ihrer gesamten Anwendung erstellt.
Unter dem folgenden Link finden Sie weitere Informationen zur Abhängigkeitsinjektion in ASP.NET Core.
Fügen Sie den folgenden Code in Ihre Datei Program.cs ein:
builder.Services.AddPredictionEnginePool<ModelInput, ModelOutput>()
.FromFile(modelName: "SentimentAnalysisModel", filePath: "sentiment_model.zip", watchForChanges: true);
Auf hoher Ebene initialisiert dieser Code die Objekte und Dienste bei Anforderung automatisch für eine spätere Verwendung, sodass dies nicht manuell durchgeführt werden muss.
Machine Learning-Modelle sind nicht statisch. Wenn neue Trainingsdaten verfügbar werden, wird das Modell erneut trainiert und erneut bereitgestellt. Eine Möglichkeit, die neueste Version des Modells in Ihre Anwendung zu integrieren, besteht in der erneuten Bereitstellung der gesamten Anwendung. Dies führt jedoch zu Ausfallzeiten der Anwendung. Der PredictionEnginePool
-Dienst bietet einen Mechanismus zum Nachladen eines aktualisierten Modells, ohne dass Ihre Anwendung neu gestartet oder neu bereitgestellt werden muss.
Legen Sie den watchForChanges
-Parameter auf true
fest. Der PredictionEnginePool
startet dann einen FileSystemWatcher
, der auf Änderungsbenachrichtigungen des Dateisystems lauscht und Ereignisse auslöst, wenn die Datei geändert wird. Dadurch wird der PredictionEnginePool
aufgefordert, das Modell automatisch erneut zu laden.
Das Modell wird durch den Parameter modelName
identifiziert, sodass bei der Änderung mehrere Modelle pro Anwendung erneut geladen werden können.
Tipp
Alternativ können Sie beim Arbeiten mit Modellen, die remote gespeichert sind, die FromUri
-Methode verwenden. Anstatt auf Dateiänderungsereignisse zu warten, fragt FromUri
den Remotespeicherort nach Änderungen ab. Das Abruf Intervall beträgt standardmäßig 5 Minuten. Sie können das Abrufintervall basierend auf den Anforderungen Ihrer Anwendung vergrößern oder verkleinern. Im folgenden Codebeispiel fragt der PredictionEnginePool
das am angegebenen URI gespeicherte Modell jede Minute ab.
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));
Zuordnen des Vorhersageendpunkts
Um die eingehenden HTTP-Anforderungen zu verarbeiten, erstellen Sie einen Endpunkt.
Ersetzen Sie den /
-Endpunkt durch Folgendes:
var predictionHandler =
async (PredictionEnginePool<ModelInput, ModelOutput> predictionEnginePool, ModelInput input) =>
await Task.FromResult(predictionEnginePool.Predict(modelName: "SentimentAnalysisModel", input));
app.MapPost("/predict", predictionHandler);
Der /predict
-Endpunkt akzeptiert HTTP POST-Anforderungen und verwendet den Vorhersage-Engine-Pool, um anhand der bereitgestellten Eingabe eine Vorhersage zurückzugeben.
Wenn Sie fertig sind, sollte Ihr Program.cs-Datei wie folgt aussehen:
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; }
}
Lokales Testen der Web-API
Nachdem alles eingerichtet ist, ist es Zeit, die Anwendung zu testen.
Führen Sie die Anwendung aus.
Öffnen Sie PowerShell, und geben Sie den folgenden Code ein, wobei PORT der Port ist, auf dem Ihre Anwendung lauscht.
Invoke-RestMethod "https://localhost:<PORT>/predict" -Method Post -Body (@{SentimentText="This was a very bad steak"} | ConvertTo-Json) -ContentType "application/json"
Bei erfolgreicher Ausführung sollte die Ausgabe dem folgenden Text ähneln:
sentiment probability score --------- ----------- ----- False 0.5 0
Herzlichen Glückwunsch! Sie haben Ihr Modell erfolgreich bereitgestellt, um mit einer ASP.NET Core-Web-API Vorhersagen über das Internet zu treffen.