Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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 APIdo 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í
usingdirektivy: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,ProbabilityaScore. V tomto případěSentimentse jedná o předpovězené mínění komentáře uživatele aProbabilityScoremí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.
Aplikaci spusťte.
Otevřete PowerShell a zadejte následující kód, kde
PORTje 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.