Gestire input e output di componenti e pipeline
Contenuto dell'articolo:
- Panoramica degli input e degli output nel componente e nella pipeline
- Come alzare di livello input/output dei componenti agli input/output della pipeline
- Come definire gli input facoltativi
- Come personalizzare il percorso degli output
- Come scaricare gli output
- Come registrare gli output come asset denominato
Panoramica degli input e degli output
Le pipeline di Azure Machine Learning supportano input e output sia a livello di componente che di pipeline.
A livello di componente, gli input e gli output definiscono l'interfaccia di un componente. L'output di un componente può essere usato come input per un altro componente nella stessa pipeline padre, consentendo il passaggio di dati o modelli tra i componenti. Questa interconnettività costituisce un grafico che illustra il flusso di dati all'interno della pipeline.
A livello di pipeline, gli input e gli output sono utili per l'invio di processi della pipeline con input o parametri di dati variabili che controllano la logica di training , ad esempio learning_rate
. Sono particolarmente utili quando si richiama la pipeline tramite un endpoint REST. Questi input e output consentono di assegnare valori diversi all'input della pipeline o accedere all'output dei processi della pipeline tramite l'endpoint REST. Per altre informazioni, vedere Creazione di processi e dati di input per l'endpoint batch.
Tipi di input e output
I tipi seguenti sono supportati come output di un componente o di una pipeline.
Tipi di dati. Per altre informazioni sui tipi di dati, vedere tipi di dati in Azure Machine Learning.
uri_file
uri_folder
mltable
Tipi di modello.
mlflow_model
custom_model
L'uso dell'output di dati o di modello essenzialmente serializza gli output e li salva come file in un percorso di archiviazione. Nei passaggi successivi, questo percorso di archiviazione può essere montato, scaricato o caricato nel file system di destinazione di calcolo, consentendo al passaggio successivo di accedere ai file durante l'esecuzione del processo.
Questo processo richiede che il codice sorgente del componente serializzi l'oggetto di output desiderato, in genere archiviato in memoria, in file. Ad esempio, è possibile serializzare un dataframe pandas come file CSV. Nota: Azure Machine Learning non definisce metodi standardizzati per la serializzazione degli oggetti. Gli utenti hanno la flessibilità di scegliere il metodo preferito per serializzare gli oggetti in file. In seguito, nel componente downstream è possibile deserializzare e leggere questi file in modo indipendente. Ecco alcuni esempi per il riferimento:
- Nell'esempio nyc_taxi_data_regression, il componente di preparazione ha un output di tipo
uri_folder
. Nel codice sorgente del componente, legge i file CSV dalla cartella di input, elabora i file e scrive i file CSV elaborati nella cartella di output. - Nell'esempio nyc_taxi_data_regression, il componente di training ha un output di tipo
mlflow_model
. Nel codice sorgente del componente salva il modello sottoposto a training usando il metodomlflow.sklearn.save_model
.
Oltre ai tipi di dati o modelli precedenti, la pipeline o gli input del componente possono essere anche i tipi primitivi seguenti.
string
number
integer
boolean
Nell'esempio nyc_taxi_data_regression, il componente di training ha un input number
denominato test_split_ratio
.
Nota
L'output dei tipi primitivi non è supportato.
Percorso e modalità per input/output dei dati
Per l'input/output dell'asset di dati, è necessario specificare un parametro path
che punta alla posizione dei dati. Questa tabella mostra i diversi percorsi di dati supportati dalla pipeline di Azure Machine Learning e mostra anche esempi di parametri di percorso:
Ufficio | Esempi | Input | Output |
---|---|---|---|
Un percorso nel computer locale | ./home/username/data/my_data |
✓ | |
Percorso in un server HTTP pubblico | https://raw.githubusercontent.com/pandas-dev/pandas/main/doc/data/titanic.csv |
✓ | |
Un percorso in Archiviazione di Azure | wasbs://<container_name>@<account_name>.blob.core.windows.net/<path> abfss://<file_system>@<account_name>.dfs.core.windows.net/<path> |
Non consigliato perché potrebbe essere necessaria una configurazione di identità aggiuntiva per leggere i dati. | |
Percorso in un archivio dati di Azure Machine Learning | azureml://datastores/<data_store_name>/paths/<path> |
✓ | ✓ |
Percorso per un asset di dati | azureml:<my_data>:<version> |
✓ | ✓ |
Nota
Per l'input/output nell'archiviazione, è consigliabile usare il percorso dell'archivio dati di Azure Machine Learning anziché il percorso diretto di Archiviazione di Azure. Il percorso dell'archivio dati è supportato in vari tipi di processo nella pipeline.
Per l'input/output dei dati, è possibile scegliere tra diverse modalità (download, montaggio o caricamento) per definire la modalità di accesso ai dati nella destinazione di calcolo. La tabella illustra le modalità possibili per combinazioni diverse di tipo/modalità/input/output.
Type | Input/Output | upload |
download |
ro_mount |
rw_mount |
direct |
eval_download |
eval_mount |
---|---|---|---|---|---|---|---|---|
uri_folder |
Input | ✓ | ✓ | ✓ | ||||
uri_file |
Input | ✓ | ✓ | ✓ | ||||
mltable |
Input | ✓ | ✓ | ✓ | ✓ | ✓ | ||
uri_folder |
Output | ✓ | ✓ | |||||
uri_file |
Output | ✓ | ✓ | |||||
mltable |
Output | ✓ | ✓ | ✓ |
Nota
Nella maggior parte dei casi, è consigliabile usare la modalità ro_mount
o rw_mount
. Per altre informazioni sulla modalità, vedere modalità di asset di dati.
Rappresentazione visiva in studio di Azure Machine Learning
Gli screenshot seguenti forniscono un esempio di come vengono visualizzati input e output in un processo della pipeline in studio di Azure Machine Learning. Questo particolare processo, denominato nyc-taxi-data-regression
, è disponibile in azureml-example.
Nella pagina del processo della pipeline di studio, l'input/output del tipo di dati/modello di un componente viene visualizzato come un piccolo cerchio nel componente corrispondente, noto come porta di input/output. Queste porte rappresentano il flusso di dati in una pipeline.
L'output a livello di pipeline viene visualizzato come casella viola per facilitare l'identificazione.
Quando si passa il mouse su una porta di input/output, viene visualizzato il tipo.
Gli input del tipo primitivo non verranno visualizzati nel grafico. È disponibile nella scheda Impostazioni del pannello di panoramica del processo della pipeline (per gli input a livello di pipeline) o nel pannello dei componenti (per gli input a livello di componente). Lo screenshot seguente mostra la scheda Impostazioni di un processo della pipeline che può essere aperta selezionando il collegamento Panoramica processo.
Se si desidera controllare gli input per un componente, fare doppio clic sul componente per aprire il pannello dei componenti.
Analogamente, quando si modifica una pipeline nella finestra di progettazione, è possibile trovare gli input e gli output della pipeline nel pannello Interfaccia pipeline e gli input e gli output dei componenti nel pannello del componente (trigger facendo doppio clic sul componente).
Come alzare di livello di input/output dei componenti ai livelli della pipeline
La promozione dell'input/output di un componente a livello di pipeline consente di sovrascrivere l'input/output del componente durante l'invio di un processo della pipeline. È utile anche se si vuole attivare la pipeline usando l'endpoint REST.
Di seguito sono riportati esempi per promuovere gli input/output dei componenti agli input/output di livello di 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}}
L'esempio completo è disponibile in pipeline train-score-eval con componenti registrati. Questa pipeline promuove tre input e tre output a livello di pipeline. Prendiamo pipeline_job_training_max_epocs
come esempio. Viene dichiarata nella sezione inputs
a livello radice, ovvero l'input a livello di pipeline corrispondente. Nella sezione jobs -> train_job
, l'input denominato max_epocs
viene riferito come ${{parent.inputs.pipeline_job_training_max_epocs}}
, che indica che il max_epocs
dell’input dell' train_job
fa riferimento all'input a livello di pipeline pipeline_job_training_max_epocs
. Analogamente, è possibile alzare di livello l'output della pipeline usando lo stesso schema.
Studio
È possibile alzare di livello l'input di un componente all'input di livello pipeline nella pagina di creazione della finestra di progettazione. Passare al pannello delle impostazioni del componente facendo doppio clic sul componente -> trovare l'input che si vuole alzare di livello -> Selezionare i tre puntini a destra -> Selezionare Aggiungi all'input della pipeline.
Input facoltativo
Per impostazione predefinita, tutti gli input sono necessari e devono essere assegnati a un valore (o un valore predefinito) ogni volta che si invia un processo della pipeline. Tuttavia, potrebbero essere presenti istanze in cui sono necessari input facoltativi. In questi casi, è possibile non assegnare un valore all'input quando si invia un processo della pipeline.
L'input facoltativo può essere utile nei due scenari seguenti:
Se si dispone di un input facoltativo di tipo dati/modello e non si assegna un valore a esso durante l'invio del processo della pipeline, nella pipeline sarà presente un componente che non dispone di una dipendenza dei dati precedente. In altre parole, la porta di input non è collegata ad alcun nodo di componente o dati/modello. In questo modo il servizio pipeline richiama direttamente questo componente, anziché attendere che la dipendenza precedente sia pronta.
Lo screenshot seguente fornisce un esempio chiaro del secondo scenario. Se si imposta
continue_on_step_failure = True
per la pipeline e si dispone di un secondo nodo (node2) che usa l'output del primo nodo (node1) come input facoltativo, node2 verrà comunque eseguito anche se node1 ha esito negativo. Tuttavia, se node2 usa l'input richiesto da node1, non verrà eseguito se node1 ha esito negativo.
Di seguito sono riportati alcuni esempi su come definire l'input facoltativo.
$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 l'input viene impostato come optional = true
, è necessario usare $[[]]
per adottare la riga di comando con gli input. Vedere la riga evidenziata nell'esempio precedente.
Nota
L'output facoltativo non è supportato.
Nel grafico della pipeline, gli input facoltativi del tipo dati/modello sono rappresentati da un cerchio puntinato. Gli input facoltativi dei tipi primitivi possono trovarsi nella scheda Impostazioni. A differenza degli input obbligatori, gli input facoltativi non hanno un asterisco accanto a essi, a indicare che non sono obbligatori.
Come personalizzare il percorso dell’output
Per impostazione predefinita, l'output di un componente verrà archiviato in azureml://datastores/${{default_datastore}}/paths/${{name}}/${{output_name}}
. {default_datastore}
è il set di clienti dell'archivio dati predefinito per la pipeline. Se non è impostata, è l'archiviazione BLOB dell'area di lavoro. {name}
è il nome del processo, che verrà risolto in fase di esecuzione del processo. {output_name}
è il nome di output definito dal cliente nel componente YAML.
Ma è anche possibile personalizzare la posizione in cui archiviare l'output definendo il percorso di un output. Di seguito è riportato un esempio:
pipeline.yaml
definisce una pipeline con tre output a livello di pipeline. Il file YAML completo è disponibile nella pipeline train-score-eval con esempio dei componenti registrati.
È possibile usare il comando seguente per impostare il percorso di output personalizzato per l'output 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
Come scaricare l'output
È possibile scaricare l'output o l'output della pipeline di un componente seguendo l'esempio seguente.
Scaricare l'output a livello di 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>
Scaricare l'output del processo figlio
Quando è necessario scaricare l'output di un processo figlio (un output del componente che non promuove al livello della pipeline), è necessario elencare prima di tutto l'entità processo figlio di un processo della pipeline e quindi usare codice simile per scaricare l'output.
# 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>
Come registrare l'output come asset denominato
È possibile registrare l'output di un componente o di una pipeline come asset denominato assegnando name
e version
all'output. L'asset registrato può essere elencato nell'area di lavoro tramite interfaccia utente/interfaccia della riga di comando/SDK di studio e viene anche usato come riferimento nei processi futuri.
Registrare l'output della 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
Registrare l'output di un processo figlio
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