Partilhar via


Criar e executar pipelines de aprendizado de máquina usando componentes com a CLI do Azure Machine Learning

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

Neste artigo, você aprenderá a criar e executar pipelines de aprendizado de máquina usando a CLI e os componentes do Azure. Você pode criar pipelines sem usar componentes, mas os componentes fornecem flexibilidade e permitem a reutilização. Os pipelines do Azure Machine Learning podem ser definidos em YAML e executados a partir da CLI, criados em Python ou compostos no Azure Machine Learning studio Designer por meio de uma interface do usuário de arrastar e soltar. Este artigo se concentra na CLI.

Pré-requisitos

Pré-leitura sugerida

Crie o seu primeiro pipeline com componentes

Primeiro, você criará um pipeline com componentes usando um exemplo. Isso oferece uma impressão inicial da aparência de um pipeline e de um componente no Aprendizado de Máquina do Azure.

No diretório cli/jobs/pipelines-with-components/basics do repositório azureml-examples, vá para o subdiretório 3b_pipeline_with_data. Há três tipos de arquivos neste diretório. Esses são os arquivos que você precisa criar ao criar seu próprio pipeline.

  • pipeline.yml. Este arquivo YAML define o pipeline de aprendizado de máquina. Ele descreve como dividir uma tarefa completa de aprendizado de máquina em um fluxo de trabalho de várias etapas. Por exemplo, considere a tarefa simples de aprendizado de máquina de usar dados históricos para treinar um modelo de previsão de vendas. Talvez você queira criar um fluxo de trabalho sequencial que contenha processamento de dados, treinamento de modelo e etapas de avaliação de modelo. Cada etapa é um componente que tem uma interface bem definida e pode ser desenvolvida, testada e otimizada de forma independente. O pipeline YAML também define como as etapas filhas se conectam a outras etapas na pipeline. Por exemplo, a etapa de treinamento do modelo gera um arquivo de modelo e o arquivo de modelo é passado para uma etapa de avaliação do modelo.

  • component.yml. Esses arquivos YAML definem os componentes. Contêm as seguintes informações:

    • Metadados: Nome, nome para exibição, versão, descrição, tipo e assim por diante. Os metadados ajudam a descrever e gerenciar o componente.
    • Interface: Entradas e saídas. Por exemplo, um componente de treinamento de modelo usa dados de treinamento e número de épocas como entrada e gera um arquivo de modelo treinado como saída. Depois que a interface é definida, diferentes equipes podem desenvolver e testar o componente de forma independente.
    • Comando, código e ambiente: O comando, o código e o ambiente para executar o componente. O comando é o comando 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 (curado ou criado pelo cliente), uma imagem do Docker ou um ambiente de conda.
  • component_src. Estes são os diretórios de código-fonte para componentes específicos. Eles contêm o código-fonte que é executado no componente. Você pode usar sua linguagem preferida, incluindo Python, R e outros. O código deve ser executado por um comando shell. O código-fonte pode receber algumas entradas da linha de comando do shell para controlar como essa etapa é executada. Por exemplo, uma etapa de treinamento pode usar dados de treinamento, taxa de aprendizado e o número de épocas para controlar o processo de treinamento. O argumento de um comando shell é usado para passar entradas e saídas para o código.

Agora você criará um pipeline usando o 3b_pipeline_with_data exemplo. Cada ficheiro é explicado mais pormenorizadamente nas secções seguintes.

Primeiro, liste seus recursos de computação disponíveis usando o seguinte comando:

az ml compute list

Se você não o tiver, crie um cluster chamado cpu-cluster executando este comando:

Nota

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 executando o seguinte comando. O destino de computação é 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ê deverá receber um dicionário JSON com informações sobre a tarefa 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 em estúdio.
services.Studio.endpoint Uma URL para monitorar e revisar o trabalho de pipeline.
status O status do trabalho. Provavelmente será Preparing neste momento.

Vá para o services.Studio.endpoint URL para ver uma visualização do pipeline:

Captura de tela de uma visualização do pipeline.

Compreender a definição de pipeline YAML

Agora você examinará a definição de pipeline no arquivo 3b_pipeline_with_data/pipeline.yml .

Nota

Para usar 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 a seguir descreve os campos mais comumente usados do esquema YAML do pipeline. Para saber mais, consulte o esquema YAML de pipeline completo.

