Share via


Gerenciar entradas e saídas de componentes e pipelines

Neste artigo você aprende:

  • Visão geral de entradas e saídas em componentes e pipeline
  • Como promover entradas/saídas de componentes para entradas/saídas de pipeline
  • Como definir entradas opcionais
  • Como personalizar o caminho de saídas
  • Como baixar saídas
  • Como registrar saídas como ativo nomeado

Visão geral de entradas e saídas

Os pipelines do Azure Machine Learning dão suporte a entradas e saídas nos níveis de componente e pipeline.

No nível do componente, as entradas e saídas definem a interface de um componente. A saída de um componente pode ser usada como entrada para outro componente no mesmo pipeline pai, permitindo que dados ou modelos sejam passados entre componentes. Essa interconectividade forma um gráfico, ilustrando o fluxo de dados dentro do pipeline.

No nível do pipeline, as entradas e saídas são úteis para enviar trabalhos de pipeline com entradas de dados variáveis ou parâmetros que controlam a lógica de treinamento (por exemplo learning_rate). Eles são especialmente úteis ao invocar o pipeline por meio de um ponto de extremidade REST. Essas entradas e saídas permitem atribuir valores diferentes à entrada do pipeline ou acessar a saída dos trabalhos do pipeline por meio do ponto de extremidade REST. Para saber mais, consulte Criando trabalhos e dados de entrada para o ponto de extremidade em lote.

Tipos de entradas e saídas

Os seguintes tipos são suportados como saídas de um componente ou pipeline.

Usando dados ou saída de modelo essencialmente serializando as saídas e salvá-las como arquivos em um local de armazenamento. Nas etapas subsequentes, esse local de armazenamento pode ser montado, baixado ou carregado no sistema de arquivos de destino de computação, permitindo que a próxima etapa acesse os arquivos durante a execução do trabalho.

Este processo requer o código-fonte do componente serializando o objeto de saída desejado - geralmente armazenado na memória - em arquivos. Por exemplo, você pode serializar um dataframe pandas como um arquivo CSV. Observe que o Aprendizado de Máquina do Azure não define nenhum método padronizado para serialização de objetos. Como usuário, você tem a flexibilidade de escolher seu método preferido para serializar objetos em arquivos. Depois disso, no componente downstream, você pode desserializar e ler esses arquivos de forma independente. Aqui estão alguns exemplos para sua referência:

  • No exemplo nyc_taxi_data_regression, o componente de preparação tem umauri_folder saída de tipo. No código-fonte do componente, ele lê os arquivos csv da pasta de entrada, processa os arquivos e grava arquivos CSV processados na pasta de saída.
  • No exemplo nyc_taxi_data_regression, o componente de trem tem uma saída de mlflow_model tipo. No código-fonte do componente, ele salva o modelo treinado usando mlflow.sklearn.save_model o método.

Além dos tipos de dados ou modelos acima, as entradas de pipeline ou componente também podem seguir tipos primitivos.

  • string
  • number
  • integer
  • boolean

No exemplo nyc_taxi_data_regression, o componente train tem uma number entrada chamada test_split_ratio.

Nota

A saída de tipos primitivos não é suportada.

Caminho e modo para entradas/saídas de dados

Para entrada/saída de ativos de dados, você deve especificar um path parâmetro que aponte para o local dos dados. Esta tabela mostra os diferentes locais de dados suportados pelo pipeline do Azure Machine Learning e também mostra exemplos de parâmetros de caminho:

Localização Exemplos Entrada Saída
Um caminho no computador local ./home/username/data/my_data
Um caminho em um servidor http(s) público(s) https://raw.githubusercontent.com/pandas-dev/pandas/main/doc/data/titanic.csv
Um caminho no Armazenamento do Azure wasbs://<container_name>@<account_name>.blob.core.windows.net/<path>
abfss://<file_system>@<account_name>.dfs.core.windows.net/<path>
Não sugerido porque pode precisar de configuração de identidade extra para ler os dados.
Um caminho em um armazenamento de dados do Azure Machine Learning azureml://datastores/<data_store_name>/paths/<path>
Um caminho para um Ativo de Dados azureml:<my_data>:<version>

Nota

