Nasazení modelu do Azure Functions
Zjistěte, jak nasadit předem natrénovaný model ML.NET strojového učení pro predikce přes PROTOKOL HTTP prostřednictvím bezserverového prostředí Azure Functions.
Požadavky
- Visual Studio 2022 s nainstalovanými úlohami vývoje desktopových aplikací .NET a vývojovými úlohami Azure Sada .NET 6 SDK se automaticky nainstaluje při výběru této úlohy.
- Nástroje Azure Functions
- PowerShell
- Předem natrénovaný model. Stáhněte si tento předem natrénovaný model analýzy mínění nebo použijte kurz analýzy mínění ML.NET k vytvoření vlastního modelu.
Přehled ukázek služby Azure Functions
Tato ukázka je aplikace Azure Functions triggeru HTTP jazyka C#, která používá předtrénovaný binární klasifikační model k kategorizaci mínění textu jako kladné nebo záporné. Azure Functions poskytuje snadný způsob, jak spustit malé části kódu ve velkém měřítku ve spravovaném bezserverovém prostředí v cloudu. Kód pro tuto ukázku najdete v úložišti dotnet/machinelearning-samples na GitHubu.
Vytvoření projektu Azure Functions
V sadě Visual Studio 2022 otevřete dialogové okno Vytvořit nový projekt .
V dialogovém okně Vytvořit nový projekt vyberte šablonu projektu Azure Functions .
Do textového pole Název zadejte "SentimentAnalysisFunctionsApp" a vyberte tlačítko Další .
V dialogovém okně Další informace ponechte všechny výchozí hodnoty tak, jak jsou, a vyberte tlačítko Vytvořit .
Instalace balíčku NuGet Microsoft.ML
- V Průzkumník řešení klikněte pravým tlačítkem na projekt a vyberte Spravovat balíčky NuGet.
- Jako zdroj balíčku zvolte nuget.org.
- Vyberte kartu Procházet.
- Vyhledejte Microsoft.ML.
- Vyberte tento balíček v seznamu a vyberte tlačítko Instalovat .
- Výběr tlačítka OK v dialogovém okně Náhled změn
- Pokud souhlasíte s licenčními podmínkami pro uvedené balíčky, vyberte v dialogovém okně Přijetí licence tlačítko Přijmout.
Stejným postupem nainstalujte balíčky NuGet Microsoft.Extensions.ML, Microsoft.Extensions.DependencyInjection a Microsoft.Azure.Functions.Extensions .
Přidání předem natrénovaného modelu do projektu
- Vytvořte v projektu adresář s názvem MLModels, abyste uložili předpřipravený model: V Průzkumník řešení klikněte pravým tlačítkem myši na projekt a vyberte Přidat > novou složku. Zadejte "MLModels" a stiskněte Enter.
- Zkopírujte předem vytvořený model do složky MLModels .
- V Průzkumník řešení klikněte pravým tlačítkem na předem vytvořený soubor modelu a vyberte Vlastnosti. V části Upřesnit změňte hodnotu kopírovat do výstupního adresáře , pokud je novější.
Vytvoření funkce Azure Functions pro analýzu mínění
Vytvořte třídu pro předpověď mínění. Přidejte do projektu novou třídu:
V Průzkumník řešení klikněte pravým tlačítkem myši na projekt a pak vyberte Přidat>novou funkci Azure Functions.
V dialogovém okně Přidat novou položku vyberte Funkci Azure a změňte pole Název na AnalyzeSentiment.cs. Pak vyberte tlačítko Přidat .
V dialogovém okně Nová funkce Azure Functions vyberte Trigger HTTP a v rozevíracím seznamu Úroveň autorizace zvolte Anonymní . Pak vyberte tlačítko OK .
Soubor AnalyzeSentiment.cs se otevře v editoru kódu. Na začátek AnalyzeSentiment.cs přidejte následující
using
direktivu:using System; using System.IO; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.Azure.WebJobs; using Microsoft.Azure.WebJobs.Extensions.Http; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using Microsoft.Extensions.ML; using SentimentAnalysisFunctionsApp.DataModels;
Ve výchozím nastavení
AnalyzeSentiment
jestatic
třída . Nezapomeňte odebratstatic
klíčové slovo z definice třídy.public class AnalyzeSentiment { }
Vytváření datových modelů
Potřebujete vytvořit některé třídy pro vstupní data a předpovědi. Přidejte do projektu novou třídu:
Vytvořte v projektu adresář s názvem DataModels pro uložení datových modelů: V Průzkumník řešení klikněte pravým tlačítkem na projekt a vyberte Přidat > novou složku. Zadejte DataModels a stiskněte Enter.
V Průzkumník řešení klikněte pravým tlačítkem myši na adresář DataModels a pak vyberte Přidat > třídu.
V dialogovém okně Přidat novou položku vyberte Třídu a změňte pole Název na SentimentData.cs. Pak vyberte tlačítko Přidat .
Soubor SentimentData.cs se otevře v editoru kódu. Na začátek SentimentData.cs přidejte následující
using
direktivu:using Microsoft.ML.Data;
Odeberte existující definici třídy a do souboru SentimentData.cs přidejte následující kód:
public class SentimentData { [LoadColumn(0)] public string SentimentText; [LoadColumn(1)] [ColumnName("Label")] public bool Sentiment; }
V Průzkumník řešení klikněte pravým tlačítkem myši na adresář DataModels a pak vyberte Přidat > třídu.
V dialogovém okně Přidat novou položku vyberte Třídu a změňte pole Název na SentimentPrediction.cs. Pak vyberte tlačítko Přidat . Soubor SentimentPrediction.cs se otevře v editoru kódu. Na začátek SentimentPrediction.cs přidejte následující
using
direktivu:using Microsoft.ML.Data;
Odeberte existující definici třídy a do souboru SentimentPrediction.cs přidejte následující kód:
public class SentimentPrediction : SentimentData { [ColumnName("PredictedLabel")] public bool Prediction { get; set; } public float Probability { get; set; } public float Score { get; set; } }
SentimentPrediction
dědí z toho, zeSentimentData
kterého poskytuje přístup k původním datům veSentimentText
vlastnosti a výstup vygenerovaný modelem.
Registrace služby PredictionEnginePool
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 Průzkumník řešení klikněte pravým tlačítkem myši na projekt a pak vyberte Přidat>třídu.
V dialogovém okně Přidat novou položku vyberte Třída a změňte pole Název na Startup.cs. Pak vyberte tlačítko Přidat .
Na začátek Startup.cs přidejte následující
using
direktivy:using Microsoft.Azure.Functions.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.ML; using SentimentAnalysisFunctionsApp; using SentimentAnalysisFunctionsApp.DataModels; using System.IO; using System;
Odeberte existující kód pod direktivy
using
a přidejte následující kód:[assembly: FunctionsStartup(typeof(Startup))] namespace SentimentAnalysisFunctionsApp { public class Startup : FunctionsStartup { } }
Definujte proměnné pro uložení prostředí, ve kterém je aplikace spuštěná, a cestu k souboru, ve které se model nachází uvnitř
Startup
třídy.private readonly string _environment; private readonly string _modelPath;
Pod tím vytvořte konstruktor pro nastavení hodnot
_environment
a_modelPath
proměnných. Když je aplikace spuštěná místně, výchozí prostředí je Vývoj.public Startup() { _environment = Environment.GetEnvironmentVariable("AZURE_FUNCTIONS_ENVIRONMENT"); if (_environment == "Development") { _modelPath = Path.Combine("MLModels", "sentiment_model.zip"); } else { string deploymentPath = @"D:\home\site\wwwroot\"; _modelPath = Path.Combine(deploymentPath, "MLModels", "sentiment_model.zip"); } }
Pak přidejte novou metodu volanou
Configure
pro registraciPredictionEnginePool
služby pod konstruktor.public override void Configure(IFunctionsHostBuilder builder) { builder.Services.AddPredictionEnginePool<SentimentData, SentimentPrediction>() .FromFile(modelName: "SentimentAnalysisModel", filePath: _modelPath, 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.
builder.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));
Načtení modelu do funkce
Do třídy AnalyzeSentiment vložte následující kód:
public AnalyzeSentiment(PredictionEnginePool<SentimentData, SentimentPrediction> predictionEnginePool)
{
_predictionEnginePool = predictionEnginePool;
}
Tento kód přiřadí PredictionEnginePool
ho předáním konstruktoru funkce, který získáte prostřednictvím injektáže závislostí.
Použití modelu k předpovědím
Nahraďte existující implementaci metody Run ve třídě AnalyzeSentiment následujícím kódem:
public async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = null)] HttpRequest req,
ILogger log)
{
log.LogInformation("C# HTTP trigger function processed a request.");
// Parse HTTP Request Body
string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
SentimentData data = JsonConvert.DeserializeObject<SentimentData>(requestBody);
//Make Prediction
SentimentPrediction prediction = _predictionEnginePool.Predict(modelName: "SentimentAnalysisModel", example: data);
//Convert prediction to string
string sentiment = Convert.ToBoolean(prediction.Prediction) ? "Positive" : "Negative";
//Return Prediction
return new OkObjectResult(sentiment);
}
Run
Při spuštění metody jsou příchozí data z požadavku HTTP deserializována a použita jako vstup pro PredictionEnginePool
. Metoda Predict
je pak volána k provedení predikcí pomocí SentimentAnalysisModel
registrované ve Startup
třídě a vrátí výsledky zpět uživateli v případě úspěchu.
Místní testování
Teď, když je všechno nastavené, je čas aplikaci otestovat:
Spuštění aplikace
Otevřete PowerShell a zadejte kód do výzvy, kde port je port, na kterém je spuštěná vaše aplikace. Obvykle je port 7071.
Invoke-RestMethod "http://localhost:<PORT>/api/AnalyzeSentiment" -Method Post -Body (@{SentimentText="This is 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:
Negative
Gratulujeme! Úspěšně jste model obsloužili, abyste pomocí funkce Azure Functions vytvořili předpovědi přes internet.