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 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 vagy újabbASP.NET és webfejlesztési munkafolyamattal.
- 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 a 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 Studió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 APIa 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 összeállított modellt a SentimentAnalysisWebAPI projektkönyvtárába.
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ő
usingirá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
SentimentTexttartalmaz, 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 aSentimentfelhasználói megjegyzés előrejelzett hangulata és azProbabilityScoreelő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 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 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, ahol
PORTaz alkalmazás által figyelt port.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 elérhetővé tette a modelljét az interneten, hogy előrejelzéseket készíthessen egy ASP.NET Core Web API használatával.