Nasazení modelu do ASP.NET Core webového rozhraní APIDeploy a model in an ASP.NET Core Web API

Naučte se, jak na webu sloužit předem trained ML.NET model strojového učení, pomocí ASP.NET Core webového rozhraní API.Learn how to serve a pre-trained ML.NET machine learning model on the web using an ASP.NET Core Web API. Obsluha modelu přes webové rozhraní API umožňuje předpovědi prostřednictvím standardních metod HTTP.Serving a model over a web API enables predictions via standard HTTP methods.

PožadavkyPrerequisites

Vytvoření projektu webového rozhraní API ASP.NET CoreCreate ASP.NET Core Web API project

  1. Otevřete Visual Studio 2017.Open Visual Studio 2017. Z řádku nabídek vyberte soubor > nový > projekt .Select File > New > Project from the menu bar. V dialogovém okně Nový projekt vyberte uzel C# vizuálu následovaný webovým uzlem.In the New Project dialog, select the Visual C# node followed by the Web node. Pak vyberte šablonu projektu ASP.NET Core webové aplikace .Then select the ASP.NET Core Web Application project template. Do textového pole název zadejte "SentimentAnalysisWebAPI" a pak vyberte tlačítko OK .In the Name text box, type "SentimentAnalysisWebAPI" and then select the OK button.

  2. V okně, které zobrazuje různé typy ASP.NET Core projektů, vyberte rozhraní API a klikněte na tlačítko OK .In the window that displays the different types of ASP.NET Core Projects, select API and the select the OK button.

  3. Vytvořte ve svém projektu adresář s názvem MLModels a uložte předem sestavené soubory modelu Machine Learning:Create a directory named MLModels in your project to save your pre-built machine learning model files:

    V Průzkumník řešení klikněte pravým tlačítkem myši na projekt a vyberte Přidat > Nová složka.In Solution Explorer, right-click on your project and select Add > New Folder. Zadejte "MLModels" a stiskněte klávesu ENTER.Type "MLModels" and hit Enter.

  4. Nainstalujte balíček NuGet Microsoft.ml:Install the Microsoft.ML NuGet Package:

    V Průzkumník řešení klikněte pravým tlačítkem na projekt a vyberte Spravovat balíčky NuGet.In Solution Explorer, right-click on your project and select Manage NuGet Packages. Jako zdroj balíčku zvolte "nuget.org", vyberte kartu Procházet, vyhledejte Microsoft.ml, vyberte tento balíček v seznamu a klikněte na tlačítko nainstalovat.Choose "nuget.org" as the Package source, select the Browse tab, search for Microsoft.ML, select that package in the list, and select the Install button. Pokud souhlasíte s licenčními podmínkami pro uvedené balíčky, klikněte na tlačítko OK v dialogovém okně Náhled změn a potom v dialogovém okně pro přijetí licence vyberte tlačítko přijmout .Select the OK button on the Preview Changes dialog and then select the I Accept button on the License Acceptance dialog if you agree with the license terms for the packages listed.

  5. Nainstalujte balíček Nuget Microsoft.Extensions.ml:Install the Microsoft.Extensions.ML Nuget Package:

    V Průzkumník řešení klikněte pravým tlačítkem na projekt a vyberte Spravovat balíčky NuGet.In Solution Explorer, right-click on your project and select Manage NuGet Packages. Jako zdroj balíčku zvolte "nuget.org", vyberte kartu Procházet, vyhledejte Microsoft.Extensions.ml, vyberte tento balíček v seznamu a klikněte na tlačítko nainstalovat.Choose "nuget.org" as the Package source, select the Browse tab, search for Microsoft.Extensions.ML, select that package in the list, and select the Install button. Pokud souhlasíte s licenčními podmínkami pro uvedené balíčky, klikněte na tlačítko OK v dialogovém okně Náhled změn a potom v dialogovém okně pro přijetí licence vyberte tlačítko přijmout .Select the OK button on the Preview Changes dialog and then select the I Accept button on the License Acceptance dialog if you agree with the license terms for the packages listed.

