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

Erstellen eines ASP.NET Core-Web-API-Projekts

  1. Starten Sie Visual Studio 2022, und wählen Sie Neues Projekt erstellen aus.

  2. 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.
  3. Im Dialogfeld Projekt konfigurieren:

    • Benennen Sie Ihr Projekt SentimentAnalysisWebAPI.
    • Wählen Sie Weiter aus.
  4. Im Dialogfeld Zusätzliche Informationen:

    • Deaktivieren Sie Keine Anweisungen der obersten Ebene verwenden.
    • Klicken Sie auf Erstellen.
  5. 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

  1. Kopieren Sie Ihr vordefiniertes Modell in Ihr Projektverzeichnis für SentimentAnalysisWebAPI.

  2. 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:

  1. Fügen Sie die folgenden using-Anweisungen hinzu:

    using Microsoft.ML.Data;
    using Microsoft.Extensions.ML;
    
  2. 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 und Score. In diesem Fall ist Sentiment die vorhergesagte Stimmung des Benutzerkommentars, und Probability und Score 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.

  1. Führen Sie die Anwendung aus.

  2. Ö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.

Nächste Schritte