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
- Visual Studio 2022 met de workload ASP.NET en webontwikkeling.
- PowerShell.
- Vooraf getraind model. Gebruik de zelfstudie ML.NET Sentimentanalyse om uw eigen model te bouwen of dit vooraf getraind machine learning-model voor sentimentanalyse te downloaden
ASP.NET Core Web API-project maken
Start Visual Studio 2022 en selecteer Een nieuw project maken.
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.
- Voer
In het dialoogvenster Uw project configureren:
- Geef uw project de naam SentimentAnalysisWebAPI.
- Selecteer Volgende.
In het dialoogvenster Aanvullende informatie :
- Schakel het selectievakje Geen instructies op het hoogste niveau gebruiken uit.
- Selecteer Maken.
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
Kopieer uw vooraf samengestelde model naar uw SentimentAnalysisWebAPI projectmap.
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 :
Voeg de volgende
using
-instructies toe:using Microsoft.ML.Data; using Microsoft.Extensions.ML;
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
,Probability
enScore
. In dit geval is hetSentiment
voorspelde gevoel van de opmerking van de gebruiker en deProbability
betrouwbaarheidsmetingenScore
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.
Voer de toepassing uit.
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.