Erstellen und Ausführen von Machine Learning-Pipelines mit Komponenten und der Azure Machine Learning-CLI
GILT FÜR Azure CLI-ML-Erweiterung v2 (aktuell)
In diesem Artikel erfahren Sie, wie Sie Machine Learning-Pipelines mit der Azure CLI und Komponenten erstellen und ausführen. Sie können Pipelines ohne Komponenten erstellen, Komponenten bieten aber die größte Flexibilität und die meisten Möglichkeiten zur Wiederverwendung. Azure Machine Learning-Pipelines können in YAML definiert und über die CLI ausgeführt, in Python erstellt oder im Azure Machine Learning Studio-Designer mit einer Drag & Drop-Benutzeroberfläche erstellt werden. In diesem Dokument liegt der Schwerpunkt auf der Befehlszeilenschnittstelle.
Voraussetzungen
Wenn Sie nicht über ein Azure-Abonnement verfügen, können Sie ein kostenloses Konto erstellen, bevor Sie beginnen. Probieren Sie die kostenlose oder kostenpflichtige Version von Azure Machine Learning aus.
Ein Azure Machine Learning-Arbeitsbereich. Erstellen von Arbeitsbereichsressourcen
Installieren und Einrichten der Azure CLI-Erweiterung für Machine Learning
Klonen Sie das Beispielrepository:
git clone https://github.com/Azure/azureml-examples --depth 1 cd azureml-examples/cli/jobs/pipelines-with-components/basics
Empfohlene Vorablektüre
Erstellen Ihrer ersten Pipeline mit Komponente
Erstellen wir Ihre erste Pipeline mit Komponente anhand eines Beispiels. Dieser Abschnitt möchte Ihnen anhand eines konkreten Beispiels einen ersten Eindruck davon vermitteln, wie eine Pipeline und eine Komponente in Azure Machine Learning aussehen.
Navigieren Sie vom Verzeichnis cli/jobs/pipelines-with-components/basics
des azureml-examples
-Repositorys zum Unterverzeichnis 3b_pipeline_with_data
. Es gibt drei Arten von Dateien in diesem Verzeichnis. Dies sind die Dateien, die Sie beim Erstellen Ihrer eigenen Pipeline benötigen.
pipeline.yml: Diese YAML-Datei definiert die Machine Learning-Pipeline. In dieser YAML-Datei wird beschrieben, wie Sie eine vollständige Machine Learning-Aufgabe in einen mehrschrittigen Workflow aufteilen. Wenn Sie beispielsweise eine einfache Machine Learning-Aufgabe betrachten, bei der historische Daten zum Trainieren eines Verkaufsvorhersagemodells verwendet werden, sollten Sie einen sequenziellen Workflow mit Datenverarbeitungs-, Modelltrainings- und Modellbewertungsschritten erstellen. Jeder Schritt ist eine Komponente, die über eine gut definierte Schnittstelle verfügt und unabhängig entwickelt, getestet und optimiert werden kann. Das YAML-Pipelineschema definiert außerdem, wie die untergeordneten Schritte mit anderen Schritten in der Pipeline verbunden sind, z. B. generiert der Modelltrainingsschritt eine Modelldatei, und die Modelldatei wird an einen Modellbewertungsschritt übergeben.
component.yml: Diese YAML-Datei definiert die Komponente. Darin sind folgende Informationen enthalten:
- Metadaten: Name, Anzeigename, Version, Beschreibung, Typ usw. Die Metadaten helfen, die Komponente zu beschreiben und zu verwalten.
- Schnittstelle: Ein- und Ausgaben. Beispielsweise übernimmt eine Modelltrainingskomponente Trainingsdaten und die Anzahl der Epochen als Eingabe und generiert eine trainierte Modelldatei als Ausgabe. Sobald die Schnittstelle definiert ist, können verschiedene Teams die Komponente unabhängig entwickeln und testen.
- Befehl, Code und Umgebung: Der Befehl, Code und die Umgebung zum Ausführen der Komponente. Befehl ist der Shellbefehl, um die Komponente auszuführen. Code bezieht sich in der Regel auf ein Quellcodeverzeichnis. Als Umgebung kommen eine Azure Machine Learning-Umgebung (kuratiert oder vom Kunden erstellt), ein Docker-Image oder eine Conda-Umgebung infrage.
component_src: Dies ist das Quellcodeverzeichnis für eine bestimmte Komponente. Sie enthält den Quellcode, der in der Komponente ausgeführt wird. Sie können Ihre bevorzugte Sprache (Python, R...) verwenden. Der Code muss von einem Shellbefehl ausgeführt werden. Der Quellcode kann einige Eingaben von der Shellbefehlszeile übernehmen, um zu steuern, wie dieser Schritt ausgeführt werden soll. Beispielsweise kann ein Trainingsschritt Trainingsdaten, Lerngeschwindigkeit und Anzahl der Epochen zum Steuern des Trainingsprozesses als Eingabe akzeptieren. Das Argument eines Shellbefehls wird verwendet, um Eingaben und Ausgaben an den Code zu übergeben.
Erstellen wir nun eine Pipeline mithilfe des 3b_pipeline_with_data
-Beispiels. Wir erläutern die detaillierte Bedeutung jeder Datei in den folgenden Abschnitten.
Listen Sie zunächst Ihre verfügbaren Computeressourcen mit dem folgenden Befehl auf:
az ml compute list
Falls Sie über keinen Cluster verfügen, erstellen Sie einen mit dem Namen cpu-cluster
, indem Sie folgenden Befehl ausführen:
Hinweis
Überspringen Sie diesen Schritt, um serverloses Rechnen zu verwenden.
az ml compute create -n cpu-cluster --type amlcompute --min-instances 0 --max-instances 10
Erstellen Sie nun einen Pipelineauftrag, der in der „pipeline.yml“-Datei mit dem folgenden Befehl definiert ist. Das Computeziel wird in der „pipeline.yml“-Datei als azureml:cpu-cluster
referenziert. Wenn Ihr Computeziel einen anderen Namen verwendet, denken Sie daran, ihn in der „pipeline.yml“-Datei zu aktualisieren.
az ml job create --file pipeline.yml
Sie sollten ein JSON-Wörterbuch mit den folgenden Informationen zum Pipelineauftrag erhalten:
Schlüssel | BESCHREIBUNG |
---|---|
name |
Der GUID-basierte Name des Auftrags |
experiment_name |
Der Name, unter dem Aufträge in Studio organisiert werden |
services.Studio.endpoint |
Eine URL zum Überwachen und Überprüfen des Pipelineauftrags |
status |
Der Status des Auftrags. Dieser wird zu diesem Zeitpunkt wahrscheinlich Preparing lauten. |
Öffnen Sie die services.Studio.endpoint
-URL, um eine Diagrammvisualisierung der Pipeline anzuzeigen.
Verstehen der Pipelinedefinitions-YAML
Sehen wir uns die Pipelinedefinition in der Datei 3b_pipeline_with_data/pipeline.yml an.
Hinweis
Um serverloses Computing zu verwenden, ersetzen Sie in dieser Datei default_compute: azureml:cpu-cluster
durch default_compute: azureml:serverless
.
$schema: https://azuremlschemas.azureedge.net/latest/pipelineJob.schema.json
type: pipeline
display_name: 3b_pipeline_with_data
description: Pipeline with 3 component jobs with data dependencies
settings:
default_compute: azureml:cpu-cluster
outputs:
final_pipeline_output:
mode: rw_mount
jobs:
component_a:
type: command
component: ./componentA.yml
inputs:
component_a_input:
type: uri_folder
path: ./data
outputs:
component_a_output:
mode: rw_mount
component_b:
type: command
component: ./componentB.yml
inputs:
component_b_input: ${{parent.jobs.component_a.outputs.component_a_output}}
outputs:
component_b_output:
mode: rw_mount
component_c:
type: command
component: ./componentC.yml
inputs:
component_c_input: ${{parent.jobs.component_b.outputs.component_b_output}}
outputs:
component_c_output: ${{parent.outputs.final_pipeline_output}}
# mode: upload
In der Tabelle werden die am häufigsten verwendeten Felder des YAML-Schemas für Pipelines beschrieben. Weitere Informationen finden Sie im vollständigen YAML-Schema für Pipelines.
Schlüssel | description |
---|---|
type | Erforderlich. Auftragstyp muss pipeline für Pipelineaufträge sein. |
display_name | Der Anzeigename des Pipelineauftrags in der Studio-Benutzeroberfläche. Bearbeitbar in der Studio-Benutzeroberfläche. Muss nicht über alle Aufträge im Arbeitsbereich hinweg eindeutig sein. |
jobs | Erforderlich. Das Wörterbuch der einzelnen Aufträge, die als Schritte innerhalb der Pipeline ausgeführt werden sollen. Diese Aufträge werden als untergeordnete Aufträge des übergeordneten Pipelineauftrags betrachtet. In diesem Release sind die unterstützten Auftragstypen in der Pipeline command und sweep . |
inputs | Das Wörterbuch der Eingaben für den Pipelineauftrag. Der Schlüssel ist ein Name für die Eingabe im Kontext des Auftrags, und der Wert ist der Eingabewert. Auf diese Pipelineeingaben kann mithilfe des Ausdrucks „${{ parent.inputs.<input_name> }}“ über die Eingaben eines einzelnen Schrittauftrags in der Pipeline verwiesen werden. |
outputs | Das Wörterbuch der Ausgabekonfigurationen des Pipelineauftrags. Der Schlüssel ist de Name für die Ausgabe im Kontext des Auftrags, und der Wert ist die Ausgabekonfiguration. Auf diese Pipelineausgaben kann mithilfe des Ausdrucks „${{ parents.outputs.<output_name> }}“ über die Ausgaben eines einzelnen Schrittauftrags in der Pipeline verwiesen werden. |
Im 3b_pipeline_with_data-Beispiel haben wir eine dreischrittige Pipeline erstellt.
- Die drei Schritte sind unter
jobs
definiert. Der Typ aller drei Schritte ist Befehlsauftrag. Die Definition jedes Schritts befindet sich in der entsprechendencomponent.yml
-Datei. Sie können die YAML-Komponentendateien unter dem Verzeichnis 3b_pipeline_with_data anzeigen. Wir erläutern die Datei „componentA.yml“ im nächsten Abschnitt. - Diese Pipeline verfügt über eine Datenabhängigkeit, die häufig in den meisten realen Pipelines vorkommt. Component_a akzeptiert die Dateneingabe aus dem lokalem Ordner unter
./data
(Zeile 17–20) und übergibt ihre Ausgabe an componentB (Zeile 29). Die Ausgabe von component_a kann als${{parent.jobs.component_a.outputs.component_a_output}}
referenziert werden. compute
definiert die Standardcomputeressource für diese Pipeline. Wenn eine Komponente unterjobs
eine andere Computeressource für diese Komponente definiert, berücksichtigt das System die komponentenspezifische Einstellung.
Lesen und Schreiben von Daten in einer Pipeline
Ein gängiges Szenario besteht darin, Daten in Ihrer Pipeline zu lesen und zu schreiben. In Azure Machine Learning verwenden wir dasselbe Schema zum Lesen und Schreiben von Daten für alle Arten von Aufträgen (Pipelineauftrag, Befehlsauftrag und Sweepauftrag). Nachfolgend finden Sie Beispiele für Pipelineaufträge, in denen Daten für allgemeine Szenarien verwendet werden.
- Lokale Daten
- Webdatei mit öffentlicher URL
- Azure Machine Learning-Datenspeicher und -Pfad
- Azure Machine Learning-Datenressource
Grundlegendes zur Komponentendefinitions-YAML
Sehen wir uns nun die componentA.yml als Beispiel an, um die Komponentendefinitions-YAML zu verstehen.
$schema: https://azuremlschemas.azureedge.net/latest/commandComponent.schema.json
type: command
name: component_a
display_name: componentA
version: 1
inputs:
component_a_input:
type: uri_folder
outputs:
component_a_output:
type: uri_folder
code: ./componentA_src
environment:
image: python
command: >-
python hello.py --componentA_input ${{inputs.component_a_input}} --componentA_output ${{outputs.component_a_output}}
Das am häufigsten verwendete YAML-Schema für Komponenten ist in der nachstehenden Tabelle beschrieben. Weitere Informationen finden Sie im vollständigen YAML-Schema für Komponenten.
Schlüssel | description |
---|---|
name | Erforderlich. Der Name der Komponente. Muss im Azure Machine Learning-Arbeitsbereich eindeutig sein. Muss mit einem Kleinbuchstaben beginnen. Zulässig sind Kleinbuchstaben, Zahlen und Unterstriche (_). Die maximale Länge beträgt 255 Zeichen. |
display_name | Anzeigename der Komponente auf der Studio-Benutzeroberfläche Kann innerhalb des Arbeitsbereichs uneindeutig sein. |
Befehl | Erforderlich: Der auszuführende Befehl. |
code | Lokaler Pfad zum Quellcodeverzeichnis, das hochgeladen und für die Komponente verwendet werden soll |
Environment | Erforderlich. Die Umgebung, die zum Ausführen der Komponente verwendet wird. |
inputs | Wörterbuch der Komponenteneingaben Der Schlüssel ist ein Name für die Eingabe im Kontext der Komponente, und der Wert ist die Komponenteneingabedefinition. Im Befehl kann mithilfe des Ausdrucks „${{ inputs.<input_name> }}“ auf Eingaben referenziert werden. |
outputs | Wörterbuch der Komponentenausgaben Der Schlüssel ist ein Name für die Ausgabe im Kontext der Komponente, und der Wert ist die Komponentenausgabedefinition. Im Befehl kann mithilfe des Ausdrucks „${{ outputs.<output_name> }}“ auf Ausgaben referenziert werden. |
is_deterministic | Gibt an, ob das Ergebnis des vorherigen Auftrags wiederverwendet werden soll, wenn sich die Komponenteneingaben nicht geändert haben. Der Standardwert ist true , auch als „standardmäßig wiederverwenden“ bezeichnet. Das allgemeine Szenario bei Festlegung auf false ist das Erzwingen des erneuten Ladens von Daten aus einem Cloudspeicher oder einer URL. |
Für das Beispiel in 3b_pipeline_with_data/componentA.yml verfügt componentA über eine Dateneingabe und eine Datenausgabe, die mit anderen Schritten in der übergeordneten Pipeline verbunden werden können. Alle Dateien im Abschnitt code
im Komponenten-YAML werden beim Übermitteln des Pipelineauftrags in Azure Machine Learning hochgeladen. In diesem Beispiel werden Dateien unter ./componentA_src
hochgeladen (Zeile 16 in componentA.yml). Sie können den hochgeladenen Quellcode in der Studio-Benutzeroberfläche wie folgt anzeigen: Doppelklicken Sie auf den ComponentA-Schritt, und navigieren Sie zur Registerkarte „Momentaufnahme“, wie im folgenden Screenshot gezeigt. Wir stellen fest, dass es sich um ein „Hello World“-Skript handelt, das nur eine einfache Ausgabe vornimmt sowie das aktuelle Datum mit Uhrzeit in den componentA_output
-Pfad schreibt. Die Komponente verwendet Eingabe und Ausgabe über das Befehlszeilenargument und wird in hello.py mithilfe von argparse
verarbeitet.
Eingabe und Ausgabe
Eingabe und Ausgabe definieren die Schnittstelle einer Komponente. Eingabe und Ausgabe können entweder ein Literalwert (vom Typ string
, number
, integer
oder boolean
) oder ein Objekt sein, das ein Eingabeschema enthält.
Objekteingabe (vom Typ uri_file
, uri_folder
, mltable
, mlflow_model
, custom_model
) kann mit anderen Schritten im übergeordneten Pipelineauftrag verbunden werden und somit Daten/Modell an andere Schritte übergeben. Im Pipelinediagramm wird die Objekttypeingabe als Verbindungspunkt gerendert.
Literalwerteingaben (string
, number
, integer
, boolean
) sind die Parameter, die Sie zur Laufzeit an die Komponente übergeben können. Sie können den Standardwert von Literaleingaben unter dem default
-Feld hinzufügen. Für den Typ number
und integer
können Sie auch den Mindest- und Höchstwert für den akzeptierten Wert mithilfe der Felder min
und max
hinzufügen. Wenn der Eingabewert den Mindest- bzw. Höchstwert überschreitet, schlägt die Überprüfung der Pipeline fehl. Die Überprüfung erfolgt, bevor Sie einen Pipelineauftrag übermitteln, um Ihnen Zeit zu sparen. Die Überprüfung funktioniert für CLI, Python SDK und die Designer-Benutzeroberfläche. Im folgenden Screenshot wird ein Überprüfungsbeispiel in der Designer-Benutzeroberfläche gezeigt. Auf ähnliche Weise können Sie zulässige Werte im enum
-Feld definieren.
Wenn Sie einer Komponente eine Eingabe hinzufügen möchten, denken Sie daran, drei Stellen zu bearbeiten:
inputs
-Feld im YAML-Komponentenschemacommand
-Feld im YAML-Komponentenschema- Quellcode der Komponente zum Verarbeiten der Befehlszeileneingabe. Ist im obigen Screenshot mit einem grünen Rahmen markiert.
Weitere Informationen zu Eingaben und Ausgaben finden Sie unter Verwalten von Eingaben und Ausgaben von Komponenten und Pipelines.
Environment
Die Umgebung definiert die Umgebung zum Ausführen der Komponente. Dies kann eine Azure Machine Learning-Umgebung (kuratiert oder vom Kunden erstellt), ein Docker-Image oder eine Conda-Umgebung sein. Siehe folgende Beispiele:
- In Azure Machine Learning registrierte Umgebungsressource. Wird in der Komponente mit der
azureml:<environment-name>:<environment-version>
-Syntax referenziert. - Öffentliches Docker-Image
- Conda-Datei: Die Conda-Datei muss zusammen mit einem Basisimage verwendet werden.
Registrieren der Komponente zur Wiederverwendung und Freigabe
Einige Komponenten sind zwar pipelinespezifisch, der eigentliche Vorteil von Komponenten ist jedoch die Möglichkeit zur Wiederverwendung und Freigabe. Registrieren Sie eine Komponente in Ihrem Machine Learning-Arbeitsbereich, um sie wiederverwendbar zu machen. Registrierte Komponenten unterstützen die automatische Versionierung. Dadurch können Sie die Komponente aktualisieren und gleichzeitig sicherstellen, dass Pipelines, die eine ältere Version erfordern, weiterhin funktionieren.
Navigieren Sie im Repository „azureml-examples“ zum Verzeichnis cli/jobs/pipelines-with-components/basics/1b_e2e_registered_components
.
Verwenden Sie zum Registrieren einer Komponente den Befehl az ml component create
:
az ml component create --file train.yml
az ml component create --file score.yml
az ml component create --file eval.yml
Nach vollständiger Ausführung dieser Befehle werden die Komponenten in Studio unter „Ressource -> Komponenten“ angezeigt:
Wählen Sie eine Komponente aus. Ausführliche Informationen zu jeder Version der Komponente werden angezeigt.
Auf der Registerkarte Details werden grundlegende Informationen zur Komponente wie „Name“, „Erstellt von“, „Version“ usw. angezeigt. Es werden bearbeitbare Felder für Tags und „Beschreibung“ angezeigt. Die Tags können zum Hinzufügen schnell suchbarer Schlüsselwörter verwendet werden. Das Beschreibungsfeld unterstützt das Markdownformat und kann verwendet werden, um die Funktion und die grundlegende Verwendung Ihrer Komponente zu beschreiben.
Auf der Registerkarte Aufträge wird der Verlauf aller Aufträge angezeigt, die diese Komponente verwenden.
Verwenden registrierter Komponenten in einer YAML-Datei für einen Pipelineauftrag
Verwenden wir die 1b_e2e_registered_components
, um zu demonstrieren, wie registrierte Komponenten in Pipeline-YAML verwendet werden. Navigieren Sie zum Verzeichnis 1b_e2e_registered_components
, und öffnen Sie die Datei pipeline.yml
. Die Schlüssel und Werte in den Feldern inputs
und outputs
ähneln den bereits erläuterten Elementen. Der einzige signifikante Unterschied ist der Wert des Felds component
in den jobs.<JOB_NAME>.component
-Einträgen. Der Wert vom Typ component
hat das Format azureml:<COMPONENT_NAME>:<COMPONENT_VERSION>
. In der Definition train-job
wird beispielsweise angegeben, dass die neueste Version der registrierten Komponente my_train
verwendet werden muss:
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:
Verwalten von Komponenten
Sie können Komponentendetails überprüfen und die Komponente mithilfe der CLI (v2) verwalten. Verwenden Sie az ml component -h
, um ausführliche Anweisungen zum Komponentenbefehl abzurufen. In der folgenden Tabelle sind alle verfügbaren Befehle aufgeführt. Weitere Beispiele finden Sie in der Azure CLI-Referenz.
befehle | description |
---|---|
az ml component create |
Erstellen einer Komponente |
az ml component list |
Auflisten von Komponenten in einem Arbeitsbereich. |
az ml component show |
Anzeigen von Details für eine Komponente. |
az ml component update |
Aktualisieren einer Komponente. Nur ein paar Felder (Beschreibung, display_name (Anzeigenamen)) unterstützen Aktualisierungen. |
az ml component archive |
Archivieren eines Komponentencontainers. |
az ml component restore |
Wiederherstellen einer archivierten Komponente. |
Nächste Schritte
- Probieren Sie das CLI v2-Komponentenbeispiel.