Implantar um modelo no Azure FunctionsDeploy a model to Azure Functions

Saiba como implantar um modelo de machine learning do ML.NET pré-treinado para previsões por HTTP por meio de um ambiente sem servidor do Azure Functions.Learn how to deploy a pre-trained ML.NET machine learning model for predictions over HTTP through an Azure Functions serverless environment.

Observação

Este exemplo executa uma versão de visualização do PredictionEnginePool serviço.This sample runs a preview version of the PredictionEnginePool service.

Pré-requisitosPrerequisites

Visão geral de Azure Functions de exemploAzure Functions sample overview

Este exemplo é um gatilho http C# Azure Functions aplicativo que usa um modelo de classificação binária pretreinado para categorizar a notação de texto como positivo ou negativo.This sample is a C# HTTP Trigger Azure Functions application that uses a pretrained binary classification model to categorize the sentiment of text as positive or negative. Azure Functions fornece uma maneira fácil de executar pequenas partes de código em escala em um ambiente gerenciado sem servidor na nuvem.Azure Functions provides an easy way to run small pieces of code at scale on a managed serverless environment in the cloud. O código para este exemplo pode ser encontrado no repositório dotnet/MachineLearning-Samples no github.The code for this sample can be found on the dotnet/machinelearning-samples repository on GitHub.

Criar um projeto do Azure FunctionsCreate Azure Functions project

  1. Abra o Visual Studio 2017.Open Visual Studio 2017. Selecione arquivo > novo > projeto na barra de menus.Select File > New > Project from the menu bar. Na caixa de diálogo Novo projeto, selecione o nó Visual C# seguido pelo nó Nuvem.In the New Project dialog, select the Visual C# node followed by the Cloud node. Em seguida, selecione o modelo de projeto do Azure Functions.Then select the Azure Functions project template. Na caixa de texto Nome, digite "SentimentAnalysisFunctionsApp" e, em seguida, selecione o botão OK.In the Name text box, type "SentimentAnalysisFunctionsApp" and then select the OK button.

  2. Na caixa de diálogo Novo Projeto, abra a lista suspensa acima das opções de projeto e selecione Azure Functions v2 (.NET Core).In the New Project dialog, open the dropdown above the project options and select Azure Functions v2 (.NET Core). Depois, selecione o projeto de Gatilho de HTTP e, em seguida, o botão OK.Then, select the Http trigger project and then select the OK button.

  3. Crie um diretório chamado MLModels em seu projeto para salvar o modelo:Create a directory named MLModels in your project to save your model:

    No Gerenciador de Soluções, clique com o botão direito do mouse no seu projeto e selecione Adicionar > Nova Pasta.In Solution Explorer, right-click on your project and select Add > New Folder. Digite "MLModels" e pressione ENTER.Type "MLModels" and hit Enter.

  4. Instale o pacote Microsoft.ml NuGet versão 1.3.1:Install the Microsoft.ML NuGet Package version 1.3.1:

    No Gerenciador de Soluções, clique com o botão direito do mouse no seu projeto e selecione Gerenciar Pacotes NuGet.In Solution Explorer, right-click on your project and select Manage NuGet Packages. Escolha "nuget.org" como a Origem do pacote, selecione a guia Procurar, pesquise por Microsoft.ML, selecione o pacote na lista e escolha o botão Instalar.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. Selecione o botão OK na caixa de diálogo Visualizar Alterações e selecione o botão Aceito na caixa de diálogo Aceitação da Licença, se concordar com o termos de licença para os pacotes listados.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. Instale o Pacote NuGet Microsoft.Azure.Functions.Extensions:Install the Microsoft.Azure.Functions.Extensions NuGet Package:

    No Gerenciador de Soluções, clique com o botão direito do mouse no seu projeto e selecione Gerenciar Pacotes NuGet.In Solution Explorer, right-click on your project and select Manage NuGet Packages. Escolha "nuget.org" como a origem do pacote, selecione a guia Procurar, procure por Microsoft.Azure.Functions.Extensions, selecione o pacote na lista e selecione o botão Instalar.Choose "nuget.org" as the Package source, select the Browse tab, search for Microsoft.Azure.Functions.Extensions, select that package in the list, and select the Install button. Selecione o botão OK na caixa de diálogo Visualizar Alterações e selecione o botão Aceito na caixa de diálogo Aceitação da Licença, se concordar com o termos de licença para os pacotes listados.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.

  6. Instale o pacote Microsoft.Extensions.ml NuGet versão 0.15.1:Install the Microsoft.Extensions.ML NuGet Package version 0.15.1:

    No Gerenciador de Soluções, clique com o botão direito do mouse no seu projeto e selecione Gerenciar Pacotes NuGet.In Solution Explorer, right-click on your project and select Manage NuGet Packages. Escolha "nuget.org" como a origem do pacote, selecione a guia procurar, procure Microsoft.Extensions.ml, selecione o pacote na lista e selecione o botão instalar .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. Selecione o botão OK na caixa de diálogo Visualizar Alterações e selecione o botão Aceito na caixa de diálogo Aceitação da Licença, se concordar com o termos de licença para os pacotes listados.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.

  7. Instale a versão 1.0.31 do pacote NUGET Microsoft. net. Sdk. Functions :Install the Microsoft.NET.Sdk.Functions NuGet Package version 1.0.31:

    No Gerenciador de Soluções, clique com o botão direito do mouse no seu projeto e selecione Gerenciar Pacotes NuGet.In Solution Explorer, right-click on your project and select Manage NuGet Packages. Escolha "nuget.org" como a origem do pacote, selecione a guia instalado, pesquise por Microsoft. net. Sdk. Functions, selecione esse pacote na lista, selecione 1.0.31 no menu suspenso versão e selecione o botão Atualizar .Choose "nuget.org" as the Package source, select the Installed tab, search for Microsoft.NET.Sdk.Functions, select that package in the list, select 1.0.31 from the Version dropdown, and select the Update button. Selecione o botão OK na caixa de diálogo Visualizar Alterações e selecione o botão Aceito na caixa de diálogo Aceitação da Licença, se concordar com o termos de licença para os pacotes listados.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.

