Crie e execute pipelines de machine learning usando componentes com a CLI do Azure Machine Learning
APLICA-SE A: Extensão de ML da CLI do Azurev2 (atual)
Neste artigo, você aprenderá a criar e executar pipelines de machine learning usando a CLI do Azure e componentes. Você pode criar pipelines sem usar componentes, mas os componentes oferecem a maior quantidade de flexibilidade e reutilização. Os Pipelines do Azure Machine Learning podem ser definidos no YAML e executados a partir da CLI, criados em Python ou compostos no Designer do Estúdio do Azure Machine Learning com uma interface do usuário do tipo "arrastar e soltar". Este documento se concentra na CLI.
Pré-requisitos
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. Criar recursos do workspace.
Instalar e configurar a extensão da CLI do Azure para Machine Learning.
Clone o repositório de exemplos:
git clone https://github.com/Azure/azureml-examples --depth 1 cd azureml-examples/cli/jobs/pipelines-with-components/basics
Leitura prévia sugerida
Criar seu primeiro pipeline com componente
Vamos criar seu primeiro pipeline com componentes usando um exemplo. Esta seção tem como objetivo dar uma impressão inicial de como o pipeline e o componente ficam no Azure Machine Learning com um exemplo concreto.
No diretório cli/jobs/pipelines-with-components/basics
do repositório azureml-examples
, navegue para o subdiretório 3b_pipeline_with_data
. Há três tipos de arquivos nesse diretório. Esses são os arquivos que você precisará criar ao criar seu pipeline.
pipeline.yml: esse arquivo YAML define o pipeline de machine learning. Este arquivo YAML descreve como dividir uma tarefa completa de machine learning em um fluxo de trabalho de vários passos. Por exemplo, considerando uma tarefa simples de machine learning para usar dados históricos para treinar um modelo de previsão de vendas, convém criar um fluxo de trabalho sequencial com etapas de processamento de dados, treinamento do modelo e avaliação do modelo. Cada etapa é um componente que tem uma interface bem definida e pode ser desenvolvida, testada e otimizada de modo independente. O YAML de pipeline também define como as etapas filho se conectam a outras etapas no pipeline, por exemplo, a etapa de treinamento do modelo gera um arquivo de modelo e o arquivo de modelo passa para uma etapa de avaliação de modelo.
component.yml: esse arquivo YAML define o componente. Ele empacota as seguintes informações:
- Metadados: nome, nome de exibição, versão, descrição, tipo etc. Os metadados ajudam a descrever e gerenciar o componente.
- Interface: entradas e saídas. Por exemplo, um componente de treinamento de modelo usará dados de treinamento e número de épocas como entrada e gerará um arquivo de modelo treinado como saída. Depois que a interface for definida, diferentes equipes poderão desenvolver e testar o componente de modo independente.
- Comando, código e ambiente: o comando, o código e o ambiente para executar o componente. O comando é o comando de shell para executar o componente. O código geralmente se refere a um diretório de código-fonte. O ambiente pode ser um ambiente do Azure Machine Learning (coletado ou criado pelo cliente), uma imagem do Docker ou um ambiente do Conda.
component_src: esse é o diretório de código-fonte para um componente específico. Ele contém o código-fonte que será executado no componente. Você pode usar sua linguagem preferida (Python, R etc.). O código deve ser executado por um comando de shell. O código-fonte pode usar algumas entradas da linha de comando do shell para controlar como essa etapa será executada. Por exemplo, uma etapa de treinamento pode pegar dados de treinamento, taxa de aprendizado e número de épocas para controlar o processo de treinamento. O argumento de um comando de shell é usado para passar entradas e saídas para o código.
Agora vamos criar um pipeline usando o exemplo 3b_pipeline_with_data
. Explicaremos o significado detalhado de cada arquivo nas seções a seguir.
Primeiro, liste os recursos de computação disponíveis com o seguinte comando:
az ml compute list
Se você não o tiver, crie um cluster chamado cpu-cluster
executando:
Observação
Ignore esta etapa para usar a computação sem servidor.
az ml compute create -n cpu-cluster --type amlcompute --min-instances 0 --max-instances 10
Agora, crie um trabalho de pipeline definido no arquivo pipeline.yml com o comando a seguir. O destino de computação será referenciado no arquivo pipeline.yml como azureml:cpu-cluster
. Se o destino de computação usar um nome diferente, lembre-se de atualizá-lo no arquivo pipeline.yml.
az ml job create --file pipeline.yml
Você deve receber um dicionário JSON com informações sobre o trabalho de pipeline, incluindo:
Chave | Descrição |
---|---|
name |
O nome baseado em GUID do trabalho. |
experiment_name |
O nome sob o qual os trabalhos serão organizados no Estúdio. |
services.Studio.endpoint |
Uma URL para monitorar e revisar o trabalho do pipeline. |
status |
O status do trabalho. Isso provavelmente será Preparing neste momento. |
Abra a URL services.Studio.endpoint
para ver uma visualização de grafo do pipeline.
Entender a definição de pipeline YAML
Vamos dar uma olhada na definição de pipeline no arquivo 3b_pipeline_with_data/pipeline.yml.
Observação
Para usar a computação sem servidor, substitua default_compute: azureml:cpu-cluster
por default_compute: azureml:serverless
neste arquivo.
$schema: https://azuremlschemas.azureedge.net/latest/pipelineJob.schema.json
type: pipeline
display_name: 3b_pipeline_with_data
description: Pipeline with 3 component jobs with data dependencies
settings:
default_compute: azureml:cpu-cluster
outputs:
final_pipeline_output:
mode: rw_mount
jobs:
component_a:
type: command
component: ./componentA.yml
inputs:
component_a_input:
type: uri_folder
path: ./data
outputs:
component_a_output:
mode: rw_mount
component_b:
type: command
component: ./componentB.yml
inputs:
component_b_input: ${{parent.jobs.component_a.outputs.component_a_output}}
outputs:
component_b_output:
mode: rw_mount
component_c:
type: command
component: ./componentC.yml
inputs:
component_c_input: ${{parent.jobs.component_b.outputs.component_b_output}}
outputs:
component_c_output: ${{parent.outputs.final_pipeline_output}}
# mode: upload
A tabela descreve os campos usados mais comuns do esquema YAML do pipeline. Para saber mais, confira o esquema YAML de pipeline completo.
chave | descrição |
---|---|
type | Obrigatório. Tipo de trabalho, deve ser pipeline para trabalhos de pipeline. |
display_name | Nome de exibição do trabalho de pipeline na interface do usuário do Estúdio. Editável na interface do usuário do Estúdio. Não precisa ser exclusivo em todos os trabalhos no workspace. |
jobs | Obrigatório. Dicionário do conjunto de trabalhos individuais a serem executados como etapas no pipeline. Esses trabalhos são considerados trabalhos filho do trabalho do pipeline pai. Nesta versão, os tipos de trabalho com suporte no pipeline são command e sweep |
entradas | Dicionário de entradas para o trabalho de pipeline. A chave é um nome para a entrada dentro do contexto do trabalho e o valor é o valor de entrada. Essas entradas de pipeline podem ser referenciadas pelas entradas de um trabalho de etapa individual no pipeline por meio da expressão ${{ parent.inputs.<input_name> }}. |
outputs | Dicionário de configurações de saída do trabalho de pipeline. A chave é um nome para a saída dentro do contexto do trabalho e o valor é a configuração de saída. Essas saídas de pipeline podem ser referenciadas pelas saídas de um trabalho de etapa individual no pipeline por meio da expressão ${{ parents.outputs.<output_name> }}. |
No exemplo 3b_pipeline_with_data, criamos um pipeline de três etapas.
- As três etapas são definidas em
jobs
. O tipo de três etapas é o trabalho de comando. A definição de cada etapa está no arquivo correspondentecomponent.yml
. Você pode ver os arquivos YAML do componente no diretório 3b_pipeline_with_data. Explicaremos o componentA.yml na próxima seção. - Esse pipeline tem dependência de dados, o que é comum na maioria dos pipelines do mundo real. O Component_a usa a entrada de dados da pasta local em
./data
(linha 17-20) e passa sua saída para componentB (linha 29). A saída do Component_a pode ser referenciada como${{parent.jobs.component_a.outputs.component_a_output}}
. - O
compute
define a computação padrão para esse pipeline. Se um componente emjobs
definir uma computação diferente para esse componente, o sistema respeitará a configuração específica do componente.
Ler e gravar dados no pipeline
Um cenário comum é ler e gravar dados no pipeline. No Azure Machine Learning, usamos o mesmo esquema para ler e gravar dados para todos os tipos de trabalhos (trabalho de pipeline, trabalho de comando e trabalho de limpeza). Veja a seguir exemplos de trabalho de pipeline de uso de dados para cenários comuns.
- dados locais
- arquivo Web com URL pública
- Um armazenamento de dados e um caminho do Azure Machine Learning
- Ativos de dados do Azure Machine Learning
Entender o YAML de definição do componente
Agora vamos examinar o componentA.yml como um exemplo para entender o YAML de definição do componente.
$schema: https://azuremlschemas.azureedge.net/latest/commandComponent.schema.json
type: command
name: component_a
display_name: componentA
version: 1
inputs:
component_a_input:
type: uri_folder
outputs:
component_a_output:
type: uri_folder
code: ./componentA_src
environment:
image: python
command: >-
python hello.py --componentA_input ${{inputs.component_a_input}} --componentA_output ${{outputs.component_a_output}}
O esquema usado mais comum do componente YAML é descrito na tabela. Para saber mais, consulte o esquema YAML de componente completo.
chave | descrição |
---|---|
name | Obrigatório. Nome do componente. Precisa ser exclusivo no workspace do Azure Machine Learning. Deve começar com letra minúscula. Permitir letras minúsculas, números e sublinhados (_). O comprimento máximo é de 255 caracteres. |
display_name | Nome de exibição do componente na interface do usuário no estúdio. Dentro do workspace ele pode ser não exclusivo. |
command | Obrigatório o comando para executar |
code | Caminho local para o diretório de código-fonte a ser carregado e usado para o componente. |
environment | Obrigatório. O ambiente que será usado para executar o componente. |
entradas | Dicionário de entradas de componente. A chave é um nome para a entrada dentro do contexto do componente e o valor é a definição de entrada do componente. As entradas podem ser referenciadas no comando usando a expressão ${{ inputs.<input_name> }}. |
outputs | Dicionário de saídas de componente. A chave é um nome para a saída dentro do contexto do componente e o valor é a definição de saída do componente. As saídas podem ser referenciadas no comando usando a expressão ${{ outputs.<output_name> }}. |
is_deterministic | Se será necessário reutilizar o resultado do trabalho anterior se as entradas do componente não mudarem. O valor padrão é true , também conhecido como reuse por padrão. O cenário comum quando definido como false é forçar o recarregamento de dados de um armazenamento ou URL na nuvem. |
Para o exemplo em 3b_pipeline_with_data/componentA.yml, o componentA tem uma entrada de dados e uma saída de dados, que podem ser conectadas a outras etapas no pipeline pai. Todos os arquivos da seção code
no componente YAML serão carregados no Azure Machine Learning durante o envio do trabalho de pipeline. Neste exemplo, os arquivos em ./componentA_src
serão carregados (linha 16 em componentA.yml). Você pode ver o código-fonte carregado na interface do usuário do Studio: selecione duas vezes a etapa ComponentA e navegue até a guia Instantâneo, conforme mostrado na captura de tela a seguir. Podemos ver que é um script hello-world apenas fazendo uma impressão simples e gravar a datetime atual no caminho componentA_output
. O componente usa entrada e saída por meio do argumento de linha de comando e é processado em hello.py usando argparse
.
Entrada e saída
A entrada e a saída definem a interface de um componente. A entrada e a saída podem ser de um valor literal (do tipo string
,number
,integer
ou boolean
) ou um objeto que contém o esquema de entrada.
A entrada de objeto (do tipo uri_file
, uri_folder
,mltable
,mlflow_model
,custom_model
) pode se conectar a outras etapas no trabalho de pipeline pai e, portanto, passar dados/modelo para outras etapas. No grafo de pipeline, a entrada do tipo de objeto será renderizada como um ponto de conexão.
Entradas de valor literal (string
,number
,integer
,boolean
) são os parâmetros que você pode passar para o componente no tempo de execução. Você pode adicionar o valor padrão de entradas literais no campo default
. Para os tipos number
e integer
, você também pode adicionar os valores mínimo e máximo aceitos usando os campos min
e max
. Se o valor de entrada exceder o mínimo e o máximo, o pipeline falhará na validação. A validação ocorre antes de você enviar um trabalho de pipeline para poupar tempo. A validação funciona para a CLI, o SDK do Python e a interface do usuário do designer. A captura de tela a seguir mostra um exemplo de validação na interface do usuário do designer. Da mesma forma, você pode definir valores permitidos no campo enum
.
Se você quiser adicionar uma entrada a um componente, lembre-se de editar três locais:
- campo
inputs
no componente YAML - campo
command
no componente YAML. - Código-fonte do componente para lidar com a entrada da linha de comando. Ele está marcado em caixa verde na captura de tela anterior.
Para saber mais sobre entradas e saídas, consulte Gerenciar entradas e saídas de componente e pipeline.
Environment
Ambiente define o ambiente para executar o componente. Pode ser um ambiente do Azure Machine Learning (coletado ou personalizado registrado), uma imagem do Docker ou um ambiente do Conda. Consulte os exemplos a seguir.
- Ativo de ambiente registrado do Azure Machine Learning. Ele é referenciado no componente seguindo a sintaxe
azureml:<environment-name>:<environment-version>
. - imagem do docker público
- arquivo Conda O arquivo Conda precisa ser usado com uma imagem base.
Registrar componente para reutilização e compartilhamento
Embora alguns componentes sejam específicos para um pipeline específico, o benefício real dos componentes é derivado da reutilização e do compartilhamento. Registre um componente em seu workspace do Machine Learning para disponibilizá-lo para reutilização. Os componentes registrados são compatíveis com controle de versão automático para que você possa atualizar o componente, mas garantir que os pipelines que exigem uma versão mais antiga continuem funcionando.
No repositório azureml-examples, navegue até o diretório cli/jobs/pipelines-with-components/basics/1b_e2e_registered_components
.
Para registrar um componente, use o comando az ml component create
:
az ml component create --file train.yml
az ml component create --file score.yml
az ml component create --file eval.yml
Depois que esses comandos forem executados até a conclusão, os componentes poderão ser vistos no Studio em Ativo –> Componentes:
Selecione um componente. Você verá informações detalhadas para cada versão do componente.
Na guia Detalhes, você verá informações básicas do componente, como nome, criado por, versão etc. Você verá campos editáveis para Marcas e Descrição. As tags podem ser usadas para adicionar palavras-chave pesquisadas rapidamente. O campo de descrição dá suporte à formatação Markdown e deve ser usado para descrever a funcionalidade e o uso básico do componente.
Na guia Trabalhos, você verá o histórico de todos os trabalhos que usam esse componente.
Use componentes registrados em um arquivo YAML do trabalho do pipeline
Vamos usar 1b_e2e_registered_components
para demonstrar como usar o componente registrado no YAML do pipeline. Navegue até o diretório 1b_e2e_registered_components
, abra o arquivo pipeline.yml
. As chaves e os valores nos campos inputs
e outputs
são semelhantes aos já discutidos. A única diferença significativa é o valor dos campos component
nas entradas jobs.<JOB_NAME>.component
. O valor component
está no formato azureml:<COMPONENT_NAME>:<COMPONENT_VERSION>
. A definição train-job
, por exemplo, especifica que a versão mais recente do componente my_train
registrado deve ser usada:
type: command
component: azureml:my_train@latest
inputs:
training_data:
type: uri_folder
path: ./data
max_epocs: ${{parent.inputs.pipeline_job_training_max_epocs}}
learning_rate: ${{parent.inputs.pipeline_job_training_learning_rate}}
learning_rate_schedule: ${{parent.inputs.pipeline_job_learning_rate_schedule}}
outputs:
model_output: ${{parent.outputs.pipeline_job_trained_model}}
services:
my_vscode:
Gerenciar componentes
Você pode verificar os detalhes do componente e gerenciar o componente usando a CLI (v2). Use az ml component -h
para obter instruções detalhadas sobre o comando de componente. A seguinte tabela lista todas os comandos disponíveis. Veja mais exemplos na referência da CLI do Azure.
commands | descrição |
---|---|
az ml component create |
Criar um componente |
az ml component list |
Listar componentes em um workspace |
az ml component show |
Mostrar detalhes de um componente |
az ml component update |
Atualizar um componente. Apenas alguns campos (descrição, display_name) dão suporte para atualização |
az ml component archive |
Arquivar um contêiner de componentes |
az ml component restore |
Restaurar um componente arquivado |
Próximas etapas
- Experimente o exemplo de componente da CLI v2