Modell üzembe helyezése az Azure Functionsben

Megtudhatja, hogyan helyezhet üzembe előre betanított ML.NET gépi tanulási modellt a HTTP-en keresztüli előrejelzésekhez egy Azure Functions kiszolgáló nélküli környezetben.

Előfeltételek

Az Azure Functions-minta áttekintése

Ez a minta egy C# HTTP Trigger Azure Functions-alkalmazás , amely egy előre betanított bináris besorolási modellt használ a szöveg hangulatának pozitív vagy negatív besorolásához. Az Azure Functions segítségével egyszerűen futtathat kisebb kódrészleteket nagy méretekben egy felügyelt kiszolgáló nélküli környezetben a felhőben. A minta kódja a GitHub dotnet/machinelearning-samples adattárában található.

Azure Functions-projekt létrehozása

  1. A Visual Studio 2022-ben nyissa meg az Új projekt létrehozása párbeszédpanelt.

  2. Az "Új projekt létrehozása" párbeszédpanelen válassza ki az Azure Functions-projektsablont .

  3. A Név szövegmezőbe írja be a "SentimentAnalysisFunctionsApp" kifejezést, és válassza a Tovább gombot.

  4. A "További információ párbeszédpanelen" hagyja meg az összes alapértelmezett beállítást, és válassza a Létrehozás gombot.

  5. A Microsoft.ML NuGet-csomag telepítése

    1. A Megoldáskezelő kattintson a jobb gombbal a projektre, és válassza a NuGet-csomagok kezelése lehetőséget.
    2. Válassza a "nuget.org" lehetőséget a Csomag forrásaként.
    3. Válassza a "Tallózás" lapot.
    4. Keresse meg a Microsoft.ML.
    5. Jelölje ki a csomagot a listában, és válassza a Telepítés gombot.
    6. Válassza az OK gombot a Változások előnézete párbeszédpanelen
    7. Ha elfogadja a felsorolt csomagok licencfeltételét, válassza az Elfogadom gombot a Licenc elfogadása párbeszédpanelen.

    Ugyanezeket a lépéseket követve telepítse a Microsoft.Extensions.ML, a Microsoft.Extensions.DependencyInjection és a Microsoft.Azure.Functions.Extensions NuGet csomagokat.

Előre betanított modell hozzáadása a projekthez

  1. Hozzon létre egy MLModels nevű könyvtárat a projektben az előre elkészített modell mentéséhez: A Megoldáskezelő kattintson a jobb gombbal a projektre, és válassza az Új mappa hozzáadása > lehetőséget. Írja be az "MLModels" kifejezést, és nyomja le az Enter billentyűt.
  2. Másolja az előre elkészített modellt az MLModels mappába.
  3. Az Megoldáskezelő kattintson a jobb gombbal az előre elkészített modellfájlra, és válassza a Tulajdonságok lehetőséget. A Speciális területen módosítsa a Másolás kimeneti könyvtárra értékét másolásra, ha újabb.

Azure-függvény létrehozása a hangulat elemzéséhez

Hozzon létre egy osztályt a hangulat előrejelzéséhez. Adjon hozzá egy új osztályt a projekthez:

  1. A Megoldáskezelő kattintson a jobb gombbal a projektre, majd válassza az Új Azure-függvény hozzáadása>lehetőséget.

  2. Az Új elem hozzáadása párbeszédpanelen válassza az Azure-függvényt, és módosítsa a Név mezőt AnalyzeSentiment.cs. Ezután válassza a Hozzáadás gombot.

  3. Az Új Azure-függvény párbeszédpanelen válassza a Http-eseményindító lehetőséget, majd az Engedélyezési szint legördülő menüBen válassza a Névtelen lehetőséget. Ezután kattintson az OK gombra.

    Megnyílik a AnalyzeSentiment.cs fájl a kódszerkesztőben. Adja hozzá a következő using utasítást a AnalyzeSentiment.cs elejéhez:

    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;
    

    Alapértelmezés szerint az osztály a AnalyzeSentiment következő static: . Távolítsa el a kulcsszót az static osztálydefinícióból.

    public class AnalyzeSentiment
    {
    
    }
    