Adicionar modelo pré-treinado ao projetoAdd pre-trained model to project

  1. Copie o modelo previamente criado para o diretório MLModels.Copy your pre-built model to the MLModels folder.
  2. No Gerenciador de Soluções, clique com o botão direito do mouse no arquivo do modelo criado previamente e selecione Propriedades.In Solution Explorer, right-click your pre-built model file and select Properties. Em avançado, altere o valor de copiar para diretório de saída para copiar se mais recente.Under Advanced, change the value of Copy to Output Directory to Copy if newer.

Criar Função do Azure para analisar o sentimentoCreate Azure Function to analyze sentiment

Crie uma classe para prever o sentimento.Create a class to predict sentiment. Adicione uma nova classe ao seu projeto:Add a new class to your project:

  1. No Gerenciador de Soluções, clique com o botão direito do mouse no projeto e selecione Adicionar > Novo Item.In Solution Explorer, right-click the project, and then select Add > New Item.

  2. Na caixa de diálogo Adicionar novo item, selecione Função do Azure e altere o campo Nome para AnalyzeSentiment.cs.In the Add New Item dialog box, select Azure Function and change the Name field to AnalyzeSentiment.cs. Em seguida, selecione o botão Adicionar.Then, select the Add button.

  3. Na caixa de diálogo Nova Função do Azure, selecione Gatilho de HTTP.In the New Azure Function dialog box, select Http Trigger. Depois, selecione o botão OK.Then, select the OK button.

    O arquivo AnalyzeSentiment.cs é aberto no editor de códigos.The AnalyzeSentiment.cs file opens in the code editor. Adicione a seguinte instrução using acima de AnalyzeSentiment.cs:Add the following using statement to the top of AnalyzeSentiment.cs:

    using System;
    using System.IO;
    using System.Threading.Tasks;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.Azure.WebJobs;
    using Microsoft.Azure.WebJobs.Extensions.Http;
    using Microsoft.AspNetCore.Http;
    using Microsoft.Extensions.Logging;
    using Newtonsoft.Json;
    using Microsoft.Extensions.ML;
    using SentimentAnalysisFunctionsApp.DataModels;
    

    Por padrão, a classe AnalyzeSentiment é static.By default, the AnalyzeSentiment class is static. Remova a palavra-chave static da definição da classe.Make sure to remove the static keyword from the class definition.

    public class AnalyzeSentiment
    {
    
    }
    

