Como operacionalizar um pipeline de treinamento com pontos de extremidade em lote
APLICA-SE A:Extensão de ML da CLI do Azure v2 (atual)SDK do Python azure-ai-ml v2 (atual)
Neste artigo, você aprenderá a operacionalizar um pipeline de treinamento em um ponto de extremidade em lote. O pipeline usa vários componentes (ou etapas) que incluem treinamento de modelo, pré-processamento de dados e avaliação de modelo.
Você aprenderá a:
- Criar e testar um pipeline de treinamento
- Implantar o pipeline em um ponto de extremidade em lote
- Modificar o pipeline e criar uma nova implantação no mesmo ponto de extremidade
- Testar a nova implantação e defini-la como a implantação padrão
Sobre este exemplo
Este exemplo implanta um pipeline de treinamento que usa dados de treinamento de entrada (rotulados) e produz um modelo preditivo, juntamente com os resultados da avaliação e as transformações aplicadas durante o pré-processamento. O pipeline usará dados tabulares do Conjunto de Dados de Doenças Cardíacas UCI para treinar um modelo XGBoost. Usamos um componente de pré-processamento de dados para pré-processar os dados antes de serem enviados ao componente de treinamento para ajustar e avaliar o modelo.
Uma visualização do pipeline é da seguinte forma:
O exemplo neste artigo é baseado em exemplos de códigos contidos no repositório azureml-examples . Para executar os comandos localmente sem precisar copiar/colar o YAML e outros arquivos, primeiro clone o repositório e altere os diretórios para a pasta:
git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli
Os arquivos desse exemplo estão em:
cd endpoints/batch/deploy-pipelines/training-with-components
Acompanhar nos notebooks do Jupyter
Você pode acompanhar a versão do SDK do Python deste exemplo abrindo o notebook sdk-deploy-and-test.ipynb no repositório clonado.
Pré-requisitos
Uma assinatura do Azure. Caso não tenha uma assinatura do Azure, crie uma conta gratuita antes de começar. Experimente a versão gratuita ou paga do Azure Machine Learning.
Um workspace do Azure Machine Learning. Para criar um workspace, confira Gerenciar workspaces do Azure Machine Learning.
Certifique-se de que você tenha as seguintes permissões no espaço de trabalho do Machine Learning:
- Criar ou gerenciar implantações e pontos de extremidade em lote: use uma função de Proprietário, Colaborador ou Personalizada que permita
Microsoft.MachineLearningServices/workspaces/batchEndpoints/*
. - Crie implantações do Azure Resource Manager no grupo de recursos do espaço de trabalho: use uma função de Proprietário, Colaborador ou Personalizada que permita
Microsoft.Resources/deployments/write
no grupo de recursos onde o espaço de trabalho está implantado.
- Criar ou gerenciar implantações e pontos de extremidade em lote: use uma função de Proprietário, Colaborador ou Personalizada que permita
Instale o seguinte software para trabalhar com o Machine Learning:
Execute o seguinte comando para instalar a CLI do Azure e a extensão do Azure Machine Learning
ml
:az extension add -n ml
As implantações de componente de pipeline para pontos de extremidade do Lote são introduzidas na versão 2.7 da extensão
ml
da CLI do Azure. Use o comandoaz extension update --name ml
para obter a versão mais recente.
Conectar-se ao workspace
O workspace é o recurso de nível superior do Machine Learning. Ele fornece um local centralizado para trabalhar com todos os artefatos criados ao usar o Machine Learning. Nesta seção, você se conecta ao workspace em que executa as suas tarefas de implantação.
No comando a seguir, insira os valores para a sua ID de assinatura, workspace, local e grupo de recursos:
az account set --subscription <subscription>
az configure --defaults workspace=<workspace> group=<resource-group> location=<location>
Criar o componente de pipeline de treinamento
Nesta seção, criaremos todos os ativos necessários para nosso pipeline de treinamento. Começaremos criando um ambiente que inclui as bibliotecas necessárias para treinar o modelo. Em seguida, criaremos um cluster de computação no qual a implantação em lote será executada e, por fim, registraremos os dados de entrada como um ativo de dados.
Criar o ambiente
Os componentes neste exemplo usarão um ambiente com as bibliotecas XGBoost
e scikit-learn
. O arquivo environment/conda.yml
contém a configuração do ambiente:
ambiente/conda.yml
channels:
- conda-forge
dependencies:
- python=3.8.5
- pip
- pip:
- mlflow
- azureml-mlflow
- datasets
- jobtools
- cloudpickle==1.6.0
- dask==2023.2.0
- scikit-learn==1.1.2
- xgboost==1.3.3
- pandas==1.4
name: mlflow-env
Crie o ambiente da seguinte maneira:
Defina o ambiente:
environment/xgboost-sklearn-py38.yml
$schema: https://azuremlschemas.azureedge.net/latest/environment.schema.json name: xgboost-sklearn-py38 image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest conda_file: conda.yml description: An environment for models built with XGBoost and Scikit-learn.
Crie o ambiente:
az ml environment create -f environment/xgboost-sklearn-py38.yml
Criar um cluster de cálculo
Os pontos de extremidade do lote e as implantações são executados em clusters de cálculo. Eles podem ser executados em qualquer cluster de cálculo do Azure Machine Learning que já exista no espaço de trabalho. Portanto, várias implantações em lotes podem compartilhar a mesma infraestrutura de computação. Neste exemplo, vamos trabalhar em um cluster de cálculo do Azure Machine Learning chamado batch-cluster
. Vamos verificar se a computação existe no espaço de trabalho ou criá-la, caso não exista.
az ml compute create -n batch-cluster --type amlcompute --min-instances 0 --max-instances 5
Registrar os dados de treinamento como um ativo de dados
Nossos dados de treinamento são representados em arquivos CSV. Para imitar uma carga de trabalho de nível de produção, vamos registrar os dados de treinamento no arquivo heart.csv
como um ativo de dados no workspace. Esse ativo de dados será indicado posteriormente como uma entrada para o ponto de extremidade.
az ml data create --name heart-classifier-train --type uri_folder --path data/train
Criar o pipeline
O pipeline que queremos operacionalizar usa uma entrada, os dados de treinamento e produz três saídas: o modelo treinado, os resultados da avaliação e as transformações de dados aplicadas como pré-processamento. O pipeline é composto por dois componentes:
preprocess_job
: esta etapa lê os dados de entrada e retorna os dados preparados e as transformações aplicadas. A etapa recebe três entradas:data
: uma pasta que contém os dados de entrada para transformar e pontuartransformations
: (opcional) Caminho para as transformações que serão aplicadas, se disponíveis. Se o caminho não for fornecido, as transformações serão aprendidas com os dados de entrada. Como a entradatransformations
é opcional, o componentepreprocess_job
pode ser usado durante o treinamento e a pontuação.categorical_encoding
: a estratégia de codificação para os recursos categóricos (ordinal
ouonehot
).
train_job
: esta etapa treinará um modelo XGBoost com base nos dados preparados e retornará os resultados da avaliação e o modelo treinado. A etapa recebe três entradas:data
: os dados pré-processados.target_column
: a coluna que desejamos prever.eval_size
: indica a proporção dos dados de entrada usados para avaliação.
A configuração do pipeline é definida no arquivo deployment-ordinal/pipeline.yml
:
deployment-ordinal/pipeline.yml
$schema: https://azuremlschemas.azureedge.net/latest/pipelineComponent.schema.json
type: pipeline
name: uci-heart-train-pipeline
display_name: uci-heart-train
description: This pipeline demonstrates how to train a machine learning classifier over the UCI heart dataset.
inputs:
input_data:
type: uri_folder
outputs:
model:
type: mlflow_model
mode: upload
evaluation_results:
type: uri_folder
mode: upload
prepare_transformations:
type: uri_folder
mode: upload
jobs:
preprocess_job:
type: command
component: ../components/prepare/prepare.yml
inputs:
data: ${{parent.inputs.input_data}}
categorical_encoding: ordinal
outputs:
prepared_data:
transformations_output: ${{parent.outputs.prepare_transformations}}
train_job:
type: command
component: ../components/train_xgb/train_xgb.yml
inputs:
data: ${{parent.jobs.preprocess_job.outputs.prepared_data}}
target_column: target
register_best_model: false
eval_size: 0.3
outputs:
model:
mode: upload
type: mlflow_model
path: ${{parent.outputs.model}}
evaluation_results:
mode: upload
type: uri_folder
path: ${{parent.outputs.evaluation_results}}
Observação
No arquivo pipeline.yml
, a entrada transformations
não está no preprocess_job
; portanto, o script aprenderá os parâmetros de transformação dos dados de entrada.
Uma visualização do pipeline é da seguinte forma:
Testar o pipeline
Vamos testar o pipeline com alguns dados de exemplo. Para isso, criaremos um trabalho usando o pipeline e o cluster de cálculo batch-cluster
criado anteriormente.
O arquivo pipeline-job.yml
a seguir contém a configuração do trabalho de pipeline:
deployment-ordinal/pipeline-job.yml
$schema: https://azuremlschemas.azureedge.net/latest/pipelineJob.schema.json
type: pipeline
experiment_name: uci-heart-train-pipeline
display_name: uci-heart-train-job
description: This pipeline demonstrates how to train a machine learning classifier over the UCI heart dataset.
compute: batch-cluster
component: pipeline.yml
inputs:
input_data:
type: uri_folder
outputs:
model:
type: mlflow_model
mode: upload
evaluation_results:
type: uri_folder
mode: upload
prepare_transformations:
mode: upload
Crie o trabalho de teste:
az ml job create -f deployment-ordinal/pipeline-job.yml --set inputs.input_data.path=azureml:heart-classifier-train@latest
Criar um ponto de extremidade em lote
Forneça um nome para o ponto de extremidade. O nome de um ponto de extremidade em lote precisa ser exclusivo em cada região, pois o nome é usado para construir o URI de invocação. Para garantir a exclusividade, acrescente todos os caracteres à direita ao nome especificado no código a seguir.
ENDPOINT_NAME="uci-classifier-train"
Configurar o ponto de extremidade:
O arquivo
endpoint.yml
contém a configuração do ponto de extremidade.endpoint.yml
$schema: https://azuremlschemas.azureedge.net/latest/batchEndpoint.schema.json name: uci-classifier-train description: An endpoint to perform training of the Heart Disease Data Set prediction task. auth_mode: aad_token
Criar o ponto de extremidade:
az ml batch-endpoint create --name $ENDPOINT_NAME -f endpoint.yml
Consulte o URI do ponto de extremidade:
az ml batch-endpoint show --name $ENDPOINT_NAME
Implantar o componente de pipeline
Para implantar o componente de pipeline, precisamos criar uma implantação em lote. Uma implantação é um conjunto de recursos necessários para hospedar o ativo que faz o trabalho real.
Configure a implantação:
O arquivo
deployment-ordinal/deployment.yml
contém a configuração da implantação. Você pode verificar o esquema YAML do ponto de extremidade do lote completo para obter propriedades extras.deployment-ordinal/deployment.yml
$schema: https://azuremlschemas.azureedge.net/latest/pipelineComponentBatchDeployment.schema.json name: uci-classifier-train-xgb description: A sample deployment that trains an XGBoost model for the UCI dataset. endpoint_name: uci-classifier-train type: pipeline component: pipeline.yml settings: continue_on_step_failure: false default_compute: batch-cluster
Criar a implantação:
Execute o código a seguir para criar uma implantação em lote sob o ponto de extremidade de lote e defina-la como a implantação padrão.
az ml batch-deployment create --endpoint $ENDPOINT_NAME -f deployment-ordinal/deployment.yml --set-default
Dica
Observe o uso do sinalizador
--set-default
para indicar que essa nova implantação agora é a padrão.Sua implantação está pronta para uso.
Teste a implantação
Depois que a implantação for criada, ela estará pronta para receber trabalhos. Siga estas etapas para testá-la:
Nossa implantação requer a indicação de uma entrada de dados.
O arquivo
inputs.yml
contém a definição do ativo de dados de entrada:inputs.yml
inputs: input_data: type: uri_folder path: azureml:heart-classifier-train@latest
Dica
Para saber mais sobre como indicar entradas, confira Criar trabalhos e dados de entrada para pontos de extremidade em lote.
Você pode invocar a implantação padrão da seguinte maneira:
JOB_NAME=$(az ml batch-endpoint invoke -n $ENDPOINT_NAME --f inputs.yml --query name -o tsv)
Monitore o progresso da exibição e transmita os logs usando:
az ml job stream -n $JOB_NAME
Vale a pena mencionar que apenas as entradas do pipeline são publicadas como entradas no ponto de extremidade em lote. Por exemplo, categorical_encoding
é uma entrada de uma etapa do pipeline, mas não uma entrada no pipeline em si. Use esse fato para controlar quais entradas você deseja expor aos seus clientes e quais você deseja ocultar.
Acessar saídas de trabalho
Depois que o trabalho for concluído, poderemos acessar alguma das saídas. Esse pipeline produz as seguintes saídas para seus componentes:
preprocess job
: a saída étransformations_output
train job
: as saídas sãomodel
eevaluation_results
Baixe os resultados associados usando:
az ml job download --name $JOB_NAME --output-name transformations
az ml job download --name $JOB_NAME --output-name model
az ml job download --name $JOB_NAME --output-name evaluation_results
Criar uma nova implantação no ponto de extremidade
Os pontos de extremidade podem hospedar várias implantações ao mesmo tempo, mantendo apenas uma implantação como padrão. Portanto, você pode iterar os seus diferentes modelos, implantar os diferentes modelos em seu ponto de extremidade e testá-los e, por fim, mudar a implantação padrão para a implantação de modelo que funciona melhor para você.
Vamos alterar a maneira como o pré-processamento é feito no pipeline para ver se obtemos um modelo com melhor desempenho.
Alterar um parâmetro no componente de pré-processamento do pipeline
O componente de pré-processamento tem uma entrada chamada categorical_encoding
, que pode ter valores ordinal
ou onehot
. Esses valores correspondem a duas maneiras diferentes de codificar recursos categóricos.
ordinal
: codifica os valores de recurso com valores numéricos (ordinal) de[1:n]
, em quen
é o número de categorias no recurso. A codificação ordinal implica que há uma ordem de classificação natural entre as categorias de recursos.onehot
: não implica uma relação ordenada de classificação natural, mas introduz um problema de dimensionalidade se o número de categorias for grande.
Por padrão, usamos ordinal
anteriormente. Agora vamos alterar a codificação categórica onehot
a ser usada e ver o desempenho do modelo.
Dica
Como alternativa, poderíamos ter exposto a entrada categorial_encoding
aos clientes como uma entrada para o trabalho de pipeline em si. No entanto, optamos por alterar o valor do parâmetro na etapa de pré-processamento para que possamos ocultar e controlar o parâmetro dentro da implantação e aproveitar a oportunidade de ter várias implantações no mesmo ponto de extremidade.
Modifique o pipeline. Parece o seguinte:
A configuração do pipeline é definida no arquivo
deployment-onehot/pipeline.yml
:deployment-onehot/pipeline.yml
$schema: https://azuremlschemas.azureedge.net/latest/pipelineComponent.schema.json type: pipeline name: uci-heart-train-pipeline display_name: uci-heart-train description: This pipeline demonstrates how to train a machine learning classifier over the UCI heart dataset. inputs: input_data: type: uri_folder outputs: model: type: mlflow_model mode: upload evaluation_results: type: uri_folder mode: upload prepare_transformations: type: uri_folder mode: upload jobs: preprocess_job: type: command component: ../components/prepare/prepare.yml inputs: data: ${{parent.inputs.input_data}} categorical_encoding: onehot outputs: prepared_data: transformations_output: ${{parent.outputs.prepare_transformations}} train_job: type: command component: ../components/train_xgb/train_xgb.yml inputs: data: ${{parent.jobs.preprocess_job.outputs.prepared_data}} target_column: target eval_size: 0.3 outputs: model: type: mlflow_model path: ${{parent.outputs.model}} evaluation_results: type: uri_folder path: ${{parent.outputs.evaluation_results}}
Configure a implantação:
O arquivo
deployment-onehot/deployment.yml
contém a configuração da implantação. Você pode verificar o esquema YAML do ponto de extremidade do lote completo para obter propriedades extras.deployment-onehot/deployment.yml
$schema: https://azuremlschemas.azureedge.net/latest/pipelineComponentBatchDeployment.schema.json name: uci-classifier-train-onehot description: A sample deployment that trains an XGBoost model for the UCI dataset using onehot encoding for variables. endpoint_name: uci-classifier-train type: pipeline component: pipeline.yml settings: continue_on_step_failure: false default_compute: batch-cluster
Criar a implantação:
Execute o código a seguir para criar uma implantação em lote sob o ponto de extremidade de lote e defina-la como a implantação padrão.
az ml batch-deployment create --endpoint $ENDPOINT_NAME -f deployment-onehot/deployment.yml
Sua implantação está pronta para uso.
Sua implantação está pronta para uso.
Testar uma implantação não padrão
Depois que a implantação for criada, ela estará pronta para receber trabalhos. Podemos testá-la da mesma maneira que fizemos antes, mas agora invocaremos uma implantação específica:
Invoque a implantação da seguinte maneira, especificando o parâmetro de implantação para disparar a implantação
uci-classifier-train-onehot
específica:DEPLOYMENT_NAME="uci-classifier-train-onehot" JOB_NAME=$(az ml batch-endpoint invoke -n $ENDPOINT_NAME -d $DEPLOYMENT_NAME --f inputs.yml --query name -o tsv)
Monitore o progresso da exibição e transmita os logs usando:
az ml job stream -n $JOB_NAME
Configurar a nova implantação como a padrão
Depois de estarmos satisfeitos com o desempenho da nova implantação, podemos definir essa nova como o padrão:
az ml batch-endpoint update --name $ENDPOINT_NAME --set defaults.deployment_name=$DEPLOYMENT_NAME
Excluir a implantação antiga
Depois de terminar, você poderá excluir a implantação antiga se não precisar mais dela:
az ml batch-deployment delete --name uci-classifier-train-xgb --endpoint-name $ENDPOINT_NAME --yes
Limpar os recursos
Quando concluir, exclua os recursos associados do espaço de trabalho:
Execute o código a seguir para excluir o ponto de extremidade em lote e todas as implantações subjacentes. --yes
é usado para confirmar a exclusão.
az ml batch-endpoint delete -n $ENDPOINT_NAME --yes
(Opcional) Exclua a computação, a menos que planeje reutilizar seu cluster de cálculo em implantações posteriores.
az ml compute delete -n batch-cluster