Gerenciar entradas e saídas de componente e pipeline

Neste artigo, você aprende:

  • Visão geral de entradas e saídas no componente e pipeline
  • Como promover entradas/saídas de componente 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 das saídas e entradas

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 grafo, ilustrando o fluxo de dados dentro do pipeline.

No nível do pipeline, entradas e saídas são úteis para enviar trabalhos de pipeline com diferentes entradas de dados 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 de trabalhos de pipeline por meio do ponto de extremidade REST. Para saber mais, confira Como criar trabalhos e dados de entrada para o ponto de extremidade do lote.

Tipos de entradas e saídas

Os tipos a seguir têm suporte como saídas de um componente ou de um pipeline.

Usando dados ou saída de modelo essencialmente serializando as saídas e salvando-as 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.

Esse 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 do Pandas como um arquivo CSV. Observe que o Azure Machine Learning 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 de nyc_taxi_data_regression, o componente de preparação tem uma saída de tipo uri_folder. 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 de nyc_taxi_data_regression, o componente de trem tem uma saída de tipomlflow_model. No código-fonte do componente, ele salva o modelo treinado usando o método mlflow.sklearn.save_model.

Além dos tipos de modelo ou dados acima, as entradas de pipeline ou componente também podem estar seguindo tipos primitivos.

  • string
  • number
  • integer
  • boolean

No exemplo de nyc_taxi_data_regression, componente de trem tem uma entrada number chamada test_split_ratio.

Observação

Não há suporte para a saída de tipos primitivos.

Caminho e modo para entradas/saídas de dados

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

Location Exemplos Entrada Saída
Um caminho no computador local ./home/username/data/my_data
Um caminho em um servidor https(s) público 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>

Observação

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

Para entrada/saída de dados, você pode escolher entre vários modos (baixar, montar ou carregar) 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.

Tipo 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

Observação

Na maioria dos casos, sugerimos usar ro_mount ou rw_mount modo. Para saber mais sobre o modo, consulte os modos de ativo de dados.

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

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

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

A saída de nível de 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 grafo. 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 de componentes (para entradas no nível do componente). A captura de tela a seguir mostra a guia Configurações de um trabalho de pipeline, que pode ser aberta 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 de componentes.

Screenshot highlighting the job overview setting panel.

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

Screenshot highlighting the pipeline interface in designer.

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

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

A seguir estão exemplos para promover entradas/saídas de componente para entradas/saídas de 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. Esse pipeline promove três entradas e três saídas para o nível do pipeline. Vamos tomar pipeline_job_training_max_epocs como exemplo. Ele é declarado em seção inputs no nível raiz, o que significa que é sua entrada no nível do pipeline. Na seção jobs -> train_job, a entrada nomeada max_epocs é referenciada como ${{parent.inputs.pipeline_job_training_max_epocs}}, o que indica que max_epocs da entrada de train_job faz referência à entrada de nível do pipeline pipeline_job_training_max_epocs. Da mesma forma, você pode promover a saída do pipeline usando o mesmo esquema.

Estúdio

Você pode promover a entrada de um componente para entrada no nível do pipeline na página de criação do designer. Acesse o painel de configurações do componente clicando duas vezes no componente -> localize a entrada que quer 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) sempre que você enviar um trabalho de pipeline. No entanto, pode haver instâncias em que você precisa 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 em dois cenários abaixo:

  • Se você tiver uma entrada de tipo de modelo/dados opcional e não atribuir um valor a ela ao enviar o trabalho de pipeline, haverá um componente no pipeline que não tem 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 a dependência anterior estar 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 node2 estiver usando a entrada necessária do node1, ele não será executado se o node1 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 adotar a linha de comando com entradas. Veja a linha realçada no exemplo acima.

Observação

Não há suporte para a saída opcional.

No grafo de pipeline, as entradas opcionais do tipo Data/Model 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 elas 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 em 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 for definido, será o armazenamento de blobs do workspace. O {name} é o nome do trabalho, que será resolvido no momento da execução do trabalho. O {output_name} é o nome de saída que o cliente definiu no YAML do componente.

Mas você também pode personalizar onde armazenar a saída definindo o caminho de uma saída. Veja a seguir o exemplo:

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 o exemplo de componentes registrados. Você pode usar o comando a seguir 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 baixar a saída

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

Baixar a saída no nível do 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>

Baixar a saída do trabalho filho

Quando você precisar baixar a saída de um trabalho filho (uma saída de componente que não promove para o nível do pipeline), primeiro deverá listar toda a entidade de trabalho filho de um trabalho de pipeline e, em seguida, usar 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 à saída. O ativo registrado pode ser listado em seu workspace por meio da interface do usuário/CLI/SDK do estúdio 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 filho

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óximas etapas