Freigeben über


Erstellen und Ausführen von Machine Learning-Pipelines mit Komponenten und der Azure Machine Learning-CLI

GILT FÜRAzure 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 erstellen, ohne Komponenten zu verwenden, aber Komponenten bieten Flexibilität und ermöglichen die Wiederverwendung. Azure Machine Learning-Pipelines können in YAML definiert und über die CLI ausgeführt werden, in Python erstellt oder im Azure Machine Learning Studio Designer über eine Drag-and-Drop-Benutzeroberfläche komponiert werden. Dieser Artikel konzentriert sich auf die CLI.

Voraussetzungen

Empfohlene Vorablektüre

Erstellen Sie Ihre erste Pipeline mit Komponenten

Zunächst erstellen Sie eine Pipeline mit Komponenten mithilfe eines Beispiels. Auf diese Weise erhalten Sie einen ersten Eindruck davon, wie eine Pipeline und Komponente in Azure Machine Learning aussieht.

Wechseln Sie im cli/jobs/pipelines-with-components/basics Verzeichnis des azureml-examples Repositorys zum 3b_pipeline_with_data Unterverzeichnis. Es gibt drei Arten von Dateien in diesem Verzeichnis. Dies sind die Dateien, die Sie erstellen müssen, wenn Sie eine eigene Pipeline erstellen.

  • pipeline.yml. Diese YAML-Datei definiert die Machine Learning-Pipeline. Es beschreibt, wie eine vollständige Machine Learning-Aufgabe in einen mehrstufigen Workflow unterteilt wird. Betrachten Sie beispielsweise die einfache maschinelle Lernaufgabe, historische Daten zu verwenden, um ein Vertriebsprognosemodell zu trainieren. Möglicherweise möchten Sie einen sequenziellen Workflow erstellen, der Datenverarbeitungs-, Modellschulungs- und Modellauswertungsschritte enthält. Jeder Schritt ist eine Komponente, die über eine klar definierte Schnittstelle verfügt und unabhängig entwickelt, getestet und optimiert werden kann. Die Pipeline-YAML definiert auch, wie die untergeordneten Schritte mit anderen Schritten in der Pipeline verbunden sind. Beispielsweise generiert der Modellschulungsschritt eine Modelldatei, und die Modelldatei wird an einen Modellauswertungsschritt übergeben.

  • component.yml. Diese YAML-Dateien definieren die Komponenten. Sie enthalten die folgenden Informationen:

    • Metadaten: Name, Anzeigename, Version, Beschreibung, Typ usw. Die Metadaten helfen beim Beschreiben und Verwalten der Komponente.
    • Schnittstelle: Eingaben und Ausgaben. Beispielsweise übernimmt eine Modellschulungskomponente Schulungsdaten und die Anzahl der Epochen als Eingabe und generiert eine trainierte Modelldatei als Ausgabe. Nachdem die Schnittstelle definiert wurde, 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. Der Befehl ist der Shellbefehl zum Ausführen der Komponente. Der Code bezieht sich in der Regel auf ein Quellcodeverzeichnis. Die Umgebung kann eine Azure Machine Learning-Umgebung (kuratiert oder vom Kunden erstellt), Docker-Image oder Conda-Umgebung sein.
  • component_src. Dies sind die Quellcodeverzeichnisse für bestimmte Komponenten. Sie enthalten den Quellcode, der in der Komponente ausgeführt wird. Sie können Ihre bevorzugte Sprache verwenden, einschließlich Python, R und anderen. Der Code muss von einem Shellbefehl ausgeführt werden. Der Quellcode kann einige Eingaben aus der Shell-Befehlszeile ausführen, um zu steuern, wie dieser Schritt ausgeführt wird. Ein Trainingsschritt kann beispielsweise Schulungsdaten, die Lernrate und die Anzahl der Epochen verwenden, um den Trainingsprozess zu steuern. Das Argument eines Shellbefehls wird verwendet, um Eingaben und Ausgaben an den Code zu übergeben.

