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

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.

Screenshot: Graphvisualisierung der Pipeline

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 entsprechenden component.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 unter jobs eine andere Computeressource für diese Komponente definiert, berücksichtigt das System die komponentenspezifische Einstellung.

Screenshot der Pipeline mit Datenbeispiel.

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.

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.

Screenshot einer Pipeline mit Datenbeispiel, das Komponente A zeigt.

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.

Screenshot: Eingabe und Ausgabe der Komponente zum Trainieren eines Modells für die lineare Regression

Wenn Sie einer Komponente eine Eingabe hinzufügen möchten, denken Sie daran, drei Stellen zu bearbeiten:

  • inputs-Feld im YAML-Komponentenschema
  • command-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:

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:

Screenshot: Studio mit den soeben registrierten Komponenten

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