Implantar um modelo personalizado em um ponto de extremidade em lote

Concluído

Se você quiser implantar um modelo em um endpoint de processamento em lote sem usar o formato de modelo do MLflow, é necessário criar o script de avaliação e o ambiente.

Para implantar um modelo, você precisa já ter criado um endpoint. Em seguida, você pode implantar o modelo no endpoint.

Criar o script de pontuação

O script de pontuação é um arquivo que lê os novos dados, carrega o modelo e executa a pontuação.

O script de pontuação deve incluir duas funções:

  • init(): É chamado uma única vez no início do processo, portanto, utilize-o para qualquer preparação dispendiosa ou comum, como carregar o modelo.
  • run(): chamado para cada minilote para executar a pontuação.

O método run() deve retornar um DataFrame pandas ou uma matriz/lista.

Um script de pontuação pode ter a seguinte aparência:

import os
import mlflow
import pandas as pd


def init():
    global model

    # get the path to the registered model file and load it
    model_path = os.path.join(os.environ["AZUREML_MODEL_DIR"], "model")
    model = mlflow.pyfunc.load(model_path)


def run(mini_batch):
    print(f"run method start: {__file__}, run({len(mini_batch)} files)")
    resultList = []

    for file_path in mini_batch:
        data = pd.read_csv(file_path)
        pred = model.predict(data)

        df = pd.DataFrame(pred, columns=["predictions"])
        df["file"] = os.path.basename(file_path)
        resultList.extend(df.values)

    return resultList

Há algumas coisas a serem observadas no script de exemplo:

  • AZUREML_MODEL_DIR é uma variável de ambiente que você pode usar para localizar os arquivos associados ao modelo.
  • Utilize a variável global para disponibilizar todos os ativos necessários para avaliar os novos dados, como o modelo carregado.
  • O tamanho do mini_batch é definido na configuração de implantação. Se os arquivos no mini lote forem muito grandes para serem processados, você precisará dividir os arquivos em arquivos menores.
  • Por padrão, as previsões serão gravadas em um único arquivo.

Criar um ambiente

Sua implantação requer um ambiente de execução no qual executar o script de pontuação. Qualquer dependência necessária pelo código deve ser incluída no ambiente.

Você pode criar um ambiente com uma imagem do Docker com dependências do Conda ou com um Dockerfile.

Você também precisará adicionar a biblioteca azureml-core, pois ela é necessária para que as implantações em lote funcionem.

Para criar um ambiente usando uma imagem base do Docker, você pode definir as dependências do Conda em um arquivo conda.yaml:

name: basic-env-cpu
channels:
  - conda-forge
dependencies:
  - python=3.8
  - pandas
  - pip
  - pip:
      - azureml-core
      - mlflow

Em seguida, para criar o ambiente, execute o seguinte código:

from azure.ai.ml.entities import Environment

env = Environment(
    image="mcr.microsoft.com/azureml/openmpi3.1.2-ubuntu18.04",
    conda_file="./src/conda-env.yml",
    name="deployment-environment",
    description="Environment created from a Docker image plus Conda environment.",
)
ml_client.environments.create_or_update(env)

Configurar e criar a implantação

Por fim, você pode configurar e criar a implantação com a classe BatchDeployment.

from azure.ai.ml.entities import BatchDeployment, BatchRetrySettings
from azure.ai.ml.constants import BatchDeploymentOutputAction

deployment = BatchDeployment(
    name="forecast-mlflow",
    description="A sales forecaster",
    endpoint_name=endpoint.name,
    model=model,
    compute="aml-cluster",
    code_path="./code",
    scoring_script="score.py",
    environment=env,
    instance_count=2,
    max_concurrency_per_instance=2,
    mini_batch_size=2,
    output_action=BatchDeploymentOutputAction.APPEND_ROW,
    output_file_name="predictions.csv",
    retry_settings=BatchRetrySettings(max_retries=3, timeout=300),
    logging_level="info",
)
ml_client.batch_deployments.begin_create_or_update(deployment)

Dica

Explore a documentação de referência para criar uma implantação em lote com o SDK do Python v2.