Gérer les entrées et les sorties du composant et du pipeline
Dans cet article, vous apprenez :
- Vue d’ensemble des entrées et sorties dans le composant et le pipeline
- Comment promouvoir les entrées et sorties de composant en entrées et sorties de pipeline
- Comment définir des entrées facultatives
- Comment personnaliser le chemin d’accès des sorties
- Comment télécharger des sorties
- Comment inscrire des sorties en tant que ressource nommée
Vue d’ensemble des entrées et des sorties
Les pipelines Azure Machine Learning prennent en charge les entrées et les sorties au niveau du composant et du pipeline.
Au niveau du composant, les entrées et les sorties définissent l’interface d’un composant. La sortie d’un composant peut être utilisée comme entrée pour un autre composant dans le même pipeline parent, ce qui permet de transférer des données ou des modèles entre les composants. Cette interconnexion forme un graphique illustrant le flux de données au sein du pipeline.
Au niveau du pipeline, les entrées et les sorties sont utiles pour soumettre des travaux de pipeline avec des entrées de données ou des paramètres variables qui contrôlent la logique d’entraînement (par exemple, learning_rate
). Elles sont particulièrement utiles lors de l’appel du pipeline via un point de terminaison REST. Ces entrées et sorties vous permettent d’affecter différentes valeurs à l’entrée du pipeline ou d’accéder à la sortie des travaux du pipeline via le point de terminaison REST. Pour plus d’informations, consultez Création de travaux et de données d’entrée pour le point de terminaison par lots.
Types d’entrées et de sorties
Les types de sorties d’un composant ou pipeline suivants sont pris en charge.
les types de données ; Consultez les types de données dans Azure Machine Learning pour en savoir plus sur les types de données.
uri_file
uri_folder
mltable
Types de modèles.
mlflow_model
custom_model
L’utilisation de sorties de données ou de modèles sérialise essentiellement les sorties et les enregistre sous forme de fichiers dans un emplacement de stockage. Dans les étapes suivantes, cet emplacement de stockage peut être monté, téléchargé ou chargé dans le système de fichiers cible de calcul, ce qui permet à l’étape suivante d’accéder aux fichiers pendant l’exécution du travail.
Ce processus nécessite que le code source du composant sérialise l’objet de sortie souhaité, généralement stocké dans la mémoire, dans des fichiers. Par exemple, vous pouvez sérialiser un dataframe pandas en tant que fichier CSV. Notez qu’Azure Machine Learning ne définit pas de méthodes standardisées pour la sérialisation d’objets. En tant qu’utilisateur, vous avez la possibilité de choisir votre méthode préférée pour sérialiser des objets dans des fichiers. Après cela, dans le composant en aval, vous pouvez désérialiser et lire ces fichiers indépendamment. Voici quelques exemples pour votre référence :
- Dans l’exemple nyc_taxi_data_regression, le composant de préparation a une sortie de type
uri_folder
. Dans le code source du composant, il lit les fichiers csv du dossier d’entrée, traite les fichiers et écrit les fichiers CSV traités dans le dossier de sortie. - Dans l’exemple nyc_taxi_data_regression, le composant d’apprentissage a une sortie de type
mlflow_model
. Dans le code source du composant, il enregistre le modèle entraîné à l’aide de la méthodemlflow.sklearn.save_model
.
En plus des types de données ou de modèles ci-dessus, les entrées du pipeline ou du composant peuvent également suivre les types primitifs.
string
number
integer
boolean
Dans l’exemple nyc_taxi_data_regression, le composant d’apprentissage a une entrée number
nommée test_split_ratio
.
Remarque
La sortie des types primitifs n’est pas prise en charge.
Chemin d’accès et mode des entrées et des sorties de données
Pour les ressources de données des entrées et des sorties, vous devez spécifier un paramètre path
qui pointe vers l’emplacement des données. Le tableau suivant montre les différents emplacements de données pris en charge par le pipeline Azure Machine Learning, ainsi que des exemples de paramètre des chemins d’accès :
Emplacement | Exemples | Entrée | Sortie |
---|---|---|---|
Chemin sur votre ordinateur local | ./home/username/data/my_data |
✓ | |
Chemin sur un serveur http(s) public | https://raw.githubusercontent.com/pandas-dev/pandas/main/doc/data/titanic.csv |
✓ | |
Chemin dans Stockage Azure | wasbs://<container_name>@<account_name>.blob.core.windows.net/<path> abfss://<file_system>@<account_name>.dfs.core.windows.net/<path> |
Non suggéré, car il peut avoir besoin d’une configuration d’identité supplémentaire pour lire les données. | |
Un chemin d’accès sur un magasin de données Azure Machine Learning | azureml://datastores/<data_store_name>/paths/<path> |
✓ | ✓ |
Chemin d’accès à une ressource de données | azureml:<my_data>:<version> |
✓ | ✓ |
Remarque
Pour les entrées et sorties sur le stockage, nous vous recommandons vivement d’utiliser le chemin d’accès du magasin de données Azure Machine Learning à la place du chemin d’accès direct de stockage Azure. Le chemin d’accès du magasin de données est pris en charge pour différents types de travaux dans le pipeline.
Pour l’entrée et sortie des données, vous pouvez choisir parmi différents modes (téléchargement, montage ou chargement) pour définir la façon dont les données sont accessibles dans la cible de calcul. Ce tableau présente les modes possibles pour différentes combinaisons de type/mode/entrée/sortie.
Type | Entrée/sortie | upload |
download |
ro_mount |
rw_mount |
direct |
eval_download |
eval_mount |
---|---|---|---|---|---|---|---|---|
uri_folder |
Entrée | ✓ | ✓ | ✓ | ||||
uri_file |
Entrée | ✓ | ✓ | ✓ | ||||
mltable |
Entrée | ✓ | ✓ | ✓ | ✓ | ✓ | ||
uri_folder |
Sortie | ✓ | ✓ | |||||
uri_file |
Sortie | ✓ | ✓ | |||||
mltable |
Sortie | ✓ | ✓ | ✓ |
Remarque
Dans la plupart des cas, nous vous suggérons d’utiliser le mode ro_mount
ou rw_mount
. Pour plus d’informations sur le mode, consultez les modes de ressources de données.
Représentation visuelle dans Azure Machine Learning studio
Les captures d’écran suivantes fournissent un exemple d’affichage des entrées et des sorties dans un travail de pipeline dans Azure Machine Learning studio. Ce travail particulier, nommé nyc-taxi-data-regression
, se trouve dans azureml-example.
Dans la page de travail de pipeline de Studio, les entrées et sorties du type de modèle/données d’un composant s’affichent sous la forme d’un petit cercle dans le composant correspondant, appelé port d’entrée/de sortie. Ces ports représentent le flux de données dans un pipeline.
La sortie au niveau du pipeline s’affiche sous la forme d’une zone violette pour faciliter l’identification.
Lorsque vous pointez la souris sur un port d’entrée et sortie, le type s’affiche.
Les entrées de type primitif ne s’affichent pas sur le graphique. Il se trouve dans l’onglet Paramètres du panneau de vue d’ensemble du travail de pipeline (pour les entrées au niveau du pipeline) ou dans le panneau des composants (pour les entrées au niveau du composant). La capture d’écran suivante montrant l’onglet Paramètres d’un travail de pipeline, il peut être ouvert en sélectionnant le lien Vue d’ensemble du travail.
Si vous souhaitez vérifier les entrées pour un composant, double-cliquez sur le composant pour ouvrir le panneau du composant.
De même, lors de la modification d’un pipeline dans le concepteur, vous pouvez trouver les entrées et les sorties dans le panneau Interface du pipeline, et les entrées et les sorties du composant dans le panneau du composant (qui s’affiche quand vous double-cliquez sur le composant).
Comment promouvoir les entrées et les sorties d’un composant au niveau du pipeline
La promotion de l’entrée et de la sortie d’un composant au niveau du pipeline vous permet de remplacer l’entrée et la sortie du composant lors de l’envoi d’un travail de pipeline. Elle est également utile si vous souhaitez déclencher le pipeline à l’aide d’un point de terminaison REST.
Voici des exemples pour promouvoir les entrées et les sorties de composant aux entrées et sorties au niveau du 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’exemple complet se trouve dans le pipeline train-score-eval avec des composants inscrits. Ce pipeline promeut trois entrées et trois sorties au niveau du pipeline. Prenons pipeline_job_training_max_epocs
comme exemple. Il est déclaré sous la section inputs
au niveau de la racine, ce qui signifie que son entrée se situe au niveau du pipeline. Sous la section jobs -> train_job
, l’entrée nommée max_epocs
est référencée comme ${{parent.inputs.pipeline_job_training_max_epocs}}
, ce qui indique que l’entrée de train_job
max_epocs
fait référence à l’entrée pipeline_job_training_max_epocs
au niveau du pipeline. De même, vous pouvez promouvoir la sortie du pipeline à l’aide du même schéma.
Studio
Vous pouvez promouvoir l’entrée d’un composant en entrée au niveau du pipeline dans la page de création du concepteur. Accédez au volet de paramètres du composant en double-cliquant sur le composant -> recherchez l’entrée que vous souhaitez promouvoir -> sélectionnez les trois points à droite -> sélectionnez Ajouter à l’entrée du pipeline.
Entrée facultative
Par défaut, toutes les entrées sont requises et doivent recevoir une valeur (ou une valeur par défaut) chaque fois que vous envoyez un travail de pipeline. Toutefois, il peut arriver que vous ayez besoin d’entrées facultatives. Dans ce cas, vous avez la possibilité de ne pas attribuer de valeur à l’entrée lors de l’envoi d’un travail de pipeline.
L’entrée facultative peut être utile dans deux scénarios ci-dessous :
Si vous disposez d’une entrée de type données/modèle facultative et que vous ne lui attribuez pas de valeur lors de l’envoi du travail de pipeline, un composant dans le pipeline n’a pas de dépendance de données précédente. En d’autres termes, le port d’entrée n’est lié à aucun composant ou nœud de données/modèle. Cela oblige le service de pipeline à appeler ce composant directement, au lieu d’attendre que la dépendance précédente soit prête.
La capture d’écran ci-dessous fournit un exemple clair du deuxième scénario. Si vous définissez
continue_on_step_failure = True
pour le pipeline et que vous avez un deuxième nœud (node2) qui utilise la sortie du premier nœud (node1) comme entrée facultative, node2 est toujours exécuté même si node1 échoue. Toutefois, si node2 utilise l’entrée requise de node1, il n’est pas exécuté si node1 échoue.
Voici des exemples sur la définition d’une entrée facultative.
$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}}
Lorsque l’entrée est définie comme optional = true
, vous devez utiliser $[[]]
pour adapter la ligne de commande avec des entrées. Consultez la ligne mise en surbrillance dans l’exemple ci-dessus.
Remarque
La sortie facultative n’est pas prise en charge.
Dans le graphique de pipeline, les entrées facultatives du type de données/modèle sont représentées par un cercle en pointillés. Les entrées facultatives des types primitifs peuvent se trouver sous l’onglet Paramètres. Contrairement aux entrées requises, les entrées facultatives ne comportent pas d’astérisque, ce qui signifie qu’elles ne sont pas obligatoires.
Comment personnaliser le chemin de sortie
Par défaut, la sortie d’un composant est stockée dans azureml://datastores/${{default_datastore}}/paths/${{name}}/${{output_name}}
. {default_datastore}
est défini par le client du magasin de données par défaut pour le pipeline. S’il n’est pas défini, il s’agit du stockage d’objets blob de l’espace de travail. {name}
est le nom du travail, qui sera résolu au moment de l’exécution du travail. {output_name}
est le nom de sortie défini par le client dans le composant YAML.
Toutefois, vous pouvez également personnaliser l’emplacement de stockage de la sortie en définissant le chemin d’accès d’une sortie. Voici quelques exemples :
pipeline.yaml
définit un pipeline qui a trois sorties au niveau du pipeline. Le YAML complet se trouve dans l’exemple de pipeline train-score-eval avec des composants inscrits.
Vous pouvez utiliser la commande suivante pour définir le chemin d’accès de sortie personnalisé pour la sortie 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
Comment télécharger la sortie
Vous pouvez télécharger la sortie d’un composant ou d’un pipeline en suivant l’exemple ci-dessous.
Télécharger la sortie au niveau du 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>
Télécharger la sortie du travail enfant
Lorsque vous devez télécharger la sortie d’un travail enfant (une sortie de composant qui n’est pas promue au niveau du pipeline), vous devez d’abord répertorier toutes les entités de travail enfant d’un travail de pipeline, puis utiliser du code similaire pour télécharger la sortie.
# 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>
Comment inscrire la sortie en tant que ressource nommée
Vous pouvez inscrire la sortie d’un composant ou d’un pipeline en tant que ressource nommée en affectant name
et version
à la sortie. La ressource inscrite peut être listée dans votre espace de travail par le biais de l’interface utilisateur/CLI/kit de développement logiciel (SDK) de Studio, et également être référencée dans vos travaux futurs.
Enregistrer la sortie du 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
Enregistrer la sortie d’un travail enfant
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