Přidání modelu do ASP.NET Core projektu webového rozhraní APIAdd model to ASP.NET Core Web API project

  1. Zkopírování předem připraveného modelu do adresáře MLModelsCopy your pre-built model to the MLModels directory
  2. V Průzkumník řešení klikněte pravým tlačítkem na soubor zip modelu a vyberte vlastnosti.In Solution Explorer, right-click the model zip file and select Properties. V části Upřesnit změňte hodnotu kopírovat do výstupního adresáře na kopírovat, pokud je novější.Under Advanced, change the value of Copy to Output Directory to Copy if newer.

Vytváření datových modelůCreate data models

Musíte vytvořit některé třídy pro vstupní data a předpovědi.You need to create some classes for your input data and predictions. Přidejte do projektu novou třídu:Add a new class to your project:

  1. Vytvořte v projektu adresář s názvem Datamodels pro uložení datových modelů:Create a directory named DataModels in your project to save your data models:

    V Průzkumník řešení klikněte pravým tlačítkem myši na projekt a vyberte Přidat > Nová složka.In Solution Explorer, right-click on your project and select Add > New Folder. Zadejte "datamodels" a stiskněte ENTER.Type "DataModels" and hit Enter.

  2. V Průzkumník řešení klikněte pravým tlačítkem na adresář Datamodels a pak vyberte Přidat > nová položka.In Solution Explorer, right-click the DataModels directory, and then select Add > New Item.

  3. V dialogovém okně Přidat novou položku vyberte třída a změňte pole název na SentimentData.cs.In the Add New Item dialog box, select Class and change the Name field to SentimentData.cs. Pak vyberte tlačítko Přidat .Then, select the Add button. V editoru kódu se otevře soubor SentimentData.cs .The SentimentData.cs file opens in the code editor. Do horní části SentimentData.cspřidejte následující příkaz using:Add the following using statement to the top of SentimentData.cs:

    using Microsoft.ML.Data;
    

    Odeberte existující definici třídy a přidejte následující kód do souboru SentimentData.cs :Remove the existing class definition and add the following code to the SentimentData.cs file:

    public class SentimentData
    {
        [LoadColumn(0)]
        public string SentimentText;
    
        [LoadColumn(1)]
        [ColumnName("Label")]
        public bool Sentiment;
    }
    
  4. V Průzkumník řešení klikněte pravým tlačítkem na adresář Datamodels a pak vyberte Přidat > Nová položka.In Solution Explorer, right-click the DataModels directory, and then select Add > New Item.

  5. V dialogovém okně Přidat novou položku vyberte třída a změňte pole název na SentimentPrediction.cs.In the Add New Item dialog box, select Class and change the Name field to SentimentPrediction.cs. Pak vyberte tlačítko Přidat.Then, select the Add button. V editoru kódu se otevře soubor SentimentPrediction.cs .The SentimentPrediction.cs file opens in the code editor. Do horní části SentimentPrediction.cspřidejte následující příkaz using:Add the following using statement to the top of SentimentPrediction.cs:

    using Microsoft.ML.Data;
    

    Odeberte existující definici třídy a přidejte následující kód do souboru SentimentPrediction.cs :Remove the existing class definition and add the following code to the SentimentPrediction.cs file:

    public class SentimentPrediction : SentimentData
    {
    
        [ColumnName("PredictedLabel")]
        public bool Prediction { get; set; }
    
        public float Probability { get; set; }
    
        public float Score { get; set; }
    }
    

    SentimentPrediction dědí z SentimentData.SentimentPrediction inherits from SentimentData. To usnadňuje zobrazení původních dat ve vlastnosti SentimentText spolu s výstupem generovaným modelem.This makes it easier to see the original data in the SentimentText property along with the output generated by the model.

Registrovat PredictionEnginePool pro použití v aplikaciRegister PredictionEnginePool for use in the application