Para entrada/saída no armazenamento, sugerimos usar o caminho do armazenamento de dados do Azure Machine Learning em vez do caminho direto do Armazenamento do Azure. O caminho do armazenamento de dados é suportado em vários tipos de trabalho no pipeline.

Para entrada/saída de dados, você pode escolher entre vários modos (download, montagem ou upload) para definir como os dados são acessados no destino de computação. Esta tabela mostra os modos possíveis para diferentes combinações de tipo/modo/entrada/saída.

Type Entrada/Saída upload download ro_mount rw_mount direct eval_download eval_mount
uri_folder Entrada
uri_file Entrada
mltable Entrada
uri_folder Saída
uri_file Saída
mltable Saída

Nota

Na maioria dos casos, sugerimos usar ro_mount ou rw_mount moderar. Para saber mais sobre o modo, consulte Modos de ativos de dados.

Representação visual no estúdio do Azure Machine Learning

As capturas de tela a seguir fornecem um exemplo de como as entradas e saídas são exibidas em um trabalho de pipeline no estúdio do Azure Machine Learning. Este trabalho específico, chamado nyc-taxi-data-regression, pode ser encontrado em azureml-example.

Na página de trabalho de pipeline do estúdio, as entradas/saídas de tipo de dados/modelo de um componente são mostradas como um pequeno círculo no componente correspondente, conhecido como porta de entrada/saída. Essas portas representam o fluxo de dados em um pipeline.

A saída do nível do pipeline é exibida como uma caixa roxa para facilitar a identificação.

Screenshot highlighting the pipeline input and output port.

Quando você passa o mouse sobre uma porta de entrada/saída, o tipo é exibido.

Screenshot highlighting the port type when hovering the mouse.

As entradas de tipo primitivo não serão exibidas no gráfico. Ele pode ser encontrado na guia Configurações do painel de visão geral do trabalho de pipeline (para entradas no nível do pipeline) ou no painel do componente (para entradas no nível do componente). A captura de tela a seguir mostra a guia Configurações de um trabalho de pipeline, ele pode ser aberto selecionando o link Visão geral do trabalho.

Se você quiser verificar as entradas de um componente, clique duas vezes no componente para abrir o painel do componente.

Screenshot highlighting the job overview setting panel.

Da mesma forma, ao editar um pipeline no designer, você pode encontrar as entradas e saídas do pipeline no painel de interface do pipeline e as entradas e saídas do componente no painel do componente (acionar clicando duas vezes no componente).

Screenshot highlighting the pipeline interface in designer.

Como promover entradas de componentes e saídas para o nível de pipeline

Promover a entrada/saída de um componente para o nível do pipeline permite que você substitua a entrada/saída do componente ao enviar um trabalho de pipeline. Também é útil se você quiser acionar o pipeline usando o ponto de extremidade REST.

Seguem-se exemplos para promover entradas/saídas de componentes para entradas/saídas ao nível de pipeline.

$schema: https://azuremlschemas.azureedge.net/latest/pipelineJob.schema.json
type: pipeline
display_name: 1b_e2e_registered_components
description: E2E dummy train-score-eval pipeline with registered components

inputs:
  pipeline_job_training_max_epocs: 20
  pipeline_job_training_learning_rate: 1.8
  pipeline_job_learning_rate_schedule: 'time-based'

outputs: 
  pipeline_job_trained_model:
    mode: upload
  pipeline_job_scored_data:
    mode: upload
  pipeline_job_evaluation_report:
    mode: upload

settings:
 default_compute: azureml:cpu-cluster

jobs:
  train_job:
    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:
        type: vs_code
      my_jupyter_lab:
        type: jupyter_lab
      my_tensorboard:
        type: tensor_board
        log_dir: "outputs/tblogs"
    #  my_ssh:
    #    type: tensor_board
    #    ssh_public_keys: <paste the entire pub key content>
    #    nodes: all # Use the `nodes` property to pick which node you want to enable interactive services on. If `nodes` are not selected, by default, interactive applications are only enabled on the head node.

  score_job:
    type: command
    component: azureml:my_score@latest
    inputs:
      model_input: ${{parent.jobs.train_job.outputs.model_output}}
      test_data: 
        type: uri_folder 
        path: ./data
    outputs:
      score_output: ${{parent.outputs.pipeline_job_scored_data}}

  evaluate_job:
    type: command
    component: azureml:my_eval@latest
    inputs:
      scoring_result: ${{parent.jobs.score_job.outputs.score_output}}
    outputs:
      eval_output: ${{parent.outputs.pipeline_job_evaluation_report}}