Criar modelo de dadosCreate data models

Você precisa criar algumas classes para os dados e previsões de entrada.You need to create some classes for your input data and predictions. Adicione uma nova classe ao seu projeto:Add a new class to your project:

  1. Crie um diretório chamado Datamodels em seu projeto para salvar seus modelos de dados: no Gerenciador de soluções, clique com o botão direito do mouse no seu projeto e selecione Adicionar > nova pasta.Create a directory named DataModels in your project to save your data models: In Solution Explorer, right-click on your project and select Add > New Folder. Digite "DataModels" e pressione ENTER.Type "DataModels" and hit Enter.

  2. Em Gerenciador de Soluções, clique com o botão direito do mouse no diretório datamodelos e selecione Adicionar > novo item.In Solution Explorer, right-click the DataModels directory, and then select Add > New Item.

  3. Na caixa de diálogo Adicionar Novo Item, selecione Classe e altere o campo Nome para SentimentData.cs.In the Add New Item dialog box, select Class and change the Name field to SentimentData.cs. Em seguida, selecione o botão Adicionar.Then, select the Add button.

    O arquivo SentimentData.cs é aberto no editor de códigos.The SentimentData.cs file opens in the code editor. Adicione a seguinte instrução using na parte superior do SentimentData.cs:Add the following using statement to the top of SentimentData.cs:

    using Microsoft.ML.Data;
    

    Remova a definição de classe existente e adicione o seguinte código ao arquivo 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. Em Gerenciador de Soluções, clique com o botão direito do mouse no diretório datamodelos e selecione Adicionar > novo item.In Solution Explorer, right-click the DataModels directory, and then select Add > New Item.

  5. Na caixa de diálogo Adicionar Novo Item, selecione Classe e altere o campo Nome para SentimentPrediction.cs.In the Add New Item dialog box, select Class and change the Name field to SentimentPrediction.cs. Em seguida, selecione o botão Adicionar.Then, select the Add button. O arquivo SentimentPrediction.cs é aberto no editor de códigos.The SentimentPrediction.cs file opens in the code editor. Adicione a seguinte instrução "using" na parte superior do SentimentPrediction.cs:Add the following using statement to the top of SentimentPrediction.cs:

    using Microsoft.ML.Data;
    

    Remova a definição de classe existente e adicione o seguinte código ao arquivo 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 herda de SentimentData, que dá acesso aos dados originais na propriedade SentimentText, bem como a saída gerada pelo modelo.SentimentPrediction inherits from SentimentData which provides access to the original data in the SentimentText property as well as the output generated by the model.

Registrar serviço PredictionEnginePoolRegister PredictionEnginePool service

Para fazer uma única previsão, você precisa criar um PredictionEngine .To make a single prediction, you have to create a PredictionEngine. PredictionEngine Não é thread-safe.PredictionEngine is not thread-safe. Além disso, você precisa criar uma instância dela em qualquer lugar em que seja necessário dentro de seu aplicativo.Additionally, you have to create an instance of it everywhere it is needed within your application. À medida que seu aplicativo cresce, esse processo pode se tornar não gerenciável.As your application grows, this process can become unmanageable. Para melhorar o desempenho e a segurança do thread, use uma combinação de injeção de dependência e o PredictionEnginePool serviço, que cria um ObjectPool dos PredictionEngine objetos para uso em todo o aplicativo.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.

