Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Megtudhatja, hogyan helyezhet üzembe előre betanított ML.NET gépi tanulási modellt a HTTP-en keresztüli előrejelzésekhez egy Kiszolgáló nélküli Azure Functions-környezetben.
Előfeltételek
- A Visual Studio 2022 vagy újabb verziójában 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 SDK-t.
- Azure Functions Tools
- PowerShell
- Előre betanított modell. Töltse le ezt a előre betanított hangulatelemzési gépi tanulási modellt, vagy használja a ML.NET hangulatelemzési 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 Studióban nyissa meg az Új projekt létrehozása párbeszédpanelt .
Válassza ki az Azure Functions-projektsablont.
A Név szövegmezőbe írja be a "SentimentAnalysisFunctionsApp" szöveget, és válassza a Továbblehetőséget.
A "További információ párbeszédpanelen" hagyja meg az összes alapértelmezett beállítást as-is, és válassza a Létrehozás lehetőséget.
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éslehetőséget.
- 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 összeállított modell mentéséhez: A Megoldáskezelőben kattintson a jobb gombbal a projektre, és válassza a > Új mappa hozzáadásalehetőséget. Írja be az "MLModels" kifejezést, és válassza az Enterlehetőséget.
- Másolja az előre összeállított modellt a MLModels mappába.
- A Megoldáskezelőben kattintson a jobb gombbal az előre összeállított modellfájlra, és válassza a Tulajdonságoklehető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 >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 Add hozzá a-et.
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 válassza OKlehetőséget.
Megnyílik a AnalyzeSentiment.cs fájl a kódszerkesztőben. Adja hozzá a következő
usingirányelvet 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
AnalyzeSentimentkövetkezőstatic: . Távolítsa el a kulcsszót azstaticosztá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 > hozzáadása lehetőséget. Írja be a "DataModels" kifejezést, és válassza a Enterlehetőséget.
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 Add hozzá a-et.
Megnyílik a SentimentData.cs fájl a kódszerkesztőben. Adja hozzá a következő
usingirányelvet 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 Add hozzá a-et. A SentimentPrediction.cs fájl megnyílik a kódszerkesztőben. Adja hozzá a következő
usingirányelvet 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őlSentimentDatahozzáférést biztosít a tulajdonságban lévőSentimentTexteredeti 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.
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 Add hozzá a-et.
Adja hozzá a következő
usingirányelveket a Startup.cs elejéhez: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 az
usingirányelvek 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
Startuposztá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
_environmenta_modelPathvá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
Configurekonstruktor alatt regisztrálja aPredictionEnginePoolszolgá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.