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
- Sada Visual Studio 2022 se sadou funkcí Vývoj pro ASP.NET a web
- PowerShell.
- Předem natrénovaný model. Pomocí kurzu ML.NET Analýza mínění sestavte vlastní model nebo si stáhněte tento předem natrénovaný model analýzy mínění.
Vytvoření projektu webového rozhraní API ASP.NET Core
Spusťte Visual Studio 2022 a vyberte Vytvořit nový projekt.
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ší.
- Zadejte
V dialogovém okně Konfigurace projektu :
- Pojmenujte projekt SentimentAnalysisWebAPI.
- Vyberte Další.
V dialogovém okně Další informace :
- Zrušte zaškrtnutí políčka Nepoužívat příkazy nejvyšší úrovně.
- Vyberte Vytvořit.
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
Zkopírujte předem vytvořený model do adresáře projektu SentimentAnalysisWeb API.
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 :
Přidejte následující
using
direktivy:using Microsoft.ML.Data; using Microsoft.Extensions.ML;
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
,Probability
aScore
. V tomto případěSentiment
se jedná o předpovězené mínění komentáře uživatele aProbability
Score
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ří ObjectPool
PredictionEngine
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 true
a 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.
Aplikaci spusťte.
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 pro ASP.NET Core provedli predikce přes internet.