Share via


Personalizar saídas em implantações em lote

APLICA-SE A:Azure CLI ml extension v2 (current)Python SDK azure-ai-ml v2 (current)

Este guia explica como criar implantações que geram saídas e arquivos personalizados. Às vezes, você precisa de mais controle sobre o que é escrito como saída de trabalhos de inferência em lote. Estes casos incluem as seguintes situações:

  • Você precisa controlar como as previsões são escritas na saída. Por exemplo, você deseja acrescentar a previsão aos dados originais se os dados forem tabulares.
  • Você precisa escrever suas previsões em um formato de arquivo diferente daquele suportado pronto para uso por implantações em lote.
  • Seu modelo é um modelo generativo que não pode escrever a saída em um formato tabular. Por exemplo, modelos que produzem imagens como saídas.
  • Seu modelo produz vários arquivos tabulares em vez de um único. Por exemplo, modelos que executam a previsão considerando vários cenários.

As implantações em lote permitem que você assuma o controle da saída dos trabalhos, permitindo que você escreva diretamente na saída do trabalho de implantação em lote. Neste tutorial, você aprenderá a implantar um modelo para executar inferência em lote e gravar as saídas no formato parquet anexando as previsões aos dados de entrada originais.

Sobre este exemplo

Este exemplo mostra como você pode implantar um modelo para executar inferência em lote e personalizar como suas previsões são escritas na saída. O modelo é baseado no conjunto de dados de Doença Cardíaca da UCI. O banco de dados contém 76 atributos, mas este exemplo usa um subconjunto de 14 deles. O modelo tenta prever a presença de doença cardíaca em um paciente. É inteiro valorizado de 0 (sem presença) a 1 (presença).

O modelo foi treinado usando um XGBBoost classificador e todo o pré-processamento necessário foi empacotado como um scikit-learn pipeline, tornando este modelo um pipeline de ponta a ponta que vai de dados brutos a previsões.

O exemplo neste artigo é baseado em exemplos de código contidos no repositório azureml-examples . Para executar os comandos localmente sem ter que copiar/colar YAML e outros arquivos, primeiro clone o repositório e, em seguida, altere os diretórios para a pasta:

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

Os arquivos para este exemplo estão em:

cd endpoints/batch/deploy-models/custom-outputs-parquet

Acompanhe em um caderno Jupyter

Há um bloco de anotações Jupyter que você pode usar para seguir este exemplo. No repositório clonado, abra o bloco de anotações chamado custom-output-batch.ipynb.

Pré-requisitos

