Partilhar via


Implantar modelos MLflow em endpoints online

APLICA-SE A: Azure CLI ml extension v2 (atual)

Neste artigo, você verá como implantar seu modelo MLflow em um ponto de extremidade online para inferência em tempo real. Quando você implanta seu modelo MLflow em um ponto de extremidade online, não precisa especificar um script de pontuação ou um ambiente — essa funcionalidade é conhecida como implantação sem código.

Para implantação sem código, Azure Machine Learning:

  • Instala dinamicamente pacotes Python que você lista em um arquivo conda.yaml. Como resultado, as dependências são instaladas durante o tempo de execução do contêiner.
  • Fornece uma imagem base MLflow, ou ambiente com curadoria, que contém os seguintes itens:

Prerequisites

  • Uma subscrição do Azure. Se não tiver uma subscrição do Azure, crie uma conta gratuita antes de começar.

  • Uma conta de usuário que tenha pelo menos uma das seguintes funções de controle de acesso baseado em função do Azure (Azure RBAC):

    • Uma função de Proprietário para o espaço de trabalho do Azure Machine Learning
    • Uma função de Colaborador para o espaço de trabalho do Azure Machine Learning
    • Uma função personalizada que tem Microsoft.MachineLearningServices/workspaces/onlineEndpoints/* permissões

    Para obter mais informações, consulte Gerenciar o acesso aos espaços de trabalho do Azure Machine Learning.

  • Acesso ao Azure Machine Learning:

    Instale a CLI do Azure e a ml extensão da CLI do Azure. Para conhecer as etapas de instalação, consulte Instalar e configurar a CLI (v2).

Sobre o exemplo

O exemplo neste artigo mostra como desdobrar um modelo MLflow para um endpoint online a fim de realizar previsões. O exemplo usa um modelo MLflow baseado no conjunto de dados Diabetes. Este conjunto de dados contém 10 variáveis basais: idade, sexo, índice de massa corporal, pressão arterial média e 6 medições séricas obtidas de 442 pacientes com diabetes. Contém também a resposta de interesse, uma medida quantitativa da progressão da doença um ano após a data dos dados de referência.

O modelo foi treinado por meio de um scikit-learn regressor. Todo o pré-processamento necessário é empacotado como um pipeline, portanto, esse modelo é um pipeline de ponta a ponta que vai de dados brutos a previsões.

As informações neste artigo são baseadas em exemplos de código do repositório azureml-examples . Se você clonar o repositório, poderá executar os comandos neste artigo localmente sem precisar copiar ou colar arquivos YAML e outros arquivos. Use os seguintes comandos para clonar o repositório e ir para a pasta para sua linguagem de codificação:

git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli

Acompanhe no Jupyter Notebook

Para acompanhar as etapas neste artigo, consulte o bloco de anotações Implantar modelo MLflow em pontos de extremidade online no repositório de exemplos.

Ligar à sua área de trabalho

Conecte-se ao seu espaço de trabalho do Azure Machine Learning:

az account set --subscription <subscription-ID>
az configure --defaults workspace=<workspace-name> group=<resource-group-name> location=<location>

Registar o modelo

Você pode implantar apenas modelos registrados em endpoints online. As etapas neste artigo usam um modelo treinado para o conjunto de dados Diabetes. Nesse caso, você já tem uma cópia local do modelo em seu repositório clonado, portanto, só precisa publicar o modelo no registro no espaço de trabalho. Você pode pular esta etapa se o modelo que deseja implantar já estiver registrado.

MODEL_NAME='sklearn-diabetes'
az ml model create --name $MODEL_NAME --type "mlflow_model" --path "endpoints/online/ncd/sklearn-diabetes/model"

E se o seu modelo estivesse registado dentro de uma corrida?

Se o seu modelo foi registado dentro de uma execução, pode registá-lo diretamente.

Para registrar o modelo, você precisa saber seu local de armazenamento:

  • Se você usar o recurso MLflow autolog , o caminho para o modelo dependerá do tipo de modelo e da estrutura. Verifique a saída do trabalho para identificar o nome da pasta modelo. Esta pasta contém um arquivo chamado MLModel.
  • Se você usar o log_model método para registrar manualmente seus modelos, você passa o caminho para o modelo como um argumento para esse método. Por exemplo, se você usar mlflow.sklearn.log_model(my_model, "classifier") para registrar o modelo, classifier é o caminho no qual o modelo está armazenado.

Você pode usar a CLI do Azure Machine Learning v2 para criar um modelo a partir da saída do trabalho de treinamento. O código a seguir usa os artefatos de um trabalho com ID $RUN_ID para registrar um modelo chamado $MODEL_NAME. $MODEL_PATH é o caminho que o trabalho usa para armazenar o modelo.

az ml model create --name $MODEL_NAME --path azureml://jobs/$RUN_ID/outputs/artifacts/$MODEL_PATH

Desplegar uma modelo de MLflow a um terminal online

  1. Use o código a seguir para configurar o nome e o modo de autenticação do ponto de extremidade no qual você deseja implantar o modelo:

    Defina um nome de ponto de extremidade executando o seguinte comando. Primeiro, substitua YOUR_ENDPOINT_NAME por um nome exclusivo.

    export ENDPOINT_NAME="<YOUR_ENDPOINT_NAME>"
    

    Para configurar seu ponto de extremidade, crie um arquivo YAML chamado create-endpoint.yaml que contém as seguintes linhas:

    $schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json
    name: my-endpoint
    auth_mode: key
    
  2. Crie o ponto de extremidade:

    az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/ncd/create-endpoint.yaml
    
  3. Configure a implantação. Uma implantação é um conjunto de recursos necessários para hospedar o modelo que faz a inferência real.

    Crie um arquivo YAML chamado sklearn-deployment.yaml que contenha as seguintes linhas:

    $schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json
    name: sklearn-deployment
    endpoint_name: my-endpoint
    model:
      name: mir-sample-sklearn-ncd-model
      version: 2
      path: sklearn-diabetes/model
      type: mlflow_model
    instance_type: Standard_DS3_v2
    instance_count: 1
    

    Note

    Geração automática do scoring_script e environment só são suportados para a variante de modelo PyFunc. Para usar uma variante diferente de modelo, consulte Personalizar implantações de modelos MLflow.

  4. Crie a implantação:

    az ml online-deployment create --name sklearn-deployment --endpoint $ENDPOINT_NAME -f endpoints/online/ncd/sklearn-deployment.yaml --all-traffic
    
    az ml online-deployment create --name sklearn-deployment --endpoint $ENDPOINT_NAME -f endpoints/online/ncd/sklearn-deployment.yaml --all-traffic
    
  5. Atribua todo o tráfego à implantação. Até agora, o ponto final tem uma implantação, mas nenhum tráfego está atribuído a ela.

    Esta etapa não é necessária na CLI do Azure se usar o sinalizador --all-traffic durante a criação. Se você precisar alterar o tráfego, você pode usar o az ml online-endpoint update --traffic comando. Para obter mais informações sobre como atualizar o tráfego, consulte Atualizar progressivamente o tráfego.

  6. Atualize a configuração do ponto final:

    Esta etapa não é necessária na CLI do Azure se usar o sinalizador --all-traffic durante a criação. Se você precisar alterar o tráfego, você pode usar o az ml online-endpoint update --traffic comando. Para obter mais informações sobre como atualizar o tráfego, consulte Atualizar progressivamente o tráfego.

Invoque o ponto de extremidade

Quando sua implantação estiver pronta, você poderá usá-la para atender solicitações. Uma maneira de testar a implantação é usando o recurso de invocação interno em seu cliente de implantação. No repositório de exemplos, o arquivo sample-request-sklearn.json contém o seguinte código JSON. Você pode usá-lo como um arquivo de solicitação de exemplo para a implantação.

{"input_data": {
    "columns": [
      "age",
      "sex",
      "bmi",
      "bp",
      "s1",
      "s2",
      "s3",
      "s4",
      "s5",
      "s6"
    ],
    "data": [
      [ 1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0 ],
      [ 10.0,2.0,9.0,8.0,7.0,6.0,5.0,4.0,3.0,2.0]
    ],
    "index": [0,1]
  }}

Note

Este arquivo usa a chave input_data em vez de inputs, que o serviço MLflow utiliza. O Azure Machine Learning requer um formato de entrada diferente para gerar automaticamente os contratos Swagger para os endpoints. Para obter mais informações sobre formatos de entrada esperados, consulte Implantação no servidor interno MLflow versus implantação no servidor de inferência do Azure Machine Learning.

Envie uma solicitação para o endpoint:

az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/ncd/sample-request-sklearn.json

A resposta deve ser semelhante ao seguinte texto:

[ 
  11633.100167144921,
  8522.117402884991
]

Important

Para a implementação sem código do MLflow, o teste via endpoints locais atualmente não é suportado.

Personalizar implantações de modelo MLflow

Não é necessário especificar um script de pontuação na definição de implantação de um modelo MLflow para um ponto de extremidade online. Mas você pode especificar um script de pontuação se quiser personalizar seu processo de inferência.

Normalmente, você deseja personalizar a implantação do modelo MLflow nos seguintes casos:

  • O modelo não tem PyFunc sabor.
  • Você precisa personalizar a maneira como executa o modelo. Por exemplo, você precisa usar mlflow.<flavor>.load_model() para usar um sabor específico para carregar o modelo.
  • Você precisa fazer pré-processamento ou pós-processamento na sua rotina de pontuação, porque o modelo não faz esse processamento.
  • A saída do modelo não pode ser bem representada em dados tabulares. Por exemplo, a saída é um tensor que representa uma imagem.

Important

Se você especificar um script de pontuação para uma implantação de modelo MLflow, também precisará especificar o ambiente em que a implantação é executada.

Implantar um script de pontuação personalizado

Para implantar um modelo MLflow que usa um script de pontuação personalizado, execute as etapas nas seções a seguir.

Identificar a pasta modelo

Identifique a pasta que contém seu modelo MLflow executando as seguintes etapas:

  1. Vá para o estúdio do Azure Machine Learning.

  2. Vá para a seção Modelos .

  3. Selecione o modelo que você deseja implantar e vá para a guia Artefatos .

  4. Anote a pasta exibida. Ao registrar um modelo, você especifica essa pasta.

    Captura de ecrã que mostra a pasta que contém os artefatos de modelo.

Criar um script de pontuação

O script de pontuação a seguir, score.py, fornece um exemplo de como executar inferência com um modelo MLflow. Você pode adaptar esse script às suas necessidades ou alterar qualquer uma de suas partes para refletir seu cenário. Observe que o nome da pasta que você identificou anteriormente, model, está incluído na init() função.

import logging
import os
import json
import mlflow
from io import StringIO
from mlflow.pyfunc.scoring_server import infer_and_parse_json_input, predictions_to_json


def init():
    global model
    global input_schema
    # "model" is the path of the mlflow artifacts when the model was registered. For automl
    # models, this is generally "mlflow-model".
    model_path = os.path.join(os.getenv("AZUREML_MODEL_DIR"), "model")
    model = mlflow.pyfunc.load_model(model_path)
    input_schema = model.metadata.get_input_schema()


def run(raw_data):
    json_data = json.loads(raw_data)
    if "input_data" not in json_data.keys():
        raise Exception("Request must contain a top level key named 'input_data'")

    serving_input = json.dumps(json_data["input_data"])
    data = infer_and_parse_json_input(serving_input, input_schema)
    predictions = model.predict(data)

    result = StringIO()
    predictions_to_json(predictions, result)
    return result.getvalue()

Warning

MLflow 2.0 advisory: O script de pontuação de exemplo funciona com MLflow 1.X e MLflow 2.X. No entanto, os formatos de entrada e saída esperados nessas versões podem variar. Verifique a definição do ambiente para ver qual versão do MLflow você usa. MLflow 2.0 só é suportado em Python 3.8 e versões posteriores.

Criar um ambiente

A próxima etapa é criar um ambiente no qual você possa executar o script de pontuação. Como o modelo é um modelo MLflow, os requisitos do conda também constam especificados no pacote do modelo. Para obter mais informações sobre os arquivos incluídos em um modelo MLflow, consulte O formato MLmodel. Você cria o ambiente usando as dependências do conda definidas no arquivo. No entanto, você também precisa incluir o azureml-inference-server-http pacote, que é necessário para implantações online no Azure Machine Learning.

Você pode criar um arquivo de definição de conda chamado conda.yaml que contém as seguintes linhas:

channels:
- conda-forge
dependencies:
- python=3.12
- pip
- pip:
  - mlflow
  - scikit-learn==1.7.0
  - cloudpickle==3.1.1
  - psutil==7.0.0
  - pandas==2.3.0
  - azureml-inference-server-http
name: mlflow-env

Note

A dependencies seção deste arquivo conda inclui o azureml-inference-server-http pacote.

Use este arquivo de dependências conda para criar o ambiente:

O ambiente é criado embutido na configuração de implantação.

Criar uma implantação

Na pasta endpoints/online/ncd, crie um arquivo de configuração de implantação, deployment.yml, que contenha as seguintes linhas:

$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json
name: sklearn-diabetes-custom
endpoint_name: my-endpoint
model: azureml:sklearn-diabetes@latest
environment: 
    image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu22.04
    conda_file: sklearn-diabetes/environment/conda.yaml
code_configuration:
    code: sklearn-diabetes/src
    scoring_script: score.py
instance_type: Standard_F2s_v2
instance_count: 1

Crie a implantação:

az ml online-deployment create -f endpoints/online/ncd/deployment.yml

Atender solicitações

Quando sua implantação estiver concluída, ela estará pronta para atender solicitações. Uma maneira de testar a implantação é usar o invoke método com um arquivo de solicitação de exemplo, como o seguinte arquivo, sample-request-sklearn.json:

{"input_data": {
    "columns": [
      "age",
      "sex",
      "bmi",
      "bp",
      "s1",
      "s2",
      "s3",
      "s4",
      "s5",
      "s6"
    ],
    "data": [
      [ 1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0 ],
      [ 10.0,2.0,9.0,8.0,7.0,6.0,5.0,4.0,3.0,2.0]
    ],
    "index": [0,1]
  }}

Envie uma solicitação para o endpoint:

az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/ncd/sample-request-sklearn.json

A resposta deve ser semelhante ao seguinte texto:

{
    "predictions": [ 
    1095.2797413413252,
    1134.585328803727
    ]
}

Warning

Aviso MLflow 2.0: No MLflow versão 1.X, a resposta não inclui a chave predictions.

Limpar recursos

Se você não precisar mais do ponto de extremidade, exclua seus recursos associados:

az ml online-endpoint delete --name $ENDPOINT_NAME --yes