Adatmodellek létrehozása

Létre kell hoznia néhány osztályt a bemeneti adatokhoz és az előrejelzésekhez. Adjon hozzá egy új osztályt a projekthez:

  1. Hozzon létre egy DataModels nevű könyvtárat a projektben az adatmodellek mentéséhez: A Megoldáskezelő kattintson a jobb gombbal a projektre, és válassza az Új mappa hozzáadása > lehetőséget. Írja be a "DataModels" kifejezést, és nyomja le az Enter billentyűt.

  2. A Megoldáskezelő kattintson a jobb gombbal a DataModels könyvtárra, majd válassza az Osztály hozzáadása lehetőséget>.

  3. Az Új elem hozzáadása párbeszédpanelen válassza az Osztály lehetőséget, és módosítsa a Név mezőt SentimentData.cs. Ezután válassza a Hozzáadás gombot.

    Megnyílik a SentimentData.cs fájl a kódszerkesztőben. Adja hozzá a következő utasítást a SentimentData.cs elejéhez:

    using Microsoft.ML.Data;
    

    Távolítsa el a meglévő osztálydefiníciót, és adja hozzá a következő kódot a SentimentData.cs fájlhoz:

    public class SentimentData
    {
        [LoadColumn(0)]
        public string SentimentText;
    
        [LoadColumn(1)]
        [ColumnName("Label")]
        public bool Sentiment;
    }
    
  4. A Megoldáskezelő kattintson a jobb gombbal a DataModels könyvtárra, majd válassza az Osztály hozzáadása lehetőséget>.

  5. Az Új elem hozzáadása párbeszédpanelen válassza az Osztály lehetőséget, és módosítsa a Név mezőt SentimentPrediction.cs. Ezután válassza a Hozzáadás gombot. A SentimentPrediction.cs fájl megnyílik a kódszerkesztőben. Adja hozzá a következő utasítást a SentimentPrediction.cs elejéhez:

    using Microsoft.ML.Data;
    

    Távolítsa el a meglévő osztálydefiníciót, és adja hozzá a következő kódot a SentimentPrediction.cs fájlhoz:

    public class SentimentPrediction : SentimentData
    {
    
        [ColumnName("PredictedLabel")]
        public bool Prediction { get; set; }
    
        public float Probability { get; set; }
    
        public float Score { get; set; }
    }
    

    SentimentPrediction örökli, amelyből SentimentData hozzáférést biztosít a tulajdonságban lévő SentimentText eredeti adatokhoz, valamint a modell által létrehozott kimenethez.

PredictionEnginePool szolgáltatás regisztrálása

Egyetlen előrejelzés létrehozásához létre kell hoznia egy PredictionEngine. PredictionEngine nincs szálbiztos. Emellett mindenhol létre kell hoznia egy példányt, amire szükség van az alkalmazásban. Az alkalmazás növekedésével ez a folyamat kezelhetetlenné válhat. A jobb teljesítmény és a szálbiztonság érdekében használja a függőséginjektálás és a PredictionEnginePool szolgáltatás kombinációját, amely objektumokat hoz létre ObjectPoolPredictionEngine az alkalmazás teljes területén való használatra.