Chave Descrição
type Necessário. O tipo de trabalho. Tem de ser pipeline para empregos em gasodutos.
display_name O nome para exibição do trabalho de pipeline na interface do usuário do estúdio. Editável na interface do estúdio. Ele não precisa ser exclusivo para todos os trabalhos dentro do espaço de trabalho.
jobs Necessário. Um dicionário do conjunto de trabalhos individuais a serem executados como etapas dentro do pipeline. Esses trabalhos são considerados empregos filhos do trabalho de pipeline pai. Na versão atual, os tipos de trabalho suportados no pipeline são command e sweep.
inputs Um 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. Você pode fazer referência a essas entradas de pipeline através das entradas de um trabalho individual em etapa no pipeline usando a expressão ${{ parent.inputs.<input_name> }}.
outputs Um dicionário das configurações de saída da tarefa de pipeline. A chave é um nome para a saída no contexto do trabalho, e o valor é a configuração de saída. Você pode fazer referência a essas saídas de pipeline pelas saídas de um trabalho de etapa individual no pipeline usando a expressão ${{ parents.outputs.<output_name> }}.

O exemplo 3b_pipeline_with_data contém um pipeline de três etapas.

  • As três etapas são definidas em jobs. Todas as três etapas são do tipo command. A definição de cada etapa está em um arquivo correspondente component*.yml . Você pode ver os arquivos YAML componente no diretório 3b_pipeline_with_data . componentA.yml é descrito na próxima seção.
  • Esse pipeline tem dependência de dados, o que é comum em pipelines do mundo real. O componente A recebe a entrada de dados de uma pasta local em ./data (linhas 18-21) e passa sua saída para o componente B (linha 29). A saída do componente A pode ser referenciada como ${{parent.jobs.component_a.outputs.component_a_output}}.
  • default_compute Define a computação padrão para o pipeline. Se um componente em jobs define uma computação diferente, as configurações específicas do componente são respeitadas.

Captura de tela do pipeline com exemplo de dados.

Ler e gravar dados em um pipeline

Um cenário comum é ler e escrever dados num pipeline. No Aprendizado de Máquina do Azure, você usa o mesmo esquema para ler e gravar dados para todos os tipos de trabalhos (trabalhos de pipeline, trabalhos de comando e trabalhos de varredura). A seguir estão exemplos de uso de dados em pipelines para cenários comuns:

Compreender a definição de componente YAML

Aqui está o arquivo componentA.yml , um exemplo de YAML que define um 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}}

Esta tabela define os campos mais comumente usados do componente YAML. Para saber mais, consulte o esquema YAML do componente completo.

Chave Descrição
name Necessário. O nome do componente. Ele deve ser exclusivo no espaço de trabalho do Azure Machine Learning. Deve começar com uma letra minúscula. Letras minúsculas, números e sublinhados (_) são permitidos. O comprimento máximo é de 255 caracteres.
display_name O nome para exibição do componente na interface do usuário do estúdio. Não precisa ser exclusivo dentro do espaço de trabalho.
command Necessário. O comando a ser executado.
code O caminho local para o diretório do código-fonte a ser carregado e usado para o componente.
environment Necessário. O ambiente usado para executar o componente.
inputs Um dicionário de entradas de componentes. A chave é um nome para a entrada dentro do contexto do componente, e o valor é a definição de entrada do componente. Você pode fazer referência a entradas no comando usando a ${{ inputs.<input_name> }} expressão.
outputs Um dicionário de saídas de componentes. A chave é um nome para a saída dentro do contexto do componente, e o valor é a definição de saída do componente. Você pode fazer referência a saídas no comando usando a ${{ outputs.<output_name> }} expressão.
is_deterministic Se o resultado do trabalho anterior deve ser reutilizado se as entradas do componente não forem alteradas. O valor predefinido é true. Essa configuração também é conhecida como reutilização por padrão. O cenário comum quando definido como false é forçar a recarga de dados do armazenamento em nuvem ou de uma URL.

No exemplo em 3b_pipeline_with_data/componentA.yml, o componente A tem uma entrada de dados e uma saída de dados, que podem ser conectadas a outras etapas no pipeline pai. Todos os arquivos na code seção do componente YAML serão carregados no Azure Machine Learning quando o trabalho de pipeline for submetido. Neste exemplo, os ficheiros 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 estúdio: clique duas vezes na etapa componentA no gráfico e vá para a guia Código , conforme mostrado na captura de tela a seguir. Pode-se ver que é um script de 'hello-world' que faz uma impressão simples e escreve a data e a hora atuais no caminho componentA_output. O componente recebe entrada e fornece saída através da linha de comando. É tratado em hello.py via argparse.