Sie erstellen nun eine Pipeline mithilfe des 3b_pipeline_with_data Beispiels. Jede Datei wird in den folgenden Abschnitten weiter erläutert.

Listen Sie zunächst Ihre verfügbaren Computeressourcen mithilfe des folgenden Befehls auf:

az ml compute list

Wenn er nicht vorhanden ist, erstellen Sie einen Cluster namens cpu-cluster, indem Sie diesen 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 datei pipeline.yml definiert ist, indem Sie den folgenden Befehl ausführen. 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 Informationen zum Pipelineauftrag erhalten, einschließlich:

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. Er wird an diesem Punkt wahrscheinlich Preparing sein.

Wechseln Sie zur services.Studio.endpoint URL, um eine Visualisierung der Pipeline anzuzeigen:

Screenshot einer Visualisierung der Pipeline.

Verstehen der Pipelinedefinitions-YAML

Nun sehen Sie sich 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 folgenden Tabelle werden die am häufigsten verwendeten Felder des YaML-Pipelineschemas beschrieben. Weitere Informationen finden Sie im vollständigen YAML-Schema für Pipelines.

Schlüssel BESCHREIBUNG
type Erforderlich. Der Auftragstyp. Er muss für Pipelineaufträge pipeline sein.
display_name Der Anzeigename des Pipelineauftrags in der Studio-Benutzeroberfläche. Bearbeitbar in der Studio-Benutzeroberfläche. Er muss nicht für alle Aufträge im Arbeitsbereich eindeutig sein.
jobs Erforderlich. Ein 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 der aktuellen Version sind die unterstützten Auftragstypen in der Pipeline command und sweep.
inputs Ein 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> }} durch die Eingaben eines einzelnen Schrittauftrags in der Pipeline verwiesen werden.
outputs Ein Wörterbuch der Ausgabekonfigurationen des Pipelineauftrags. Der Schlüssel ist ein 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> }} durch die Ausgaben eines einzelnen Schrittauftrags in der Pipeline verwiesen werden.

Das 3b_pipeline_with_data Beispiel enthält eine dreistufige Pipeline.

  • Die drei Schritte sind unter jobs definiert. Alle drei Schritte sind vom Typ command. Jede Schrittdefinition befindet sich in einer entsprechenden component*.yml Datei. Die YAML-Komponentendateien werden im verzeichnis 3b_pipeline_with_data angezeigt. componentA.yml wird im nächsten Abschnitt beschrieben.
  • Diese Pipeline verfügt über Eine Datenabhängigkeit, die in realen Pipelines üblich ist. Komponente A übernimmt Dateneingaben aus einem lokalen Ordner unter ./data (Zeilen 18-21) und übergibt die Ausgabe an Komponente B (Zeile 29). Die Ausgabe von Komponente A kann als ${{parent.jobs.component_a.outputs.component_a_output}} bezeichnet werden.
  • default_compute definiert die Standardberechnung für die Pipeline. Wenn eine Komponente in jobs eine andere Berechnung definiert, werden die komponentenspezifischen Einstellungen berücksichtigt.

Screenshot der Pipeline mit Datenbeispiel.

Lesen und Schreiben von Daten in einer Pipeline

Ein häufiges Szenario ist das Lesen und Schreiben von Daten in einer Pipeline. In Azure Machine Learning verwenden Sie dasselbe Schema zum Lesen und Schreiben von Daten für alle Arten von Aufträgen (Pipelineaufträge, Befehlsaufträge und Aufräumen von Aufträgen). Im Folgenden finden Sie Beispiele für die Verwendung von Daten in Pipelines für häufige Szenarien:

Grundlegendes zur Komponentendefinitions-YAML

Dies ist die componentA.yml-Datei , ein Beispiel für YAML, das eine Komponente definiert:

$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}}