Az alábbi hivatkozás további információt nyújt, ha többet szeretne megtudni a függőséginjektálásról.

  1. A Megoldáskezelő kattintson a jobb gombbal a projektre, majd válassza az Osztály hozzáadása lehetőséget>.

  2. Az Új elem hozzáadása párbeszédpanelen válassza az Osztály lehetőséget, és módosítsa a Név mezőt Startup.cs. Ezután válassza a Hozzáadás gombot.

  3. Adja hozzá a következő utasításokat a Startup.cs tetejére:

    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. Távolítsa el a meglévő kódot a felhasználói utasítások alatt, és adja hozzá a következő kódot:

    [assembly: FunctionsStartup(typeof(Startup))]
    namespace SentimentAnalysisFunctionsApp
    {
        public class Startup : FunctionsStartup
        {
    
        }
    }
    
  5. Változók definiálása az alkalmazás által futtatott környezet tárolásához, valamint annak a fájlútvonalnak a meghatározása, amelyben a modell az Startup osztályon belül található

    private readonly string _environment;
    private readonly string _modelPath;
    
  6. Az alábbiakban hozzon létre egy konstruktort a változók és _modelPath a _environment változók értékeinek beállításához. Ha az alkalmazás helyileg fut, az alapértelmezett környezet a Fejlesztés.

    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. Ezután adjon hozzá egy új metódust, amely a Configure konstruktor alatt regisztrálja a PredictionEnginePool szolgáltatást.

    public override void Configure(IFunctionsHostBuilder builder)
    {
        builder.Services.AddPredictionEnginePool<SentimentData, SentimentPrediction>()
            .FromFile(modelName: "SentimentAnalysisModel", filePath: _modelPath, watchForChanges: true);
    }
    

Magas szinten ez a kód automatikusan inicializálja az objektumokat és szolgáltatásokat későbbi használatra, amikor az alkalmazás kéri ahelyett, hogy manuálisan kellene elvégeznie.

A gépi tanulási modellek nem statikusak. Az új betanítási adatok elérhetővé válásával a modell újratanítása és ismételt üzembe helyezése történik. A modell legújabb verziójának az alkalmazásba való beolvasásának egyik módja az alkalmazás újraindítása vagy ismételt üzembe helyezése. Ez azonban alkalmazás állásidőt vezet be. A PredictionEnginePool szolgáltatás egy mechanizmust biztosít a frissített modellek újratöltésére az alkalmazás újraindítása vagy ismételt üzembe helyezése nélkül.

Állítsa a watchForChanges paramétert a következőre true, és a PredictionEnginePool rendszer a FileSystemWatcher fájlrendszer változásértesítéseit figyeli, és eseményeket hoz létre a fájl módosításakor. Ez kéri a PredictionEnginePool modell automatikus újratöltését.

A paraméter azonosítja a modelName modellt, így alkalmazásonként több modell is betölthető a módosítás után.

Tipp.

Azt is megteheti, hogy távolról FromUri tárolt modellekkel dolgozik. A fájlmódosítási események FromUri figyelése helyett a távoli helyet kérdezi le a módosításokról. A lekérdezési időköz alapértelmezés szerint 5 perc. Az alkalmazás követelményeinek megfelelően növelheti vagy csökkentheti a lekérdezési időközt. Az alábbi kódmintában a PredictionEnginePool rendszer percenként lekérdezi a megadott URI-n tárolt modellt.

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

A modell betöltése a függvénybe

Szúrja be a következő kódot az AnalyzeSentiment osztályba :

public AnalyzeSentiment(PredictionEnginePool<SentimentData, SentimentPrediction> predictionEnginePool)
{
    _predictionEnginePool = predictionEnginePool;
}

Ez a kód hozzárendeli a PredictionEnginePool függvény konstruktorához, amelyet függőséginjektálással kap.

Előrejelzések készítése a modell használatával

Cserélje le a Run metódus meglévő implementációját az AnalyzeSentiment osztályban a következő kódra:

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 A metódus végrehajtásakor a HTTP-kérelemből érkező bejövő adatok deszerializálva lesznek, és bemenetként szolgálnak a PredictionEnginePool. Ezt Predict követően a rendszer meghívja az előrejelzést az SentimentAnalysisModel osztályban Startup regisztráltak alapján, és ha sikeres, visszaadja az eredményeket a felhasználónak.

Helyi tesztelés

Most, hogy minden be van állítva, ideje tesztelni az alkalmazást:

  1. Az alkalmazás futtatása

  2. Nyissa meg a PowerShellt, és írja be a kódot abba a kérdésbe, amelyen az alkalmazás portja fut. A port általában 7071.

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

    Ha sikeres, a kimenetnek az alábbi szöveghez hasonlóan kell kinéznie:

    Negative
    

Gratulálunk! Sikeresen kiszolgálta a modellt, hogy előrejelzéseket készítsen az interneten egy Azure-függvény használatával.

Következő lépések