Captura de tela do pipeline com exemplo de dados. Mostra o componente A.

Entrada e saída

A entrada e a saída definem a interface de um componente. A entrada e a saída podem ser valores literais (do tipo string, , numberinteger, ou boolean) ou um objeto que contém um esquema de entrada.

A entrada de objeto (do tipo uri_file, uri_folder, mltable, mlflow_modelou custom_model) pode se conectar a outras etapas no trabalho de pipeline pai para passar dados/modelos para outras etapas. No gráfico de pipeline, o tipo de objeto de entrada é renderizado 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 em tempo de execução. Você pode adicionar um valor padrão de entradas literais no default campo. Para number e integer tipos, você também pode adicionar valores mínimos e máximos usando os min campos e max . Se o valor de entrada for menor que o mínimo ou mais que o máximo, o pipeline falhará na validação. A validação ocorre antes de submeter um trabalho de pipeline, o que pode poupar tempo. A validação funciona para a CLI, o Python SDK 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 em enum campos.

Captura de ecrã da entrada e saída do componente do modelo de regressão linear do comboio.

Se quiser adicionar uma entrada a um componente, você precisa fazer edições em três locais:

  • O inputs campo no componente YAML.
  • O command campo no componente YAML.
  • No código-fonte do componente para processar a entrada da linha de comando.

Esses locais são marcados com caixas verdes na captura de tela anterior.

Para saber mais sobre entradas e saídas, consulte Gerenciar entradas e saídas para componentes e pipelines.

Ambientes

O ambiente é o ambiente no qual o componente é executado. Pode ser um ambiente do Azure Machine Learning (curado ou registado personalizadamente), uma imagem Docker ou um ambiente Conda. Veja os seguintes exemplos:

Registrar um componente para reutilização e compartilhamento

Embora alguns componentes sejam específicos de um pipeline específico, o benefício real dos componentes vem da reutilização e do compartilhamento. Você pode registrar um componente em seu espaço de trabalho de Aprendizado de Máquina para disponibilizá-lo para reutilização. Os componentes registrados oferecem suporte ao 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 a funcionar.

No repositório azureml-examples, vá para o cli/jobs/pipelines-with-components/basics/1b_e2e_registered_components diretório.

Para registrar um componente, use o az ml component create comando:

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é à conclusão, poderá ver os componentes no Studio, em AtivosComponentes:

Captura de ecrã do estúdio. Mostra os componentes registrados.

Selecione um componente. Você verá informações detalhadas para cada versão do componente.

A guia Detalhes mostra informações básicas, como o nome do componente, quem o criou e a versão. Há campos editáveis para Tags e Descrição. Você pode usar tags para adicionar palavras-chave de pesquisa. O campo de descrição suporta a formatação Markdown. Você deve usá-lo para descrever a funcionalidade do componente e o uso básico.

Na guia Trabalhos , você vê o histórico de todos os trabalhos que usam o componente.

Usar componentes registrados em um arquivo YAML de trabalho de pipeline

Agora você usará 1b_e2e_registered_components como exemplo de como usar o componente registrado no pipeline YAML. Vá para o 1b_e2e_registered_components diretório e abra o pipeline.yml arquivo. As chaves e valores nos inputs campos e outputs são semelhantes aos já discutidos. A única diferença significativa é o valor do component campo nas jobs.<job_name>.component entradas. O component valor está no formato azureml:<component_name>:<component_version>. A train-job definição, 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 dos componentes e gerenciar os componentes usando a CLI v2. Use az ml component -h para obter instruções detalhadas sobre comandos de componentes. A tabela a seguir lista todos os comandos disponíveis. Veja mais exemplos na referência da CLI do Azure.

Comando Descrição
az ml component create Crie um componente.
az ml component list Liste os componentes em um espaço de trabalho.
az ml component show Mostrar os detalhes de um componente.
az ml component update Atualize um componente. Apenas alguns campos (descrição, display_name) suportam a atualização.
az ml component archive Arquivar um contêiner de componentes.
az ml component restore Restaure um componente arquivado.

Próximo passo