Modell üzembe helyezése egy ASP.NET Core Web API-ban
Megtudhatja, hogyan szolgálhat ki előre betanított ML.NET gépi tanulási modellt a weben egy ASP.NET Core Web API használatával. A modell webes API-val való kiszolgálása szabványos HTTP-metódusokkal teszi lehetővé az előrejelzéseket.
Előfeltételek
- Visual Studio 2022 a ASP.NET és webfejlesztési számítási feladattal.
- PowerShell.
- Előre betanított modell. A ML.NET hangulatelemzési oktatóanyag segítségével saját modellt hozhat létre, vagy letöltheti ezt az előre betanított hangulatelemzési gépi tanulási modellt
ASP.NET Core Web API-projekt létrehozása
Indítsa el a Visual Studio 2022-t, és válassza az Új projekt létrehozása lehetőséget.
Az Új projekt létrehozása párbeszédpanelen:
- Írja be
Web API
a keresőmezőbe. - Válassza ki a ASP.NET Core Web API-sablont, és válassza a Tovább gombot.
- Írja be
A Projekt konfigurálása párbeszédpanelen:
- Nevezze el a projektet SentimentAnalysisWebAPI néven.
- Válassza a Tovább lehetőséget.
A További információ párbeszédpanelen:
- Törölje a jelölés jelölését: Ne használjon felső szintű utasításokat.
- Válassza a Létrehozás lehetőséget.
Telepítse az alábbi NuGet-csomagokat:
A NuGet-csomagok Visual Studióban való telepítéséről további információt a NuGet-csomagok telepítése és használata a Visual Studio útmutatójában talál.
Modell hozzáadása ASP.NET Core Web API-projekthez
Másolja az előre elkészített modellt a SentimentAnalysisWebAPI projektkönyvtárba.
Konfigurálja a projektet úgy, hogy a modellfájlt a kimeneti könyvtárba másolja. A Megoldáskezelő:
- Kattintson a jobb gombbal a modell zip-fá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.
Adatmodellek létrehozása
Létre kell hoznia néhány osztályt a modell bemenetének és kimenetének sémájának meghatározásához.
Feljegyzés
A bemeneti és kimeneti sémaosztályok tulajdonságai a modell betanításához használt adathalmazoszlopoktól, valamint a gépi tanulási feladattól (regresszió, besorolás stb.) függenek.
A Program.cs fájlban:
Adja hozzá a következő
using
irányelveket:using Microsoft.ML.Data; using Microsoft.Extensions.ML;
A fájl alján adja hozzá a következő osztályokat:
Modellbemenet
Ebben a modellben a bemenet egyetlen tulajdonságot
SentimentText
tartalmaz, amely egy felhasználói megjegyzést jelképező sztring.public class ModelInput { public string SentimentText; }
Modell kimenete
Miután a modell kiértékeli a bemenetet, egy előrejelzést ad ki három tulajdonsággal:
Sentiment
,Probability
ésScore
. Ebben az esetben aSentiment
felhasználói megjegyzés előrejelzett hangulata és azProbability
Score
előrejelzés megbízhatósági mértéke.public class ModelOutput { [ColumnName("PredictedLabel")] public bool Sentiment { get; set; } public float Probability { get; set; } public float Score { get; set; } }
PredictionEnginePool regisztrálása az alkalmazásban való használatra
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 ASP.NET Core-ban.
Adja hozzá a következő kódot a Program.cs fájlhoz:
builder.Services.AddPredictionEnginePool<ModelInput, ModelOutput>()
.FromFile(modelName: "SentimentAnalysisModel", filePath: "sentiment_model.zip", 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.
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));
Végpont előrejelzésének leképezése
A bejövő HTTP-kérések feldolgozásához hozzon létre egy végpontot.
Cserélje le a /
végpontot a következőre:
var predictionHandler =
async (PredictionEnginePool<ModelInput, ModelOutput> predictionEnginePool, ModelInput input) =>
await Task.FromResult(predictionEnginePool.Predict(modelName: "SentimentAnalysisModel", input));
app.MapPost("/predict", predictionHandler);
A /predict
végpont elfogadja a HTTP POST-kéréseket, és az előrejelzési motorkészlettel a megadott bemenettel ad vissza előrejelzést.
Ha végzett, a Program.cs a következőnek kell kinéznie:
using Microsoft.ML.Data;
using Microsoft.Extensions.ML;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddPredictionEnginePool<ModelInput, ModelOutput>()
.FromFile(modelName: "SentimentAnalysisModel", filePath: "sentiment_model.zip", watchForChanges: true);
var app = builder.Build();
var predictionHandler =
async (PredictionEnginePool<ModelInput, ModelOutput> predictionEnginePool, ModelInput input) =>
await Task.FromResult(predictionEnginePool.Predict(modelName: "SentimentAnalysisModel", input));
app.MapPost("/predict", predictionHandler);
app.Run();
public class ModelInput
{
public string SentimentText;
}
public class ModelOutput
{
[ColumnName("PredictedLabel")]
public bool Sentiment { get; set; }
public float Probability { get; set; }
public float Score { get; set; }
}
Webes API helyi tesztelése
Miután minden be van állítva, ideje tesztelni az alkalmazást.
Futtassa az alkalmazást.
Nyissa meg a PowerShellt, és írja be a következő kódot, amelyben az alkalmazás által figyelt PORT portot adja meg.
Invoke-RestMethod "https://localhost:<PORT>/predict" -Method Post -Body (@{SentimentText="This was a very bad steak"} | ConvertTo-Json) -ContentType "application/json"
Ha sikeres, a kimenetnek az alábbi szöveghez hasonlóan kell kinéznie:
sentiment probability score --------- ----------- ----- False 0.5 0
Gratulálunk! Sikeresen kiszolgálta a modellt, hogy előrejelzéseket készítsen az interneten egy ASP.NET Core Web API 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: