Nasazení modelu ve webovém rozhraní API ASP.NET Core

Naučte se obsluhovat předem natrénovaný model ML.NET strojového učení na webu pomocí webového rozhraní API ASP.NET Core. Obsluha modelu přes webové rozhraní API umožňuje predikce prostřednictvím standardních metod HTTP.

Požadavky

Vytvoření projektu webového rozhraní API ASP.NET Core

  1. Spusťte Visual Studio 2022 a vyberte Vytvořit nový projekt.

  2. V dialogovém okně Vytvořit nový projekt :

    • Zadejte Web API do vyhledávacího pole.
    • Vyberte šablonu ASP.NET Základní webové rozhraní API a vyberte Další.
  3. V dialogovém okně Konfigurace projektu :

    • Pojmenujte projekt SentimentAnalysisWebAPI.
    • Vyberte Další.
  4. V dialogovém okně Další informace :

    • Zrušte zaškrtnutí políčka Nepoužívat příkazy nejvyšší úrovně.
    • Vyberte Vytvořit.
  5. Nainstalujte následující balíčky NuGet:

    Další podrobnosti o instalaci balíčků NuGet v sadě Visual Studio najdete v průvodci instalací a použitím balíčku NuGet v sadě Visual Studio .

Přidání modelu do projektu webového rozhraní API ASP.NET Core

  1. Zkopírujte předem vytvořený model do adresáře projektu SentimentAnalysisWebAPI .

  2. Nakonfigurujte projekt tak, aby zkopíroval soubor modelu do výstupního adresáře. V Průzkumník řešení:

    • Klikněte pravým tlačítkem myši na soubor ZIP modelu a vyberte Vlastnosti.
    • V části Upřesnit změňte hodnotu kopírovat do výstupního adresáře, pokud je novější.

Vytváření datových modelů

Je potřeba vytvořit některé třídy pro definování schématu vstupu a výstupu modelu.

Poznámka:

Vlastnosti vstupních a výstupních tříd schématu závisí na sloupcích datové sady, které se používají k trénování modelu, a také na úloze strojového učení (regrese, klasifikace atd.).

V souboru Program.cs :

  1. Přidejte následující příkazy using:

    using Microsoft.ML.Data;
    using Microsoft.Extensions.ML;
    
  2. V dolní části souboru přidejte následující třídy:

    Vstup modelu

    Vstup pro tento model obsahuje jednu vlastnost SentimentText , což je řetězec, který představuje komentář uživatele.

    public class ModelInput
    {
        public string SentimentText;
    }
    

    Výstup modelu

    Jakmile model vyhodnotí vstup, vypíše predikci se třemi vlastnostmi: Sentiment, Probabilitya Score. V tomto případě Sentiment se jedná o předpovězené mínění komentáře uživatele a ProbabilityScore míry spolehlivosti pro predikci.

    public class ModelOutput
    {
        [ColumnName("PredictedLabel")]
        public bool Sentiment { get; set; }
    
        public float Probability { get; set; }
    
        public float Score { get; set; }
    }
    

Registrace PredictionEnginePool pro použití v aplikaci

Pokud chcete vytvořit jednu předpověď, musíte vytvořit .PredictionEngine PredictionEngine není bezpečný pro přístup z více vláken. Kromě toho musíte vytvořit instanci všude, kde je potřeba v aplikaci. S rostoucím růstem aplikace se tento proces může stát nespravovatelným. Pro zvýšení výkonu a bezpečnosti vláken použijte kombinaci injektáže závislostí a PredictionEnginePool služby, která vytvoří ObjectPoolPredictionEngine objekty pro použití v celé aplikaci.

Následující odkaz obsahuje další informace, pokud chcete získat další informace o injektáži závislostí v ASP.NET Core.

Do souboru Program.cs přidejte následující kód:

builder.Services.AddPredictionEnginePool<ModelInput, ModelOutput>()
    .FromFile(modelName: "SentimentAnalysisModel", filePath: "sentiment_model.zip", watchForChanges: true);

Na vysoké úrovni tento kód inicializuje objekty a služby automaticky pro pozdější použití v případě, že aplikace vyžaduje, aby ho nemusel ručně provádět.

Modely strojového učení nejsou statické. Jakmile budou k dispozici nová trénovací data, model se znovu natrénuje a znovu nasadí. Jedním ze způsobů, jak do aplikace získat nejnovější verzi modelu, je restartování nebo opětovné nasazení aplikace. To ale představuje výpadek aplikace. Služba PredictionEnginePool poskytuje mechanismus opětovného načtení aktualizovaného modelu bez restartování nebo opětovného nasazení aplikace.

watchForChanges Nastavte parametr na truea PredictionEnginePool spustí, FileSystemWatcher který naslouchá oznámením o změnách systému souborů a vyvolává události, když dojde ke změně souboru. Tím se zobrazí výzva k automatickému opětovnému PredictionEnginePool načtení modelu.

Model je identifikován parametrem modelName , aby při změně bylo možné znovu načíst více než jeden model na aplikaci.

Tip

Alternativně můžete metodu FromUri použít při práci s modely uloženými vzdáleně. Místo sledování událostí FromUri změněných souborů se dotazuje vzdálené umístění na změny. Interval dotazování je ve výchozím nastavení 5 minut. Interval dotazování můžete zvýšit nebo snížit na základě požadavků vaší aplikace. V ukázce kódu níže dotazuje PredictionEnginePool model uložený na zadaném identifikátoru URI každou minutu.

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));

Předpověď koncového bodu mapy

Pokud chcete zpracovat příchozí požadavky HTTP, vytvořte koncový bod.

/ Koncový bod nahraďte následujícím kódem:

var predictionHandler =
    async (PredictionEnginePool<ModelInput, ModelOutput> predictionEnginePool, ModelInput input) =>
        await Task.FromResult(predictionEnginePool.Predict(modelName: "SentimentAnalysisModel", input));

app.MapPost("/predict", predictionHandler);

Koncový /predict bod přijímá požadavky HTTP POST a používá fond prediktivního modulu k vrácení předpovědi pomocí zadaného vstupu.

Po dokončení by váš Program.cs měl vypadat takto:

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; }
}

Místní testování webového rozhraní API

Jakmile je všechno nastavené, je čas aplikaci otestovat.

  1. Aplikaci spusťte.

  2. Otevřete PowerShell a zadejte následující kód, kde PORT je port, na kterém vaše aplikace naslouchá.

    Invoke-RestMethod "https://localhost:<PORT>/predict" -Method Post -Body (@{SentimentText="This was a very bad steak"} | ConvertTo-Json) -ContentType "application/json"
    

    Pokud je výstup úspěšný, měl by vypadat podobně jako v následujícím textu:

    sentiment probability score
    --------- ----------- -----
    False         0.5     0
    

Gratulujeme! Úspěšně jste model obsloužili, abyste pomocí webového rozhraní API ASP.NET Core vytvořili předpovědi přes internet.

Další kroky