Diese Tabelle definiert die am häufigsten verwendeten Felder von Komponenten-YAML. Weitere Informationen finden Sie im vollständigen YAML-Schema für Komponenten.

Schlüssel BESCHREIBUNG
name Erforderlich. Der Name der Komponente. Er muss im Azure Machine Learning-Arbeitsbereich eindeutig sein. Er muss mit einem Kleinbuchstaben beginnen. Kleinbuchstaben, Zahlen und Unterstriche (_) sind zulässig. Die maximale Länge beträgt 255 Zeichen.
display_name Der Anzeigename der Komponente in der Studio-Benutzeroberfläche. Er muss innerhalb des Arbeitsbereichs nicht eindeutig sein.
command Erforderlich. Der auszuführende Befehl.
code Der lokale 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 Ein Wörterbuch mit Komponenteneingaben. Der Schlüssel ist ein Name für die Eingabe im Kontext der Komponente, und der Wert ist die Komponenteneingabedefinition. Sie können mithilfe des ${{ inputs.<input_name> }} Ausdrucks auf Eingaben im Befehl verweisen.
outputs Ein Wörterbuch der Komponentenausgänge. Der Schlüssel ist ein Name für die Ausgabe im Kontext der Komponente, und der Wert ist die Komponentenausgabedefinition. Sie können im Befehl auf Ausgaben verweisen, indem Sie den Ausdruck ${{ outputs.<output_name> }} verwenden.
is_deterministic Gibt an, ob das Ergebnis des vorherigen Auftrags wiederverwendet werden soll, wenn sich die Komponenteneingaben nicht ändern. Der Standardwert ist true. Diese Einstellung wird auch standardmäßig als Wiederverwendung bezeichnet. Das übliche Szenario, wenn auf false festgelegt, besteht darin, das erneute Laden von Daten aus dem Cloud-Speicher oder von einer URL zu erzwingen.

Im Beispiel in 3b_pipeline_with_data/componentA.yml verfügt Komponente A über eine Dateneingabe und eine Datenausgabe, die mit anderen Schritten in der übergeordneten Pipeline verbunden werden kann. Alle Dateien im code Abschnitt in der Komponente 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 sehen: Doppelklicken Sie auf den ComponentA-Schritt im Diagramm, und wechseln Sie zur Registerkarte "Code ", wie im folgenden Screenshot gezeigt. Sie können sehen, 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 übernimmt Eingaben und stellt die Ausgabe über die Befehlszeile bereit. Es wird in hello.py über argparsebehandelt.

Screenshot der Pipeline mit Datenbeispiel. Die Komponente A wird angezeigt.

Eingabe und Ausgabe

Eingabe und Ausgabe definieren die Schnittstelle einer Komponente. Eingabe- und Ausgabewerte können Literalwerte (vom Typ string, , number, integeroder boolean) oder ein Objekt sein, das ein Eingabeschema enthält.

Objekteingaben (vom Typ uri_file, uri_folder, , mltable, mlflow_modeloder custom_model) können eine Verbindung mit anderen Schritten im übergeordneten Pipelineauftrag herstellen, um Daten/Modelle an andere Schritte zu ü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 einen Standardwert von Literaleingaben im default Feld hinzufügen. Für number- und integer-Typen können Sie auch Mindest- und Höchstwerte hinzufügen, indem Sie die min und max Felder verwenden. Wenn der Eingabewert kleiner als das Minimum oder mehr als das Maximum ist, schlägt die Pipeline bei der Überprüfung fehl. Die Überprüfung erfolgt, bevor Sie einen Pipeline-Auftrag übermitteln, was Zeit sparen kann. Die Validierung funktioniert für die CLI, das Python SDK und die Designer-Benutzeroberfläche. Der folgende Screenshot zeigt ein Überprüfungsbeispiel in der Designer-Benutzeroberfläche. Ebenso können Sie zulässige Werte in enum Feldern 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, müssen Sie an drei Stellen Bearbeitungen vornehmen:

  • Das inputs Feld in der Komponente YAML.
  • Das command Feld in der Komponente YAML.
  • Im Quellcode der Komponente zum Verarbeiten der Befehlszeileneingabe.

