Gerenciar entradas e saídas para componentes e pipelines
Os pipelines do Azure Machine Learning dão suporte a entradas e saídas nos níveis de componente e pipeline. Esse artigo descreve entradas e saídas de pipeline e componentes e como gerenciá-las.
No nível do componente, as entradas e saídas definem a interface do componente. Você pode usar a saída de um componente como entrada para outro componente no mesmo pipeline pai, permitindo que dados ou modelos sejam passados entre componentes. Essa interconectividade representa o fluxo de dados dentro do pipeline.
No nível do pipeline, você pode usar entradas e saídas para enviar trabalhos de pipeline com entradas ou parâmetros de dados variados, como learning_rate
. Entradas e saídas são especialmente úteis quando você invoca um pipeline por meio de um ponto de extremidade REST. Você pode atribuir valores diferentes à entrada do pipeline ou acessar a saída de diferentes trabalhos do pipeline. Para obter mais informações, veja Criar trabalhos e dados de entrada para pontos de extremidade em lote.
Tipos de entrada e saída
Os seguintes tipos são suportados como entradas e saídas de componentes ou pipelines:
Tipos de dados. Para obter mais informações, consulte Tipos de dados.
uri_file
uri_folder
mltable
Tipos de modelo.
mlflow_model
custom_model
Os seguintes tipos primitivos também são suportados somente para entradas:
- Tipos primitivos
string
number
integer
boolean
A saída do tipo primitivo não é suportada.
Entradas e saídas de exemplo
Esses exemplos são do pipeline NYC Taxi Data Regression no repositório Exemplos de Azure Machine Learning GitHub.
- O componente de trem tem uma
number
entrada chamadatest_split_ratio
. - O componente prep tem uma saída do tipo
uri_folder
. O código-fonte do componente lê os arquivos CSV da pasta de entrada, processa os arquivos e grava os arquivos CSV processados na pasta de saída. - O componente de trem tem uma saída do tipo
mlflow_model
. O código-fonte do componente salva o modelo treinado usando o métodomlflow.sklearn.save_model
.
Serialização de saída
O uso de saídas de dados ou modelos serializa as saídas e as salva como arquivos em um local de armazenamento. Etapas posteriores podem acessar os arquivos durante a execução do trabalho montando esse local de armazenamento ou baixando ou carregando os arquivos no sistema de arquivos de computação.
O código-fonte do componente deve serializar o objeto de saída, que geralmente é armazenado na memória, em arquivos. Por exemplo, você pode serializar um dataframe do pandas em um arquivo CSV. O Azure Machine Learning não define nenhum método padronizado para serialização de objetos. Você tem a flexibilidade de escolher seus métodos preferidos para serializar objetos em arquivos. No componente downstream, você pode escolher como desserializar e ler esses arquivos.
Caminhos de entrada e saída do tipo de dados
Para entradas e saídas de ativos de dados, você deve especificar um parâmetro de caminho que aponte para o local dos dados. A tabela a seguir mostra os locais de dados suportados para entradas e saídas do pipeline do Azure Machine Learning, com exemplos de parâmetros path
.
Localidade | Entrada | Saída | Exemplo |
---|---|---|---|
Um caminho no computador local | ✓ | ./home/<username>/data/my_data |
|
Um caminho em um servidor http/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> ou abfss://<file_system>@<account_name>.dfs.core.windows.net/<path> |
|
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> |
* Não é recomendado usar o Armazenamento do Microsoft Azure diretamente para entrada, pois pode ser necessária configuração de identidade extra para ler os dados. É melhor usar caminhos de armazenamento de dados do Azure Machine Learning, que são suportados em vários tipos de trabalhos de pipeline.
Modos de entrada e saída de tipo de dados
Para entradas e saídas de tipo de dados, você pode escolher entre vários modos de download, upload e montagem para definir como o destino de computação acessa os dados. A tabela a seguir mostra os modos suportados para diferentes tipos de entradas e saídas.
Tipo | upload |
download |
ro_mount |
rw_mount |
direct |
eval_download |
eval_mount |
---|---|---|---|---|---|---|---|
Entrada uri_folder |
✓ | ✓ | ✓ | ||||
Entrada uri_file |
✓ | ✓ | ✓ | ||||
Entrada mltable |
✓ | ✓ | ✓ | ✓ | ✓ | ||
Saída uri_folder |
✓ | ✓ | |||||
Saída uri_file |
✓ | ✓ | |||||
Saída mltable |
✓ | ✓ | ✓ |
Os modos ro_mount
ou rw_mount
são recomendados para a maioria dos casos. Para mais informações, veja Modos.
Entradas e saídas em gráficos de pipeline
Na página de trabalho do pipeline no Estúdio do Azure Machine Learning, as entradas e saídas dos componentes aparecem como pequenos círculos chamados portas de entrada/saída. Essas portas representam o fluxo de dados no pipeline. A saída do nível do pipeline é exibida em caixas roxas para fácil identificação.
A captura de tela a seguir do gráfico do pipeline NYC Taxi Data Regression mostra muitas entradas e saídas de componentes e pipelines.
Quando você passa o mouse sobre uma porta de entrada/saída, o tipo é exibido.
O gráfico de pipeline não exibe entradas de tipo primitivo. Essas entradas aparecem na guia Configurações do painel Visão geral do trabalho do pipeline para entradas em nível de pipeline ou no painel de componentes para entradas em nível de componente. Para abrir o painel de componentes, clique duas vezes no componente no gráfico.
Ao editar um pipeline no Studio Designer, as entradas e saídas do pipeline ficam no painel Interface do pipeline, e as entradas e saídas do componente ficam no painel do componente.
Promover entradas/saídas de componentes para o nível de pipeline
Promover a entrada/saída de um componente para o nível de pipeline permite que você substitua a entrada/saída do componente ao enviar um trabalho de pipeline. Essa capacidade é especialmente útil para acionar pipelines usando pontos de extremidade REST.
Os exemplos a seguir mostram como promover entradas/saídas em nível de componente para entradas/saídas em nível de pipeline.
O pipeline a seguir promove três entradas e três saídas para o nível do pipeline. Por exemplo, pipeline_job_training_max_epocs
é uma entrada de nível de pipeline porque é declarada na seção inputs
no nível raiz.
Em train_job
na seção jobs
, a entrada chamada max_epocs
é referenciada como ${{parent.inputs.pipeline_job_training_max_epocs}}
, o que significa que a entrada train_job
do max_epocs
faz referência à entrada do nível do pipeline pipeline_job_training_max_epocs
. A saída do pipeline é promovida usando o mesmo esquema.
$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}}
Você pode encontrar o exemplo completo em pipeline train-score-eval com componentes registrados no repositório de exemplos do Azure Machine Learning.
Definir entradas opcionais
Por padrão, todas as entradas são obrigatórias e devem ter um valor padrão ou receber um valor sempre que você enviar um trabalho de pipeline. No entanto, você pode definir uma entrada opcional.
Observação
Saídas opcionais não são suportadas.
Definir entradas opcionais pode ser útil em dois cenários:
Se você definir uma entrada de tipo de dado/modelo opcional e não atribuir um valor a ela ao enviar o trabalho do pipeline, o componente do pipeline não terá essa dependência de dados. Se a porta de entrada do componente não estiver vinculada a nenhum componente ou nó de dados/modelo, o pipeline invocará o componente diretamente em vez de esperar por uma dependência anterior.
Se você definir
continue_on_step_failure = True
para o pipeline, masnode2
usar a entrada necessária denode1
,node2
não será executado senode1
falhar. Senode1
a entrada for opcional,node2
será executado mesmo senode1
falhar. O gráfico a seguir demonstra esse cenário.
O exemplo de código a seguir mostra como definir uma entrada opcional. Quando a entrada é definida como optional = true
, você deve usar $[[]]
para abraçar as entradas da linha de comando, como nas linhas destacadas do exemplo.
$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
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.5/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}}
Personalizar caminhos de saída
Por padrão, a saída do componente é armazenada no {default_datastore}
que você definiu para o pipeline, azureml://datastores/${{default_datastore}}/paths/${{name}}/${{output_name}}
. Se não for definido, o padrão será o armazenamento de blobs do espaço de trabalho.
O trabalho {name}
é resolvido no momento da execução do trabalho e {output_name}
é o nome que você definiu no componente YAML. Você pode personalizar onde armazenar a saída definindo um caminho de saída.
O arquivo pipeline.yml em train-score-eval pipeline com exemplo de componentes registrados define um pipeline que tem três saídas de nível de pipeline. Você pode usar o seguinte comando para definir caminhos de saída personalizados para a saída pipeline_job_trained_model
.
# 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
Baixar saídas
Você pode baixar saídas no nível do pipeline ou do componente.
Baixar saídas de nível de pipeline
Você pode baixar todas as saídas de um trabalho ou baixar uma saída específica.
# 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 a 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 saídas de componentes
Para baixar as saídas de um componente filho, primeiro liste todos os trabalhos filho de um trabalho de pipeline e depois use um código semelhante para baixar as saídas.
# 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 the desired child job name to download output
az ml job download --all -n <JOB_NAME> -g <RESOURCE_GROUP_NAME> -w <WORKSPACE_NAME> --subscription <SUBSCRIPTION_ID>
Registre a saída como um ativo nomeado
Você pode registrar a saída de um componente ou pipeline como um ativo nomeado atribuindo name
e version
à saída. O ativo registrado pode ser listado no seu espaço de trabalho por meio da interface do usuário do estúdio, CLI ou SDK e pode ser referenciado em trabalhos futuros do espaço de trabalho.
Registrar saída de nível 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
Registro de saída do componente
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