Een model implementeren in een ASP.NET Core Web-API

Meer informatie over het leveren van een vooraf getraind ML.NET machine learning-model op internet met behulp van een ASP.NET Core-web-API. Het leveren van een model via een web-API maakt voorspellingen mogelijk via standaard HTTP-methoden.

Vereisten

ASP.NET Core Web API-project maken

  1. Start Visual Studio 2022 en selecteer Een nieuw project maken.

  2. In het dialoogvenster Een nieuw project maken:

    • Voer Web API in het zoekvak in.
    • Selecteer de ASP.NET Core Web API-sjabloon en selecteer Volgende.
  3. In het dialoogvenster Uw project configureren:

    • Geef uw project de naam SentimentAnalysisWebAPI.
    • Selecteer Volgende.
  4. In het dialoogvenster Aanvullende informatie :

    • Schakel het selectievakje Geen instructies op het hoogste niveau gebruiken uit.
    • Selecteer Maken.
  5. Installeer de volgende NuGet-pakketten:

    Zie de handleiding NuGet installeren en gebruiken in Visual Studio voor meer informatie over het installeren van NuGet-pakketten in Visual Studio .

Model toevoegen aan ASP.NET Core Web API-project

  1. Kopieer uw vooraf gebouwde model naar de projectmap SentimentAnalysisWebAPI .

  2. Configureer uw project om het modelbestand naar de uitvoermap te kopiëren. In Solution Explorer:

    • Klik met de rechtermuisknop op het zip-bestand van het model en selecteer Eigenschappen.
    • Wijzig onder Geavanceerd de waarde van Kopiëren naar Uitvoermap om te kopiëren als nieuwer.

Gegevensmodellen maken

U moet een aantal klassen maken om het schema van uw modelinvoer en -uitvoer te definiëren.

Notitie

De eigenschappen van uw invoer- en uitvoerschemaklassen zijn afhankelijk van de gegevenssetkolommen die worden gebruikt om uw model te trainen, evenals de machine learning-taak (regressie, classificatie, enzovoort).

In het Program.cs-bestand :

  1. Voeg het volgende toe met behulp van instructies:

    using Microsoft.ML.Data;
    using Microsoft.Extensions.ML;
    
  2. Voeg onder aan het bestand de volgende klassen toe:

    Modelinvoer

    Voor dit model bevat de invoer één eigenschap SentimentText die een tekenreeks is die een opmerking van een gebruiker vertegenwoordigt.

    public class ModelInput
    {
        public string SentimentText;
    }
    

    Modeluitvoer

    Zodra het model de invoer evalueert, wordt er een voorspelling uitgevoerd met drie eigenschappen: Sentiment, Probabilityen Score. In dit geval is het Sentiment voorspelde gevoel van de opmerking van de gebruiker en de Probability betrouwbaarheidsmetingen Score voor de voorspelling.

    public class ModelOutput
    {
        [ColumnName("PredictedLabel")]
        public bool Sentiment { get; set; }
    
        public float Probability { get; set; }
    
        public float Score { get; set; }
    }
    

PredictionEnginePool registreren voor gebruik in de toepassing

Als u één voorspelling wilt doen, moet u een PredictionEngine. PredictionEngine is niet thread-safe. Daarnaast moet u overal een exemplaar van het exemplaar maken dat nodig is in uw toepassing. Naarmate uw toepassing groeit, kan dit proces onbeheerbaar worden. Gebruik voor betere prestaties en threadveiligheid een combinatie van afhankelijkheidsinjectie en de PredictionEnginePool service, waarmee een ObjectPool van PredictionEngine de objecten wordt gemaakt voor gebruik in uw toepassing.

De volgende koppeling bevat meer informatie als u meer wilt weten over afhankelijkheidsinjectie in ASP.NET Core.

Voeg de volgende code toe aan uw Program.cs-bestand :

builder.Services.AddPredictionEnginePool<ModelInput, ModelOutput>()
    .FromFile(modelName: "SentimentAnalysisModel", filePath: "sentiment_model.zip", watchForChanges: true);

Op hoog niveau initialiseert deze code de objecten en services automatisch voor later gebruik wanneer deze door de toepassing worden aangevraagd, in plaats van dit handmatig te doen.

Machine learning-modellen zijn niet statisch. Naarmate er nieuwe trainingsgegevens beschikbaar komen, wordt het model opnieuw getraind en opnieuw geïmplementeerd. Een manier om de nieuwste versie van het model in uw toepassing op te halen, is door uw toepassing opnieuw te starten of opnieuw te implementeren. Dit introduceert echter downtime van toepassingen. De PredictionEnginePool service biedt een mechanisme voor het opnieuw laden van een bijgewerkt model zonder uw toepassing opnieuw te starten of opnieuw te implementeren.

Stel de watchForChanges parameter in op true, en de PredictionEnginePool start een FileSystemWatcher die luistert naar de meldingen van het bestandssysteemwijziging en gebeurtenissen genereert wanneer er een wijziging in het bestand is. Hiermee wordt gevraagd PredictionEnginePool het model automatisch opnieuw te laden.

Het model wordt geïdentificeerd door de modelName parameter, zodat meer dan één model per toepassing opnieuw kan worden geladen bij wijziging.

Tip

U kunt ook de methode gebruiken bij het FromUri werken met modellen die extern zijn opgeslagen. In plaats van te kijken naar gewijzigde gebeurtenissen van bestanden, FromUri wordt de externe locatie gecontroleerd op wijzigingen. Het polling-interval wordt standaard ingesteld op 5 minuten. U kunt het polling-interval verhogen of verlagen op basis van de vereisten van uw toepassing. In het onderstaande codevoorbeeld wordt het PredictionEnginePool model elke minuut opgeslagen op de opgegeven URI gepeild.

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));

Eindpunt voor kaartvoorspelling

Als u uw binnenkomende HTTP-aanvragen wilt verwerken, maakt u een eindpunt.

Vervang het / eindpunt door het volgende:

var predictionHandler =
    async (PredictionEnginePool<ModelInput, ModelOutput> predictionEnginePool, ModelInput input) =>
        await Task.FromResult(predictionEnginePool.Predict(modelName: "SentimentAnalysisModel", input));

app.MapPost("/predict", predictionHandler);

Het /predict eindpunt accepteert HTTP POST-aanvragen en gebruikt de pool van de voorspellingsengine om een voorspelling te retourneren met behulp van de opgegeven invoer.

Wanneer u klaar bent, ziet uw Program.cs er als volgt uit:

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; }
}

Web-API lokaal testen

Zodra alles is ingesteld, is het tijd om de toepassing te testen.

  1. Voer de toepassing uit.

  2. Open PowerShell en voer de volgende code in waarbij PORT de poort is waarop uw toepassing luistert.

    Invoke-RestMethod "https://localhost:<PORT>/predict" -Method Post -Body (@{SentimentText="This was a very bad steak"} | ConvertTo-Json) -ContentType "application/json"
    

    Als dit lukt, moet de uitvoer er ongeveer uitzien als in de onderstaande tekst:

    sentiment probability score
    --------- ----------- -----
    False         0.5     0
    

Gefeliciteerd U hebt uw model geleverd om voorspellingen te doen via internet met behulp van een ASP.NET Core Web-API.

Volgende stappen