O link a seguir fornece mais informações se você quiser saber mais sobre injeção de dependência.The following link provides more information if you want to learn more about dependency injection.

  1. No Gerenciador de Soluções, clique com o botão direito do mouse no projeto e selecione Adicionar > Novo Item.In Solution Explorer, right-click the project, and then select Add > New Item.

  2. Na caixa de diálogo Adicionar Novo Item, selecione Classe e altere o campo Nome para Startup.cs.In the Add New Item dialog box, select Class and change the Name field to Startup.cs. Em seguida, selecione o botão Adicionar.Then, select the Add button.

  3. Adicione as seguintes instruções using à parte superior de Startup.cs:Add the following using statements to the top of Startup.cs:

    using System;
    using System.IO;
    using Microsoft.Azure.Functions.Extensions.DependencyInjection;
    using Microsoft.Extensions.ML;
    using SentimentAnalysisFunctionsApp;
    using SentimentAnalysisFunctionsApp.DataModels;
    
  4. Remova o código existente abaixo das instruções using e adicione o seguinte código:Remove the existing code below the using statements and add the following code:

    [assembly: FunctionsStartup(typeof(Startup))]
    namespace SentimentAnalysisFunctionsApp
    {
        public class Startup : FunctionsStartup
        {
    
        }
    }
    
  5. Defina variáveis para armazenar o ambiente no qual o aplicativo está sendo executado e o caminho do arquivo em que o modelo está localizado dentro da Startup classeDefine variables to store the environment the app is running in and the file path where the model is located inside the Startup class

    private readonly string _environment;
    private readonly string _modelPath;
    
  6. Abaixo disso, crie um construtor para definir os valores das _environment variáveis e _modelPath .Below that, create a constructor to set the values of the _environment and _modelPath variables. Quando o aplicativo é executado localmente, o ambiente padrão é desenvolvimento.When the application is running locally, the default environment is Development.

    public Startup()
    {
        _environment = Environment.GetEnvironmentVariable("AZURE_FUNCTIONS_ENVIRONMENT");
    
        if (_environment == "Development")
        {
            _modelPath = Path.Combine("MLModels", "sentiment_model.zip");
        }
        else
        {
            string deploymentPath = @"D:\home\site\wwwroot\";
            _modelPath = Path.Combine(deploymentPath, "MLModels", "sentiment_model.zip");
        }
    }
    
  7. Em seguida, adicione um novo método chamado Configure para registrar o PredictionEnginePool serviço abaixo do construtor.Then, add a new method called Configure to register the PredictionEnginePool service below the constructor.

    public override void Configure(IFunctionsHostBuilder builder)
    {
        builder.Services.AddPredictionEnginePool<SentimentData, SentimentPrediction>()
            .FromFile(modelName: "SentimentAnalysisModel", filePath: _modelPath, watchForChanges: true);
    }
    

Em um alto nível, esse código inicializa os objetos e os serviços automaticamente para uso posterior quando solicitado pelo aplicativo em vez de ter que fazê-lo manualmente.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.

Os modelos de aprendizado de máquina não são estáticos.Machine learning models are not static. À medida que novos dados de treinamento ficam disponíveis, o modelo é retreinado e reimplantado.As new training data becomes available, the model is retrained and redeployed. Uma maneira de obter a versão mais recente do modelo em seu aplicativo é reimplantar o aplicativo inteiro.One way to get the latest version of the model into your application is to redeploy the entire application. No entanto, isso introduz o tempo de inatividade do aplicativo.However, this introduces application downtime. O PredictionEnginePool serviço fornece um mecanismo para recarregar um modelo atualizado sem desativar o aplicativo.The PredictionEnginePool service provides a mechanism to reload an updated model without taking your application down.

Defina o watchForChanges parâmetro como true e o PredictionEnginePool inicia um FileSystemWatcher que escuta as notificações de alteração do sistema de arquivos e gera eventos quando há uma alteração no arquivo.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. Isso solicita que o PredictionEnginePool recarregue automaticamente o modelo.This prompts the PredictionEnginePool to automatically reload the model.