O exemplo completo pode ser encontrado no pipeline train-score-eval com componentes registrados. Este pipeline promove três entradas e três saídas ao nível do pipeline. Tomemos pipeline_job_training_max_epocs como exemplo. Ele é declarado em inputs seção no nível raiz, o que significa sua entrada de nível de pipeline. Na jobs -> train_job seção, a entrada nomeada max_epocs é referenciada como ${{parent.inputs.pipeline_job_training_max_epocs}}, o que indica que a train_jobentrada do faz referência à entrada pipeline_job_training_max_epocsmax_epocs no nível do pipeline. Da mesma forma, você pode promover a saída do pipeline usando o mesmo esquema.

Studio

Você pode promover a entrada de um componente para a entrada no nível do pipeline na página de criação do designer. Vá para o painel de configuração do componente clicando duas vezes no componente - encontre a entrada que você gostaria de promover - Selecione os três pontos à direita ->>> Selecione Adicionar à entrada do pipeline.

Screenshot highlighting how to promote to pipeline input in designer.

Entrada opcional

Por padrão, todas as entradas são necessárias e devem receber um valor (ou um valor padrão) cada vez que você envia um trabalho de pipeline. No entanto, pode haver casos em que você precise de entradas opcionais. Nesses casos, você tem a flexibilidade de não atribuir um valor à entrada ao enviar um trabalho de pipeline.

A entrada opcional pode ser útil nos dois cenários abaixo:

  • Se você tiver uma entrada opcional de tipo de dados/modelo e não atribuir um valor a ela ao enviar o trabalho de pipeline, haverá um componente no pipeline que não possui uma dependência de dados anterior. Em outras palavras, a porta de entrada não está vinculada a nenhum componente ou nó de dados/modelo. Isso faz com que o serviço de pipeline invoque esse componente diretamente, em vez de aguardar que a dependência anterior esteja pronta.

  • A captura de tela abaixo fornece um exemplo claro do segundo cenário. Se você definir continue_on_step_failure = True para o pipeline e tiver um segundo nó (node2) que usa a saída do primeiro nó (node1) como uma entrada opcional, o node2 ainda será executado mesmo se o node1 falhar. No entanto, se o nó2 estiver usando a entrada necessária do nó1, ele não será executado se o nó1 falhar.

    Screenshot to show the orchestration logic of optional input and continue on failure.

A seguir estão exemplos sobre como definir a entrada opcional.

$schema: https://azuremlschemas.azureedge.net/latest/commandComponent.schema.json
name: train_data_component_cli
display_name: train_data
description: A example train component
tags:
  author: azureml-sdk-team
version: 9
type: command
inputs:
  training_data: 
    type: uri_folder
  max_epocs:
    type: integer
    optional: true
  learning_rate: 
    type: number
    default: 0.01
    optional: true
  learning_rate_schedule: 
    type: string
    default: time-based
    optional: true
outputs:
  model_output:
    type: uri_folder
code: ./train_src
environment: azureml://registries/azureml/environments/sklearn-1.0/labels/latest
command: >-
  python train.py 
  --training_data ${{inputs.training_data}} 
  $[[--max_epocs ${{inputs.max_epocs}}]]
  $[[--learning_rate ${{inputs.learning_rate}}]]
  $[[--learning_rate_schedule ${{inputs.learning_rate_schedule}}]]
  --model_output ${{outputs.model_output}}

Quando a entrada é definida como optional = true, você precisa usar $[[]] para abraçar a linha de comando com entradas. Veja a linha destacada no exemplo acima.

Nota

A saída opcional não é suportada.

No gráfico de pipeline, as entradas opcionais do tipo Dados/Modelo são representadas por um círculo pontilhado. Entradas opcionais de tipos primitivos podem ser localizadas na guia Configurações . Ao contrário das entradas necessárias, as entradas opcionais não têm um asterisco ao lado delas, significando que não são obrigatórias.

