Implantar um modelo em um ponto de extremidade online gerenciado

Concluído

Você pode optar por implantar um modelo em um ponto de extremidade online gerenciado sem usar o formato de modelo do MLflow. Para implantar um modelo, você precisará criar o script de pontuação e definir o ambiente necessário durante a inferência.

Para implantar um modelo, você precisa ter criado um ponto de extremidade. Em seguida, você pode implantar o modelo no ponto de extremidade.

Implantar um modelo em um ponto de extremidade

Para implantar um modelo, você deve ter:

  • Modele arquivos armazenados no caminho local ou no modelo registrado.
  • Um script de pontuação.
  • Um ambiente de execução.

Os arquivos de modelo podem ser registrados e armazenados quando você treina um modelo.

Criar o script de pontuação

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

  • init(): chamada quando o serviço é inicializado.
  • run(): chamada quando novos dados são enviados para o serviço.

A função init é chamada quando a implantação é criada ou atualizada, para carregar e armazenar em cache o modelo de Registro. A função run é chamada toda vez que o ponto de extremidade é invocado, para gerar previsões dos dados de entrada. O seguinte script de exemplo do Python mostra esse padrão:

import json
import joblib
import numpy as np
import os

# called when the deployment is created or updated
def init():
    global model
    # get the path to the registered model file and load it
    model_path = os.path.join(os.getenv('AZUREML_MODEL_DIR'), 'model.pkl')
    model = joblib.load(model_path)

# called when a request is received
def run(raw_data):
    # get the input data as a numpy array
    data = np.array(json.loads(raw_data)['data'])
    # get a prediction from the model
    predictions = model.predict(data)
    # return the predictions as any JSON serializable format
    return predictions.tolist()

Criar um ambiente

Sua implantação requer um ambiente de execução no qual executar o script de pontuação.

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

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

name: basic-env-cpu
channels:
  - conda-forge
dependencies:
  - python=3.7
  - scikit-learn
  - pandas
  - numpy
  - matplotlib

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.yml",
    name="deployment-environment",
    description="Environment created from a Docker image plus Conda environment.",
)
ml_client.environments.create_or_update(env)

Criar a implantação

Quando você tiver seus arquivos de modelo, script de pontuação e ambiente, poderá criar a implantação.

Para implantar um modelo em um ponto de extremidade, você pode especificar a configuração de computação com dois parâmetros:

Para implantar o modelo, use a classe ManagedOnlineDeployment e execute o seguinte comando:

from azure.ai.ml.entities import ManagedOnlineDeployment, CodeConfiguration

model = Model(path="./model",

blue_deployment = ManagedOnlineDeployment(
    name="blue",
    endpoint_name="endpoint-example",
    model=model,
    environment="deployment-environment",
    code_configuration=CodeConfiguration(
        code="./src", scoring_script="score.py"
    ),
    instance_type="Standard_DS2_v2",
    instance_count=1,
)

ml_client.online_deployments.begin_create_or_update(blue_deployment).result()

Dica

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

Você pode implantar vários modelos em um ponto de extremidade. Para rotear o tráfego para uma implantação específica, use o seguinte código:

# blue deployment takes 100 traffic
endpoint.traffic = {"blue": 100}
ml_client.begin_create_or_update(endpoint).result()

Para excluir o ponto de extremidade e todas as implantações associadas, execute o comando:

ml_client.online_endpoints.begin_delete(name="endpoint-example")