Verwalten von Eingaben und Ausgaben von Komponenten und Pipelines
Azure Machine Learning-Pipelines unterstützen Eingaben und Ausgaben sowohl auf Komponenten- als auch auf Pipelineebene. In diesem Artikel werden Ein- und -ausgaben von Pipelines und Komponenten sowie deren Verwaltung beschrieben.
Auf Komponentenebene definieren die Ein- und Ausgaben die Komponentenschnittstelle. Sie können die Ausgabe einer Komponente als Eingabe für eine andere Komponente in derselben übergeordneten Pipeline verwenden, sodass Daten oder Modelle zwischen Komponenten weitergegeben werden können. Diese Interkonnektivität stellt den Datenfluss innerhalb der Pipeline dar.
Auf Pipelineebene können Sie Ein- und Ausgaben verwenden, um Pipelineaufträge mit unterschiedlichen Dateneingaben oder Parametern wie learning_rate
zu übermitteln. Ein- und Ausgaben sind besonders nützlich beim Aufrufen einer Pipeline über einen REST-Endpunkt. Sie können der Pipelineeingabe unterschiedliche Werte zuweisen oder auf die Ausgabe verschiedener Pipelineaufträge zugreifen. Weitere Informationen finden Sie unter Erstellen von Aufträgen und Eingabedaten für Batchendpunkte.
Eingabe- und Ausgabetypen
Die folgenden Typen werden sowohl als Ein- als auch Ausgaben von Komponenten oder Pipelines unterstützt:
Datentypen Weitere Informationen finden Sie unter Datentypen.
uri_file
uri_folder
mltable
Modelltypen.
mlflow_model
custom_model
Die folgenden primitiven Typen werden auch nur für Eingaben unterstützt:
- Einfache Typen
string
number
integer
boolean
Die Ausgabe des primitiven Typs wird nicht unterstützt.
Beispieleingaben und -ausgaben
Diese Beispiele stammen aus der Pipeline NYC Taxi Data Regression im GitHub-Repository mit Azure Machine Learning-Beispielen.
- Die Trainingskomponente verfügt über eine
number
-Eingabe namenstest_split_ratio
. - Die Vorbereitungskomponente verfügt über eine Ausgabe des Typs
uri_folder
. Der Quellcode der Komponente liest die CSV-Dateien aus dem Eingabeordner, verarbeitet die Dateien und schreibt die verarbeiteten CSV-Dateien in den Ausgabeordner. - Die Trainingskomponente verfügt über eine Ausgabe des Typs
mlflow_model
. Der Quellcode der Komponente speichert das trainierte Modell mithilfe der Methodemlflow.sklearn.save_model
.
Serialisierung von Ausgaben
Bei der Verwendung von Daten- oder Modellausgaben werden die Ausgaben serialisiert und als Dateien an einem Speicherort gespeichert. In späteren Schritten kann während der Auftragsausführung auf die Dateien zugegriffen werden, indem dieser Speicherort eingebunden wird oder die Dateien in das Computedateisystem herunter- oder hochgeladen werden.
Der Quellcode der Komponente muss das Ausgabeobjekt, das in der Regel im Arbeitsspeicher gespeichert ist, in Dateien serialisieren. Beispielsweise können Sie einen Pandas-DataFrame als CSV-Datei serialisieren. Azure Machine Learning definiert keine standardisierten Methoden für die Objektserialisierung. Sie haben die Flexibilität, Ihre bevorzugten Methoden zum Serialisieren von Objekten in Dateien auszuwählen. In der nachgelagerten Komponente können Sie auswählen, wie diese Dateien deserialisiert und gelesen werden sollen.
Pfad für die Ein- und Ausgabe von Datentypen
Für die Ein- und Ausgabe von Datenressourcen müssen Sie einen Pfadparameter angeben, der auf den Speicherort der Daten verweist. Die folgende Tabelle zeigt anhand von Beispielen für path
-Parameter die unterstützten Datenspeicherorte für Pipelineeingaben und -ausgaben in Azure Machine Learning.
Location | Eingabe | Ausgabe | Beispiel |
---|---|---|---|
Ein Pfad auf Ihrem lokalen Computer | ✓ | ./home/<username>/data/my_data |
|
Ein Pfad auf einem öffentlichen HTTP/S-Server | ✓ | https://raw.githubusercontent.com/pandas-dev/pandas/main/doc/data/titanic.csv |
|
Ein Pfad in Azure Storage | * | wasbs://<container_name>@<account_name>.blob.core.windows.net/<path> or abfss://<file_system>@<account_name>.dfs.core.windows.net/<path> |
|
Ein Pfad in einem Azure Machine Learning-Datenspeicher | ✓ | ✓ | azureml://datastores/<data_store_name>/paths/<path> |
Ein Pfad zu einer Datenressource | ✓ | ✓ | azureml:my_data:<version> |
* Die direkte Verwendung von Azure Storage wird für die Eingabe nicht empfohlen, da möglicherweise eine zusätzliche Identitätskonfiguration zum Lesen der Daten erforderlich ist. Besser ist es, Azure Machine Learning-Datenspeicherpfade zu verwenden, die für die verschiedenen Typen von Pipelineaufträgen unterstützt werden.
Modus für die Ein- und Ausgabe von Datentypen
Für Eingaben und Ausgaben von Datentypen können Sie aus mehreren Download-, Upload- und Einbindungsmodi wählen, um zu definieren, wie das Computeziel auf Daten zugreift. Die folgende Tabelle zeigt die unterstützten Modi für verschiedene Arten von Ein- und Ausgaben:
type | upload |
download |
ro_mount |
rw_mount |
direct |
eval_download |
eval_mount |
---|---|---|---|---|---|---|---|
uri_folder -Eingabe |
✓ | ✓ | ✓ | ||||
uri_file -Eingabe |
✓ | ✓ | ✓ | ||||
mltable -Eingabe |
✓ | ✓ | ✓ | ✓ | ✓ | ||
uri_folder -Ausgabe |
✓ | ✓ | |||||
uri_file -Ausgabe |
✓ | ✓ | |||||
mltable -Ausgabe |
✓ | ✓ | ✓ |
Derro_mount
- oder rw_mount
-Modus wird in den meisten Fällen empfohlen. Weitere Informationen finden Sie unter Modi.
Eingaben und Ausgaben in Pipelinegraphen
Auf der Seite des Pipelineauftrags in Azure Machine Learning Studio werden Ein- und -Ausgaben von Komponenten als kleine Kreise angezeigt. Diese werden als Eingabe-/Ausgabepunkte bezeichnet. Diese Punkte stellen den Datenfluss in der Pipeline dar. Die Ausgabe auf Pipelineebene wird zur einfachen Identifikation in lila Feldern angezeigt.
Der folgende Screenshot des Pipelinegraphen für NYC Taxi Data Regression zeigt zahlreiche Ein- und Ausgaben von Komponenten und Pipelines:
Wenn Sie auf einen Eingabe-/Ausgabepunkt zeigen, wird der Typ angezeigt
Im Pipelinegraphen werden keine Eingaben des primitiven Typs angezeigt. Diese Eingaben werden im Bereich Pipelineauftragsübersicht auf der Registerkarte Einstellungen für Eingaben auf Pipelineebene oder im Komponentenbereich für Eingaben auf Komponentenebene angezeigt. Sie können den Komponentenbereich durch Doppelklicken auf die Komponente im Graphen öffnen.
Wenn Sie eine Pipeline im Studio-Designer bearbeiten, befinden sich Pipelineeingaben und -ausgaben im Bereich Pipelineschnittstelle. Ein- und -ausgaben von Komponenten befinden sich im Komponentenbereich.
Höherstufen von Komponenteneingaben und -ausgaben auf Pipelineebene
Durch Höherstufen der Eingabe/Ausgabe einer Komponente auf Pipelineebene können Sie die Eingabe/Ausgabe der Komponente beim Übermitteln eines Pipelineauftrags überschreiben. Diese Möglichkeit ist besonders nützlich beim Auslösen von Pipelines mithilfe von REST-Endpunkten.
Die folgenden Beispiele veranschaulichen das Höherstufen von Eingaben/Ausgaben auf Komponentenebene auf Eingaben/Ausgaben auf Pipelineebene.
Die folgende Pipeline stuft drei Eingaben und drei Ausgaben auf Pipelineebene höher. Bei pipeline_job_training_max_epocs
handelt es sich z. B um eine Eingabe auf Pipelineebene, da sie im Abschnitt inputs
auf Stammebene deklariert wird.
Unter train_job
im Abschnitt jobs
wird auf die Eingabe mit dem Namen max_epocs
als ${{parent.inputs.pipeline_job_training_max_epocs}}
verwiesen, d. h., dass die Eingabe max_epocs
von train_job
auf die Eingabe pipeline_job_training_max_epocs
auf Pipelineebene verweist. Die Pipelineausgabe wird mithilfe desselben Schemas höhergestuft.
$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}}
Das vollständige Beispiel finden Sie unter train-score-eval-Pipeline mit registrierten Komponenten im Repository mit Azure Machine Learning-Beispielen.
Definieren optionaler Eingaben
Standardmäßig sind alle Eingaben erforderlich. Diese müssen über einen Standardwert verfügen, oder ihnen muss jedes Mal, wenn Sie einen Pipelineauftrag übermitteln, ein Wert zugewiesen werden. Sie können jedoch eine optionale Eingabe definieren.
Hinweis
Optionale Ausgaben werden nicht unterstützt.
Das Festlegen optionaler Eingaben kann in zwei Szenarien nützlich sein:
Wenn Sie eine optionale Daten- bzw. Modelltypeingabe definieren und dieser beim Übermitteln des Pipelineauftrags keinen Wert zuweisen, fehlt der Pipelinekomponente die Datenabhängigkeit. Wenn der Eingabepunkt der Komponente nicht mit einem Komponenten- oder Daten- bzw. Modellknoten verknüpft ist, ruft die Pipeline die Komponente direkt auf, anstatt auf eine vorherige Abhängigkeit zu warten.
Wenn Sie
continue_on_step_failure = True
für die Pipeline festlegen,node2
jedoch erforderliche Eingaben vonnode1
verwendet, wirdnode2
nicht ausgeführt, wenn beinode1
ein Fehler auftritt. Wenn dienode1
-Eingabe optional ist, wirdnode2
auch dann ausgeführt, wenn beinode1
ein Fehler auftritt. Im folgenden Graphen ist dieses Szenario dargestellt:
Das folgende Codebeispiel zeigt, wie eine optionale Eingabe definiert wird. Beim Festlegen der Eingabe als optional = true
müssen Sie $[[]]
verwenden, um die Befehlszeileneingaben wie in den hervorgehobenen Zeilen des Beispiels gezeigt einzuschließen:
$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}}
Anpassen von Ausgabepfaden
Standardmäßig wird die Komponentenausgabe im Standarddatenspeicher ({default_datastore}
), den Sie für die Pipeline festgelegt haben: azureml://datastores/${{default_datastore}}/paths/${{name}}/${{output_name}}
. Wenn er nicht angegeben wird, ist der Speicherort standardmäßig der Blobspeicher des Arbeitsbereichs.
Auftrag {name}
wird zur Ausführungszeit des Auftrags aufgelöst, und {output_name}
ist der Name, den Sie im YAML-Code der Komponente definiert haben. Sie können aber auch den Speicherort der Ausgabe anpassen, indem Sie einen Ausgabepfad definieren.
Die Datei pipeline.yml im Beispiel der train-score-eval-Pipeline mit registrierten Komponenten definiert eine Pipeline, die über drei Ausgaben auf Pipelineebene verfügt. Sie können mit folgendem Befehl die benutzerdefinierten Ausgabepfade für die pipeline_job_trained_model
-Ausgabe festlegen.
# 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
Herunterladen von Ausgaben
Sie können Ausgaben auf Pipeline- oder Komponentenebene herunterladen.
Herunterladen von Ausgaben auf Pipelineebene
Sie können alle Ausgaben eines Auftrags oder eine bestimmte Ausgabe herunterladen.
# 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>
Herunterladen von Komponentenausgaben
Um die Ausgaben einer untergeordneten Komponente herunterzuladen, listen Sie zunächst alle untergeordneten Aufträge eines Pipelineauftrags auf, und verwenden Sie dann ähnlichen Code, um die Ausgaben herunterzuladen.
# 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>
Registrieren von Ausgaben als benannte Ressource
Sie können die Ausgabe einer Komponente oder Pipeline als benannte Ressource registrieren, indem Sie der Ausgabe name
und version
zuweisen. Die registrierte Ressource kann in Ihrem Arbeitsbereich über die Studio-Benutzeroberfläche, die CLI oder das SDK aufgelistet und in zukünftigen Aufträgen im Arbeitsbereich referenziert werden.
Registrieren der Ausgabe auf Pipelineebene
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
Registrieren einer Komponentenausgabe
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