Screenshot highlighting the optional input.

Como personalizar o caminho de saída

Por padrão, a saída de um componente será armazenada no azureml://datastores/${{default_datastore}}/paths/${{name}}/${{output_name}}. O {default_datastore} é o conjunto de clientes de armazenamento de dados padrão para o pipeline. Se não estiver definido, é armazenamento de blob de espaço de trabalho. O {name} é o nome do trabalho, que será resolvido no momento da execução do trabalho. O {output_name} é o nome de saída do cliente definido no componente YAML.

Mas você também pode personalizar onde armazenar a saída definindo o caminho de uma saída. Seguem-se alguns exemplos:

O pipeline.yaml define um pipeline que tem três saídas de nível de pipeline. O YAML completo pode ser encontrado no pipeline train-score-eval com exemplo de componentes registrados. Você pode usar o comando seguinte para definir o caminho de saída personalizado para a pipeline_job_trained_modelsaída.

# define the custom output path using datastore uri
# add relative path to your blob container after "azureml://datastores/<datastore_name>/paths"
output_path="azureml://datastores/{datastore_name}/paths/{relative_path_of_container}"  

# create job and define path using --outputs.<outputname>
az ml job create -f ./pipeline.yml --set outputs.pipeline_job_trained_model.path=$output_path  

Como fazer o download da saída

Você pode baixar a saída de um componente ou a saída do pipeline seguindo o exemplo abaixo.

Baixar saída de nível de pipeline

# Download all the outputs of the job
az ml job download --all -n <JOB_NAME> -g <RESOURCE_GROUP_NAME> -w <WORKSPACE_NAME> --subscription <SUBSCRIPTION_ID>

# Download specific output
az ml job download --output-name <OUTPUT_PORT_NAME> -n <JOB_NAME> -g <RESOURCE_GROUP_NAME> -w <WORKSPACE_NAME> --subscription <SUBSCRIPTION_ID>

Baixe a saída do trabalho infantil

Quando precisar baixar a saída de um trabalho filho (uma saída de componente que não promove para o nível de pipeline), você deve primeiro listar todas as entidades de trabalho filho de um trabalho de pipeline e, em seguida, usar um código semelhante para baixar a saída.

# List all child jobs in the job and print job details in table format
az ml job list --parent-job-name <JOB_NAME> -g <RESOURCE_GROUP_NAME> -w <WORKSPACE_NAME> --subscription <SUBSCRIPTION_ID> -o table

# Select needed child job name to download output
az ml job download --all -n <JOB_NAME> -g <RESOURCE_GROUP_NAME> -w <WORKSPACE_NAME> --subscription <SUBSCRIPTION_ID>

Como registrar a saída como ativo nomeado

Você pode registrar a saída de um componente ou pipeline como ativo nomeado atribuindo name e version para a saída. O ativo registrado pode ser listado em seu espaço de trabalho através do estúdio UI/CLI/SDK e também ser referenciado em seus trabalhos futuros.

Registrar saída de pipeline

display_name: register_pipeline_output
type: pipeline
jobs:
  node:
    type: command
    inputs:
      component_in_path:
        type: uri_file
        path: https://dprepdata.blob.core.windows.net/demo/Titanic.csv
    component: ../components/helloworld_component.yml
    outputs:
      component_out_path: ${{parent.outputs.component_out_path}}
outputs:
  component_out_path:
    type: mltable
    name: pipeline_output  # Define name and version to register pipeline output
    version: '1'
settings:
  default_compute: azureml:cpu-cluster

Registrar a saída de um trabalho infantil

display_name: register_node_output
type: pipeline
jobs:
  node:
    type: command
    component: ../components/helloworld_component.yml
    inputs:
      component_in_path:
        type: uri_file
        path: 'https://dprepdata.blob.core.windows.net/demo/Titanic.csv'
    outputs:
      component_out_path:
        type: uri_folder
        name: 'node_output'  # Define name and version to register a child job's output
        version: '1'
settings:
  default_compute: azureml:cpu-cluster

Próximos passos