Chcete-li udělat jednu předpověď, je nutné vytvořit PredictionEngine.To make a single prediction, you have to create a PredictionEngine. PredictionEngine není bezpečná pro přístup z více vláken.PredictionEngine is not thread-safe. Kromě toho musíte vytvořit instanci, která je všude, kde je to potřeba v rámci vaší aplikace.Additionally, you have to create an instance of it everywhere it is needed within your application. Jak vaše aplikace roste, tento proces může být nespravovatelný.As your application grows, this process can become unmanageable. Pro zlepšení výkonu a zabezpečení vlákna použijte kombinaci injektáže a PredictionEnginePool, která vytvoří ObjectPool objektů PredictionEngine pro použití v celé aplikaci.For improved performance and thread safety, use a combination of dependency injection and the PredictionEnginePool service, which creates an ObjectPool of PredictionEngine objects for use throughout your application.

Následující odkaz poskytuje další informace, pokud se chcete dozvědět víc o vkládání závislostí v ASP.NET Core.The following link provides more information if you want to learn more about dependency injection in ASP.NET Core.

  1. Otevřete třídu Startup.cs a na začátek souboru přidejte následující příkaz using:Open the Startup.cs class and add the following using statement to the top of the file:

    using Microsoft.AspNetCore.Builder;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.ML;
    using SentimentAnalysisWebAPI.DataModels;
    
  2. Do metody ConfigureServices přidejte následující kód:Add the following code to the ConfigureServices method:

    services.AddPredictionEnginePool<SentimentData, SentimentPrediction>()
        .FromFile(modelName: "SentimentAnalysisModel", filePath:"MLModels/sentiment_model.zip", watchForChanges: true);
    

Na vysoké úrovni tento kód automaticky inicializuje objekty a služby pro pozdější použití v případě, že je aplikace požaduje místo ručního provedení.At a high level, this code initializes the objects and services automatically for later use when requested by the application instead of having to manually do it.

Modely strojového učení nejsou statické.Machine learning models are not static. Jakmile budou k dispozici nová školicí data, model se přeškolí a znovu nasadí.As new training data becomes available, the model is retrained and redeployed. Jedním ze způsobů, jak získat nejnovější verzi modelu do vaší aplikace, je znovu nasadit celou aplikaci.One way to get the latest version of the model into your application is to redeploy the entire application. Tím se ale zavádí výpadek aplikace.However, this introduces application downtime. Služba PredictionEnginePool poskytuje mechanismus pro opětovné načtení aktualizovaného modelu bez nutnosti pořizovat aplikaci.The PredictionEnginePool service provides a mechanism to reload an updated model without taking your application down.

Nastavte parametr watchForChanges na true a PredictionEnginePool spustí FileSystemWatcher , které naslouchají oznámením o změnách systému souborů a vyvolává události, když dojde ke změně souboru.Set the watchForChanges parameter to true, and the PredictionEnginePool starts a FileSystemWatcher that listens to the file system change notifications and raises events when there is a change to the file. Tím se zobrazí výzva PredictionEnginePool pro automatické opětovné načtení modelu.This prompts the PredictionEnginePool to automatically reload the model.

Model je identifikován parametrem modelName, aby bylo při změně možné znovu načíst více než jeden model na aplikaci.The model is identified by the modelName parameter so that more than one model per application can be reloaded upon change.

Tip

Alternativně můžete použít metodu FromUri při práci s místně uloženými modely.Alternatively, you can use the FromUri method when working with models stored remotely. Místo sledování událostí změněných souborů FromUri se dotazuje na vzdálené umístění pro změny.Rather than watching for file changed events, FromUri polls the remote location for changes. Interval dotazování je ve výchozím nastavení nastaven na 5 minut.The polling interval defaults to 5 minutes. Interval dotazování můžete zvýšit nebo snížit na základě požadavků vaší aplikace.You can increase or decrease the polling interval based on your application's requirements. V níže uvedeném příkladu kódu PredictionEnginePool cyklické dotazování modelu uloženého v zadaném identifikátoru URI každou minutu.In the code sample below, the PredictionEnginePool polls the model stored at the specified URI every minute.