Antes de seguir as etapas neste artigo, verifique se você tem os seguintes pré-requisitos:

  • Uma subscrição do Azure. Se não tiver uma subscrição do Azure, crie uma conta gratuita antes de começar. Experimente a versão gratuita ou paga do Azure Machine Learning.

  • Uma área de trabalho do Azure Machine Learning. Se você não tiver um, use as etapas no artigo Gerenciar espaços de trabalho do Azure Machine Learning para criar um.

  • Verifique se você tem as seguintes permissões no espaço de trabalho:

    • Criar ou gerenciar pontos de extremidade em lote e implantações: use uma função Proprietário, Colaborador ou Personalizada que permita Microsoft.MachineLearningServices/workspaces/batchEndpoints/*o .

    • Criar implantações ARM no grupo de recursos do espaço de trabalho: use uma função Proprietário, Colaborador ou Personalizada que permita Microsoft.Resources/deployments/write a entrada no grupo de recursos em que o espaço de trabalho está implantado.

  • Você precisa instalar o seguinte software para trabalhar com o Azure Machine Learning:

    A CLI do Azure e a mlextensão do Azure Machine Learning.

    az extension add -n ml
    

    Nota

    As implantações de componentes de pipeline para pontos de extremidade em lote foram introduzidas na versão 2.7 da extensão para CLI ml do Azure. Use az extension update --name ml para obter a última versão dele.

Ligar à sua área de trabalho

A área de trabalho é o recurso de nível superior do Azure Machine Learning que proporciona um local centralizado para trabalhar com todos os artefactos que cria quando utiliza o Azure Machine Learning. Nesta seção, nos conectaremos ao espaço de trabalho no qual você executará tarefas de implantação.

Passe os valores para sua ID de assinatura, espaço de trabalho, local e grupo de recursos no seguinte código:

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

Criar uma implantação em lote com uma saída personalizada

Neste exemplo, você cria uma implantação que pode gravar diretamente na pasta de saída do trabalho de implantação em lote. A implantação usa esse recurso para escrever arquivos de parquet personalizados.

Registar o modelo

Você só pode implantar modelos registrados usando um ponto de extremidade em lote. Nesse caso, você já tem uma cópia local do modelo no repositório, portanto, só precisa publicar o modelo no registro no espaço de trabalho. Você pode pular esta etapa se o modelo que está tentando implantar já estiver registrado.

MODEL_NAME='heart-classifier-sklpipe'
az ml model create --name $MODEL_NAME --type "custom_model" --path "model"

Criar um script de pontuação

Você precisa criar um script de pontuação que possa ler os dados de entrada fornecidos pela implantação em lote e retornar as pontuações do modelo. Você também vai escrever diretamente na pasta de saída do trabalho. Em resumo, o roteiro de pontuação proposto faz o seguinte:

  1. Lê os dados de entrada como arquivos CSV.
  2. Executa uma função de modelo predict MLflow sobre os dados de entrada.
  3. Acrescenta as previsões a um pandas.DataFrame junto com os dados de entrada.
  4. Grava os dados em um arquivo chamado de arquivo de entrada, mas em parquet formato.

código/batch_driver.py

import os
import pickle
import glob
import pandas as pd
from pathlib import Path
from typing import List


def init():
    global model
    global output_path

    # AZUREML_MODEL_DIR is an environment variable created during deployment
    # It is the path to the model folder
    # Please provide your model's folder name if there's one:
    output_path = os.environ["AZUREML_BI_OUTPUT_PATH"]
    model_path = os.environ["AZUREML_MODEL_DIR"]
    model_file = glob.glob(f"{model_path}/*/*.pkl")[-1]

    with open(model_file, "rb") as file:
        model = pickle.load(file)


def run(mini_batch: List[str]):
    for file_path in mini_batch:
        data = pd.read_csv(file_path)
        pred = model.predict(data)

        data["prediction"] = pred

        output_file_name = Path(file_path).stem
        output_file_path = os.path.join(output_path, output_file_name + ".parquet")
        data.to_parquet(output_file_path)

    return mini_batch

Observações:

  • Observe como a variável AZUREML_BI_OUTPUT_PATH de ambiente é usada para obter acesso ao caminho de saída do trabalho de implantação.
  • A init() função preenche uma variável global chamada output_path que pode ser usada posteriormente para saber onde escrever.
  • O run método retorna uma lista dos arquivos processados. É necessário para que a run função retorne um list ou um pandas.DataFrame objeto.

Aviso

Leve em consideração que todos os executores em lote têm acesso de gravação a esse caminho ao mesmo tempo. Isso significa que você precisa levar em conta a simultaneidade. Nesse caso, certifique-se de que cada executor escreva seu próprio arquivo usando o nome do arquivo de entrada como o nome da pasta de saída.

Criar o ponto de extremidade

Agora você cria um ponto de extremidade em lote chamado heart-classifier-batch onde o modelo é implantado.

  1. Decida o nome do ponto de extremidade. O nome do ponto de extremidade aparece no URI associado ao seu ponto de extremidade, portanto , os nomes de ponto de extremidade em lote precisam ser exclusivos dentro de uma região do Azure. Por exemplo, pode haver apenas um ponto de extremidade em lote com o nome mybatchendpoint em westus2.

    Nesse caso, coloque o nome do ponto de extremidade em uma variável para que você possa facilmente consultá-lo mais tarde.

    ENDPOINT_NAME="heart-classifier-custom"
    
  2. Configure seu ponto de extremidade em lote.

    O seguinte arquivo YAML define um ponto de extremidade em lote:

    endpoint.yml

    $schema: https://azuremlschemas.azureedge.net/latest/batchEndpoint.schema.json
    name: heart-classifier-batch
    description: A heart condition classifier for batch inference
    auth_mode: aad_token
    
  3. Crie o ponto de extremidade:

    az ml batch-endpoint create -n $ENDPOINT_NAME -f endpoint.yml
    

Criar a implantação

