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
- A Visual Studio 2022-ben telepítve vannak a .NET asztali fejlesztési és Azure-fejlesztési számítási feladatai. A számítási feladat kiválasztásakor a rendszer automatikusan telepíti a .NET 6 SDK-t.
- Azure Functions Tools
- PowerShell
- Előre betanított modell. Töltse le ezt az előre betanított hangulatelemzési gépi tanulási modellt , vagy használja a ML.NET Hangulatelemzés oktatóanyagot saját modell létrehozásához.
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
A Visual Studio 2022-ben nyissa meg az Új projekt létrehozása párbeszédpanelt.
Az "Új projekt létrehozása" párbeszédpanelen válassza ki az Azure Functions-projektsablont .
A Név szövegmezőbe írja be a "SentimentAnalysisFunctionsApp" kifejezést, és válassza a Tovább gombot.
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.
A Microsoft.ML NuGet-csomag telepítése
- A Megoldáskezelő kattintson a jobb gombbal a projektre, és válassza a NuGet-csomagok kezelése lehetőséget.
- Válassza a "nuget.org" lehetőséget a Csomag forrásaként.
- Válassza a "Tallózás" lapot.
- Keresse meg a Microsoft.ML.
- Jelölje ki a csomagot a listában, és válassza a Telepítés gombot.
- Válassza az OK gombot a Változások előnézete párbeszédpanelen
- 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
- 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.
- Másolja az előre elkészített modellt az MLModels mappába.
- 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:
A Megoldáskezelő kattintson a jobb gombbal a projektre, majd válassza az Új Azure-függvény hozzáadása>lehetőséget.
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.
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 azstatic
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:
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.
A Megoldáskezelő kattintson a jobb gombbal a DataModels könyvtárra, majd válassza az Osztály hozzáadása lehetőséget>.
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; }
A Megoldáskezelő kattintson a jobb gombbal a DataModels könyvtárra, majd válassza az Osztály hozzáadása lehetőséget>.
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őlSentimentData
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 ObjectPool
PredictionEngine
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.
A Megoldáskezelő kattintson a jobb gombbal a projektre, majd válassza az Osztály hozzáadása lehetőséget>.
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.
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;
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 { } }
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;
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"); } }
Ezután adjon hozzá egy új metódust, amely a
Configure
konstruktor alatt regisztrálja aPredictionEnginePool
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:
Az alkalmazás futtatása
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
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: