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

ASP.NET Core Web API-projekt létrehozása

  1. Indítsa el a Visual Studio 2022-t, és válassza az Új projekt létrehozása lehetőséget.

  2. 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.
  3. A Projekt konfigurálása párbeszédpanelen:

    • Nevezze el a projektet SentimentAnalysisWebAPI néven.
    • Válassza a Tovább lehetőséget.
  4. 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.
  5. 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

  1. Másolja az előre elkészített modellt a SentimentAnalysisWebAPI projektkönyvtárba.

  2. 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:

  1. Adja hozzá a következő using utasításokat:

    using Microsoft.ML.Data;
    using Microsoft.Extensions.ML;
    
  2. 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és Score. Ebben az esetben a Sentiment felhasználói megjegyzés előrejelzett hangulata és az ProbabilityScore 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 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.

  1. Futtassa az alkalmazást.

  2. 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