Siga as próximas etapas para criar uma implantação usando o script de pontuação anterior:

  1. Primeiro, crie um ambiente onde o script de pontuação possa ser executado:

    Nenhuma etapa extra é necessária para a CLI do Azure Machine Learning. A definição de ambiente está incluída no arquivo de implantação.

    environment:
      name: batch-mlflow-xgboost
      image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest
      conda_file: environment/conda.yaml
    
  2. Crie a implantação. Observe que output_action agora está definido como SUMMARY_ONLY.

    Nota

    Este exemplo pressupõe que você tenha um cluster de computação com o nome batch-cluster. Altere esse nome de acordo.

    Para criar uma nova implantação sob o ponto de extremidade criado, crie uma configuração YAML como a seguinte. Você pode verificar o esquema YAML do ponto de extremidade de lote completo para obter propriedades extras.

    $schema: https://azuremlschemas.azureedge.net/latest/modelBatchDeployment.schema.json
    endpoint_name: heart-classifier-batch
    name: classifier-xgboost-custom
    description: A heart condition classifier based on XGBoost and Scikit-Learn pipelines that append predictions on parquet files.
    type: model
    model: azureml:heart-classifier-sklpipe@latest
    environment:
      name: batch-mlflow-xgboost
      image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest
      conda_file: environment/conda.yaml
    code_configuration:
      code: code
      scoring_script: batch_driver.py
    compute: azureml:batch-cluster
    resources:
      instance_count: 2
    settings:
      max_concurrency_per_instance: 2
      mini_batch_size: 2
      output_action: summary_only
      retry_settings:
        max_retries: 3
        timeout: 300
      error_threshold: -1
      logging_level: info
    

    Em seguida, crie a implantação com o seguinte comando:

    az ml batch-deployment create --file deployment.yml --endpoint-name $ENDPOINT_NAME --set-default
    
  3. Neste ponto, nosso ponto de extremidade em lote está pronto para ser usado.

Testar a implementação

Para testar seu endpoint, use uma amostra de dados não rotulados localizados neste repositório, que podem ser usados com o modelo. Os pontos de extremidade em lote só podem processar dados localizados na nuvem e acessíveis a partir do espaço de trabalho do Azure Machine Learning. Neste exemplo, você o carrega em um repositório de dados do Azure Machine Learning. Você vai criar um ativo de dados que pode ser usado para invocar o ponto de extremidade para pontuação. No entanto, observe que os pontos de extremidade em lote aceitam dados que podem ser colocados em vários tipos de locais.

  1. Invoque o ponto de extremidade com dados de uma conta de armazenamento:

    JOB_NAME = $(az ml batch-endpoint invoke --name $ENDPOINT_NAME --input https://azuremlexampledata.blob.core.windows.net/data/heart-disease-uci/data --query name -o tsv)
    

    Nota

    O utilitário jq pode não estar instalado em todas as instalações. Você pode obter instruções no GitHub.

  2. Um trabalho em lote é iniciado assim que o comando retorna. Você pode monitorar o status do trabalho até que ele termine:

    az ml job show -n $JOB_NAME --web
    

Analise as saídas

O trabalho gera uma saída nomeada chamada score onde todos os arquivos gerados são colocados. Como você escreveu no diretório diretamente, um arquivo por cada arquivo de entrada, então você pode esperar ter o mesmo número de arquivos. Neste exemplo em particular, nomeie os arquivos de saída da mesma forma que as entradas, mas eles têm uma extensão parquet.

Nota

Observe que um predictions.csv de arquivo também está incluído na pasta de saída. Este ficheiro contém o resumo dos ficheiros processados.

Você pode baixar os resultados do trabalho usando o nome do trabalho:

Para baixar as previsões, use o seguinte comando:

az ml job download --name $JOB_NAME --output-name score --download-path ./

Uma vez que o arquivo é baixado, você pode abri-lo usando sua ferramenta favorita. O exemplo a seguir carrega as previsões usando Pandas dataframe.

import pandas as pd
import glob

output_files = glob.glob("named-outputs/score/*.parquet")
score = pd.concat((pd.read_parquet(f) for f in output_files))
score

A saída tem a seguinte aparência:

idade sexo ... Thal previsão
63 1 ... fixo 0
67 1 ... normal 1
67 1 ... reversível 0
37 1 ... normal 0

Clean up resources (Limpar recursos)

Execute o código a seguir para excluir o ponto de extremidade em lote e todas as implantações subjacentes. Os trabalhos de pontuação em lote não são excluídos.

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