services.AddPredictionEnginePool<SentimentData, SentimentPrediction>()
  .FromUri(
      modelName: "SentimentAnalysisModel",
      uri:"https://github.com/dotnet/samples/raw/master/machine-learning/models/sentimentanalysis/sentiment_model.zip",
      period: TimeSpan.FromMinutes(1));

Vytvořit kontroler předpovědiCreate Predict controller

Pokud chcete zpracovat příchozí požadavky HTTP, vytvořte kontroler.To process your incoming HTTP requests, create a controller.

  1. V Průzkumník řešení klikněte pravým tlačítkem na adresář řadiče a pak vyberte Přidat > kontroler.In Solution Explorer, right-click the Controllers directory, and then select Add > Controller.

  2. V dialogovém okně Přidat novou položku vyberte možnost kontroler rozhraní API prázdné a vyberte Přidat.In the Add New Item dialog box, select API Controller Empty and select Add.

  3. V příkazovém řádku změňte pole název kontroleru na PredictController.cs.In the prompt change the Controller Name field to PredictController.cs. Pak vyberte tlačítko Přidat.Then, select the Add button. V editoru kódu se otevře soubor PredictController.cs .The PredictController.cs file opens in the code editor. Do horní části PredictController.cspřidejte následující příkaz using:Add the following using statement to the top of PredictController.cs:

    using System;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.Extensions.ML;
    using SentimentAnalysisWebAPI.DataModels;
    

    Odeberte existující definici třídy a přidejte následující kód do souboru PredictController.cs :Remove the existing class definition and add the following code to the PredictController.cs file:

    public class PredictController : ControllerBase
    {
        private readonly PredictionEnginePool<SentimentData, SentimentPrediction> _predictionEnginePool;
    
        public PredictController(PredictionEnginePool<SentimentData,SentimentPrediction> predictionEnginePool)
        {
            _predictionEnginePool = predictionEnginePool;
        }
    
        [HttpPost]
        public ActionResult<string> Post([FromBody] SentimentData input)
        {
            if(!ModelState.IsValid)
            {
                return BadRequest();
            }
    
            SentimentPrediction prediction = _predictionEnginePool.Predict(modelName: "SentimentAnalysisModel", example: input);
    
            string sentiment = Convert.ToBoolean(prediction.Prediction) ? "Positive" : "Negative";
    
            return Ok(sentiment);
        }
    }
    

Tento kód přiřadí PredictionEnginePool předáním do konstruktoru kontroleru, který získáte prostřednictvím vkládání závislostí.This code assigns the PredictionEnginePool by passing it to the controller's constructor which you get via dependency injection. Pak metoda Post řadiče Predict používá PredictionEnginePool k vytvoření předpovědi pomocí SentimentAnalysisModel registrovaného ve třídě Startup a vrátí výsledky zpátky uživateli, pokud je úspěšný.Then, the Predict controller's Post method uses the PredictionEnginePool to make predictions using the SentimentAnalysisModel registered in the Startup class and returns the results back to the user if successful.

Místní testování webového rozhraní APITest web API locally

Jakmile je všechno nastavené, je čas otestovat aplikaci.Once everything is set up, it's time to test the application.

  1. Spusťte aplikaci.Run the application.

  2. Otevřete PowerShell a zadejte následující kód, kde PORT je port, na kterém naslouchá vaše aplikace.Open Powershell and enter the following code where PORT is the port your application is listening on.

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

    V případě úspěchu by měl výstup vypadat podobně jako v následujícím textu:If successful, the output should look similar to the text below:

    Negative
    

Blahopřejeme!Congratulations! Úspěšně jste zasloužili vašemu modelu, aby se předpovědi přes Internet pomocí webového rozhraní API ASP.NET Core.You have successfully served your model to make predictions over the internet using an ASP.NET Core Web API.

Další krokyNext Steps