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

  1. V sadě Visual Studio 2022 otevřete dialogové okno Vytvořit nový projekt .

  2. V dialogovém okně Vytvořit nový projekt vyberte šablonu projektu Azure Functions .

  3. Do textového pole Název zadejte "SentimentAnalysisFunctionsApp" a vyberte tlačítko Další .

  4. V dialogovém okně Další informace ponechte všechny výchozí hodnoty tak, jak jsou, a vyberte tlačítko Vytvořit .

  5. Instalace balíčku NuGet Microsoft.ML

    1. V Průzkumník řešení klikněte pravým tlačítkem na projekt a vyberte Spravovat balíčky NuGet.
    2. Jako zdroj balíčku zvolte nuget.org.
    3. Vyberte kartu Procházet.
    4. Vyhledejte Microsoft.ML.
    5. Vyberte tento balíček v seznamu a vyberte tlačítko Instalovat .
    6. Výběr tlačítka OK v dialogovém okně Náhled změn
    7. 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

  1. 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.
  2. Zkopírujte předem vytvořený model do složky MLModels .
  3. 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:

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

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

  3. 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 příkaz:

    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 je statictřída . Nezapomeňte odebrat static 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:

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

  2. V Průzkumník řešení klikněte pravým tlačítkem myši na adresář DataModels a pak vyberte Přidat > třídu.

  3. 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í příkaz using:

    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;
    }
    
  4. V Průzkumník řešení klikněte pravým tlačítkem myši na adresář DataModels a pak vyberte Přidat > třídu.

  5. 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í příkaz using:

    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, ze SentimentData kterého poskytuje přístup k původním datům ve SentimentText 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ří 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í.

  1. V Průzkumník řešení klikněte pravým tlačítkem myši na projekt a pak vyberte Přidat>třídu.

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

  3. Na začátek Startup.cs přidejte následující příkazy using:

    using Microsoft.Azure.Functions.Extensions.DependencyInjection;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.ML;
    using SentimentAnalysisFunctionsApp;
    using SentimentAnalysisFunctionsApp.DataModels;
    using System.IO;
    using System;
    
  4. Odeberte existující kód pod příkazy using a přidejte následující kód:

    [assembly: FunctionsStartup(typeof(Startup))]
    namespace SentimentAnalysisFunctionsApp
    {
        public class Startup : FunctionsStartup
        {
    
        }
    }
    
  5. 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;
    
  6. 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");
        }
    }
    
  7. Pak přidejte novou metodu volanou Configure pro registraci PredictionEnginePool 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 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.

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:

  1. Spuštění aplikace

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

Další kroky