Diese Speicherorte sind mit grünen Feldern im vorherigen Screenshot gekennzeichnet.

Weitere Informationen zu Eingaben und Ausgaben finden Sie unter Verwalten von Eingaben und Ausgaben für Komponenten und Pipelines.

Umgebungen

Die Umgebung ist die Umgebung, in der die Komponente ausgeführt wird. Es kann sich um eine Azure Machine Learning-Umgebung (kuratiert oder benutzerdefiniert), ein Docker-Image oder eine Conda-Umgebung handeln. Sehen Sie sich die folgenden Beispiele an:

Registrieren einer Komponente für die Wiederverwendung und Freigabe

Obwohl einige Komponenten für eine bestimmte Pipeline spezifisch sind, kommt der eigentliche Vorteil von Komponenten aus der Wiederverwendung und dem Austausch. Sie können eine Komponente in Ihrem Machine Learning-Arbeitsbereich registrieren, um sie für die Wiederverwendung verfügbar zu machen. Registrierte Komponenten unterstützen die automatische Versionsverwaltung, sodass Sie die Komponente aktualisieren können, aber sicherstellen, dass Pipelines, die eine ältere Version erfordern, weiterhin funktionieren.

Wechseln Sie im Azureml-Beispielrepository zum cli/jobs/pipelines-with-components/basics/1b_e2e_registered_components Verzeichnis.

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

Nachdem diese Befehle zum Abschluss ausgeführt wurden, können Sie die Komponenten im Studio unter "Ressourcenkomponenten>" sehen:

Screenshot von Studio. Es zeigt die registrierten Komponenten an.

Wählen Sie eine Komponente aus. Ausführliche Informationen zu jeder Version der Komponente werden angezeigt.

Auf der Registerkarte "Details werden grundlegende Informationen wie der Komponentenname, wer sie erstellt hat, und die Version angezeigt. Es gibt bearbeitbare Felder für Tags und Beschreibungen. Sie können Tags verwenden, um Suchstichwörter hinzuzufügen. Das Beschreibungsfeld unterstützt die Markdown-Formatierung. Sie sollten sie verwenden, um die Funktionalität und grundlegende Verwendung Ihrer Komponente zu beschreiben.

Auf der Registerkarte "Aufträge " wird der Verlauf aller Aufträge angezeigt, die die Komponente verwenden.

Verwenden registrierter Komponenten in einer YAML-Datei für einen Pipelineauftrag

Sie werden jetzt 1b_e2e_registered_components als Beispiel verwenden, um zu zeigen, wie man registrierte Komponenten in Pipeline YAML nutzt. Wechseln Sie zum 1b_e2e_registered_components Verzeichnis, und öffnen Sie die pipeline.yml Datei. 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 component Wert befindet sich in der Form azureml:<component_name>:<component_version>. Die train-job Definition gibt beispielsweise an, dass die neueste Version der registrierten Komponente my_train verwendet werden soll:

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 Komponenten mithilfe von CLI v2 verwalten. Verwenden Sie az ml component -h, um detaillierte Anweisungen zu Komponentenbefehlen zu erhalten. In der folgenden Tabelle sind alle verfügbaren Befehle aufgeführt. Weitere Beispiele finden Sie in der Azure CLI-Referenz.

Befehl BESCHREIBUNG
az ml component create Erstellen Sie eine Komponente.
az ml component list Listet die Komponenten in einem Arbeitsbereich auf.
az ml component show Zeigen Sie die Details einer Komponente an.
az ml component update Aktualisieren einer Komponente. Nur einige Felder (Beschreibung, display_name) unterstützen das Update.
az ml component archive Archiviere einen Komponentencontainer.
az ml component restore Stellen Sie eine archivierte Komponente wieder her.

Nächster Schritt