O modelo é identificado pelo modelName parâmetro para que mais de um modelo por aplicativo possa ser recarregado após a alteração.The model is identified by the modelName parameter so that more than one model per application can be reloaded upon change.

Dica

Como alternativa, você pode usar o FromUri método ao trabalhar com modelos armazenados remotamente.Alternatively, you can use the FromUri method when working with models stored remotely. Em vez de observar os eventos de alteração de arquivo, FromUri o pesquisa o local remoto em busca de alterações.Rather than watching for file changed events, FromUri polls the remote location for changes. O padrão do intervalo de sondagem é de 5 minutos.The polling interval defaults to 5 minutes. Você pode aumentar ou diminuir o intervalo de sondagem com base nos requisitos do seu aplicativo.You can increase or decrease the polling interval based on your application's requirements. No exemplo de código abaixo, o PredictionEnginePool sonda o modelo armazenado no URI especificado a cada minuto.In the code sample below, the PredictionEnginePool polls the model stored at the specified URI every minute.

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

Carregar o modelo na funçãoLoad the model into the function

Insira o seguinte código dentro da classe AnalyzeSentiment:Insert the following code inside the AnalyzeSentiment class:

private readonly PredictionEnginePool<SentimentData, SentimentPrediction> _predictionEnginePool;

// AnalyzeSentiment class constructor
public AnalyzeSentiment(PredictionEnginePool<SentimentData, SentimentPrediction> predictionEnginePool)
{
    _predictionEnginePool = predictionEnginePool;
}

Esse código atribui o PredictionEnginePool passando-o para o construtor da função que você obtém por meio da injeção de dependência.This code assigns the PredictionEnginePool by passing it to the function's constructor which you get via dependency injection.

Usar o modelo para fazer previsõesUse the model to make predictions

Substitua a implementação existente do método Run na classe AnalyzeSentiment pelo código a seguir:Replace the existing implementation of Run method in AnalyzeSentiment class with the following code:

[FunctionName("AnalyzeSentiment")]
public async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequest req,
ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    //Parse HTTP Request Body
    string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
    SentimentData data = JsonConvert.DeserializeObject<SentimentData>(requestBody);

    //Make Prediction
    SentimentPrediction prediction = _predictionEnginePool.Predict(modelName: "SentimentAnalysisModel", example: data);

    //Convert prediction to string
    string sentiment = Convert.ToBoolean(prediction.Prediction) ? "Positive" : "Negative";

    //Return Prediction
    return (ActionResult)new OkObjectResult(sentiment);
}

Quando o método Run é executado, os dados de entrada da solicitação HTTP são desserializados e usados como entrada para o PredictionEnginePool.When the Run method executes, the incoming data from the HTTP request is deserialized and used as input for the PredictionEnginePool. O Predict método é chamado para fazer previsões usando o SentimentAnalysisModel registrado na Startup classe e retorna os resultados para o usuário, se for bem-sucedido.The Predict method is then called to make predictions using the SentimentAnalysisModel registered in the Startup class and returns the results back to the user if successful.

Testar localmenteTest locally

Agora que está tudo definido, é hora de testar o aplicativo:Now that everything is set up, it's time to test the application:

  1. Executar o aplicativoRun the application

  2. Abra o PowerShell e digite o seguinte código no prompt, em que PORT é a porta em que seu aplicativo está sendo executado.Open PowerShell and enter the code into the prompt where PORT is the port your application is running on. Normalmente, a porta é a 7071.Typically the port is 7071.

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

    Se houver êxito, a saída deverá ser semelhante ao texto abaixo:If successful, the output should look similar to the text below:

    Negative
    

Parabéns!Congratulations! Você usou com êxito o modelo para fazer previsões pela internet usando uma função do Azure.You have successfully served your model to make predictions over the internet using an Azure Function.

Próximas etapasNext Steps