Udostępnij za pośrednictwem


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

Tworzenie projektu internetowego interfejsu API platformy ASP.NET Core

  1. Uruchom program Visual Studio 2022 i wybierz pozycję Utwórz nowy projekt.

  2. 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.
  3. W oknie dialogowym Konfigurowanie projektu:

    • Nadaj projektowi nazwę SentimentAnalysisWebAPI.
    • Wybierz Dalej.
  4. W oknie dialogowym Dodatkowe informacje:

    • Usuń zaznaczenie pola wyboru Nie używaj instrukcji najwyższego poziomu.
    • Wybierz pozycję Utwórz.
  5. 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

  1. Skopiuj wstępnie utworzony model do katalogu projektu SentimentAnalysisWebAPI .

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

  1. Dodaj następujące using dyrektywy:

    using Microsoft.ML.Data;
    using Microsoft.Extensions.ML;
    
  2. 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, Probabilityi Score. W tym przypadku Sentiment jest to przewidywana tonacja komentarza użytkownika, a Probability wartości i Score 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 ObjectPoolPredictionEngine 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 truewartość , 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ę.

  1. Uruchom aplikację.

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

Następne kroki