Operationalisieren einer Trainingspipeline mit Batchendpunkten
GILT FÜR:Azure CLI ML-Erweiterung v2 (aktuell)
Python SDK azure-ai-ml v2 (aktuell)
In diesem Artikel erfahren Sie, wie Sie eine Trainingspipeline unter einem Batchendpunkt operationalisieren. Die Pipeline verwendet mehrere Komponenten (oder Schritte), die Modelltraining, Datenvorverarbeitung und Modellauswertung umfassen.
Sie lernen Folgendes:
- Erstellen und Testen einer Trainingspipeline
- Bereitstellen der Pipeline auf einem Batchendpunkt
- Ändern der Pipeline und Erstellen einer neuen Bereitstellung im selben Endpunkt
- Testen der neuen Bereitstellung und Festlegen als Standardbereitstellung
Über dieses Beispiel
In diesem Beispiel wird eine Trainingspipeline bereitgestellt, die Eingabetrainingsdaten (mit Bezeichnung) akzeptiert und ein Vorhersagemodell zusammen mit den Auswertungsergebnissen und den während der Vorverarbeitung angewendeten Transformationen erstellt. Die Pipeline verwendet Tabellendaten aus dem UCI-Dataset für Herzerkrankungen, um ein XGBoost-Modell zu trainieren. Wir verwenden eine Datenvorverarbeitungskomponente für die Vorverarbeitung der Daten, die dann an die Trainingskomponente gesendet werden, um das Modell anzupassen und auszuwerten.
Die Pipeline kann wie folgt visualisiert werden:
Das Beispiel in diesem Artikel basiert auf Codebeispielen, die im Repository azureml-examples enthalten sind. Wenn Sie die Befehle lokal ausführen möchten, ohne YAML und andere Dateien kopieren oder einfügen zu müssen, verwenden Sie die folgenden Befehle, um das Repository zu klonen und zum Ordner für Ihre Programmiersprache zu wechseln:
git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli
Die Dateien für dieses Beispiel befinden sich in:
cd endpoints/batch/deploy-pipelines/training-with-components
Verfolgen in Jupyter-Notebooks
Sie können der Python SDK-Version dieses Beispiels folgen, indem Sie das Notebook sdk-deploy-and-test.ipynb im geklonten Repository öffnen.
Voraussetzungen
Ein Azure-Abonnement. Wenn Sie kein Azure-Abonnement besitzen, können Sie ein kostenloses Konto erstellen, bevor Sie beginnen.
Ein Azure Machine Learning-Arbeitsbereich. Informationen zum Erstellen eines Arbeitsbereichs finden Sie unter Verwalten von Azure Machine Learning-Arbeitsbereichen.
Die folgenden Berechtigungen im Azure Machine Learning-Arbeitsbereich:
- Zum Erstellen oder Verwalten von Batchendpunkten und Bereitstellungen: Verwenden Sie die Rolle „Besitzer“ oder „Mitwirkender“ oder eine benutzerdefinierte Rolle, der die
Microsoft.MachineLearningServices/workspaces/batchEndpoints/*
-Berechtigungen zugewiesen wurden. - Zum Erstellen von Azure Resource Manager-Bereitstellungen in der Arbeitsbereichsressourcengruppe: Verwenden Sie die Rolle „Besitzer“ oder „Mitwirkender“ oder eine benutzerdefinierte Rolle, der die
Microsoft.Resources/deployments/write
-Berechtigung in der Ressourcengruppe zugewiesen wurde, in der der Arbeitsbereich bereitgestellt wird.
- Zum Erstellen oder Verwalten von Batchendpunkten und Bereitstellungen: Verwenden Sie die Rolle „Besitzer“ oder „Mitwirkender“ oder eine benutzerdefinierte Rolle, der die
Azure Machine Learning-CLI oder Azure Machine Learning-SDK für Python:
Führen Sie den folgenden Befehl aus, um die Azure CLI und die
ml
-Erweiterung für Azure Machine Learning zu installieren:az extension add -n ml
Bereitstellungen der Pipelinekomponenten für Batchendpunkte werden in Version 2.7 der
ml
-Erweiterung für die Azure CLI eingeführt. Verwenden Sie denaz extension update --name ml
-Befehl, um die aktuelle Version abzurufen.
Herstellen einer Verbindung mit Ihrem Arbeitsbereich
Der Arbeitsbereich ist die Ressource der obersten Ebene für Azure Machine Learning. Er bietet einen zentralen Ort für die Arbeit mit allen Artefakten, die Sie bei der Verwendung von Azure Machine Learning erstellen. In diesem Abschnitt stellen Sie eine Verbindung mit dem Arbeitsbereich her, in dem Sie Ihre Bereitstellungsaufgaben durchführen.
Geben Sie im folgenden Befehl Ihre Abonnement-ID, den Arbeitsbereichsnamen, den Ressourcengruppennamen und den Standort ein:
az account set --subscription <subscription>
az configure --defaults workspace=<workspace> group=<resource-group> location=<location>
Erstellen der Komponente für die Trainingspipeline
In diesem Abschnitt erstellen wir alle Ressourcen, die für unsere Trainingspipeline erforderlich sind. Zunächst erstellen wir eine Umgebung, die die erforderlichen Bibliotheken zum Trainieren des Modells enthält. Dann erstellen wir einen Computecluster, auf dem die Batchbereitstellung ausgeführt wird, und registrieren schließlich die Eingabedaten als Datenressource.
Erstellen der Umgebung
Für die Komponenten in diesem Beispiel wird eine Umgebung mit den XGBoost
- und scikit-learn
-Bibliotheken verwendet. Die environment/conda.yml
-Datei enthält die Konfiguration der Umgebung:
environment/conda.yml
channels:
- conda-forge
dependencies:
- python=3.8.5
- pip
- pip:
- mlflow
- azureml-mlflow
- datasets
- jobtools
- cloudpickle==1.6.0
- dask==2023.2.0
- scikit-learn==1.1.2
- xgboost==1.3.3
- pandas==1.4
name: mlflow-env
Erstellen Sie die Umgebung wie folgt:
Definieren Sie die Umgebung:
environment/xgboost-sklearn-py38.yml
$schema: https://azuremlschemas.azureedge.net/latest/environment.schema.json name: xgboost-sklearn-py38 image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest conda_file: conda.yml description: An environment for models built with XGBoost and Scikit-learn.
Erstellen Sie die Umgebung:
az ml environment create -f environment/xgboost-sklearn-py38.yml
Erstellen eines Computeclusters
Batchendpunkte und Batchbereitstellungen werden auf Computeclustern ausgeführt. Sie können auf jedem Azure Machine Learning-Computecluster ausgeführt werden, der im Arbeitsbereich bereits vorhanden ist. Daher können mehrere Batchbereitstellungen dieselbe Computeinfrastruktur gemeinsam nutzen. In diesem Beispiel arbeiten wir auf einem Azure Machine Learning-Computecluster namens batch-cluster
. Lassen Sie uns überprüfen, ob die Computeinfrastruktur im Arbeitsbereich vorhanden ist. Wenn nicht, werden wir sie erstellen.
az ml compute create -n batch-cluster --type amlcompute --min-instances 0 --max-instances 5
Registrieren der Trainingsdaten als Datenressource
Unsere Trainingsdaten werden in CSV-Dateien dargestellt. Um eine Workload auf Produktionsebene nachzuahmen, registrieren wir die Trainingsdaten in der heart.csv
-Datei als Datenressource im Arbeitsbereich. Diese Datenressource wird später als Eingabe für den Endpunkt angegeben.
az ml data create --name heart-classifier-train --type uri_folder --path data/train
Erstellen der Pipeline
Die Pipeline, die wir operationalisieren möchten, akzeptiert eine Eingabe, nämlich die Trainingsdaten, und erzeugt drei Ausgaben: das trainierte Modell, die Auswertungsergebnisse und die Datentransformationen, die als Vorverarbeitung angewendet werden. Die Pipeline besteht aus zwei Komponenten:
-
preprocess_job
: Dieser Schritt liest die Eingabedaten und gibt die vorbereiteten Daten und die angewendeten Transformationen zurück. Der Schritt empfängt drei Eingaben:-
data
: Ein Ordner, der die Eingabedaten enthält, die transformiert und bewertet werden sollen. -
transformations
: (Optional) Pfad zu den Transformationen, die angewendet werden, sofern verfügbar. Wenn der Pfad nicht angegeben wird, werden die Transformationen den Eingabedaten entnommen. Da dietransformations
-Eingabe optional ist, kann diepreprocess_job
-Komponente während des Trainings und der Bewertung verwendet werden. -
categorical_encoding
: Die Codierungsstrategie für die kategorischen Funktionen (ordinal
oderonehot
).
-
-
train_job
: In diesem Schritt wird ein XGBoost-Modell basierend auf den vorbereiteten Daten trainiert, und die Auswertungsergebnisse und das trainierte Modell werden zurückgegeben. Der Schritt empfängt drei Eingaben:-
data
: Die vorverarbeiteten Daten. -
target_column
: Die Spalte, die vorhergesagt werden soll. -
eval_size
: Gibt den Anteil der für die Auswertung verwendeten Eingabedaten an.
-
Die Pipelinekonfiguration wird in der deployment-ordinal/pipeline.yml
-Datei definiert:
deployment-ordinal/pipeline.yml
$schema: https://azuremlschemas.azureedge.net/latest/pipelineComponent.schema.json
type: pipeline
name: uci-heart-train-pipeline
display_name: uci-heart-train
description: This pipeline demonstrates how to train a machine learning classifier over the UCI heart dataset.
inputs:
input_data:
type: uri_folder
outputs:
model:
type: mlflow_model
mode: upload
evaluation_results:
type: uri_folder
mode: upload
prepare_transformations:
type: uri_folder
mode: upload
jobs:
preprocess_job:
type: command
component: ../components/prepare/prepare.yml
inputs:
data: ${{parent.inputs.input_data}}
categorical_encoding: ordinal
outputs:
prepared_data:
transformations_output: ${{parent.outputs.prepare_transformations}}
train_job:
type: command
component: ../components/train_xgb/train_xgb.yml
inputs:
data: ${{parent.jobs.preprocess_job.outputs.prepared_data}}
target_column: target
register_best_model: false
eval_size: 0.3
outputs:
model:
mode: upload
type: mlflow_model
path: ${{parent.outputs.model}}
evaluation_results:
mode: upload
type: uri_folder
path: ${{parent.outputs.evaluation_results}}
Hinweis
In der pipeline.yml
-Datei fehlt die transformations
-Eingabe im preprocess_job
. Daher entnimmt das Skript die Transformationsparameter den Eingabedaten.
Die Pipeline kann wie folgt visualisiert werden:
Testen der Pipeline
Lassen Sie uns die Pipeline mit einigen Beispieldaten testen. Dazu erstellen wir einen Auftrag mittels der Pipeline und dem batch-cluster
-Computecluster, der zuvor erstellt wurde.
Die folgende pipeline-job.yml
-Datei enthält die Konfiguration für den Pipelineauftrag:
deployment-ordinal/pipeline-job.yml
$schema: https://azuremlschemas.azureedge.net/latest/pipelineJob.schema.json
type: pipeline
experiment_name: uci-heart-train-pipeline
display_name: uci-heart-train-job
description: This pipeline demonstrates how to train a machine learning classifier over the UCI heart dataset.
compute: batch-cluster
component: pipeline.yml
inputs:
input_data:
type: uri_folder
outputs:
model:
type: mlflow_model
mode: upload
evaluation_results:
type: uri_folder
mode: upload
prepare_transformations:
mode: upload
Erstellen Sie den Testauftrag:
az ml job create -f deployment-ordinal/pipeline-job.yml --set inputs.input_data.path=azureml:heart-classifier-train@latest
Erstellen eines Batchendpunkts
Geben Sie einen Namen für den Endpunkt an. Der Name eines Batchendpunkts muss in jeder Region eindeutig sein, da er zum Konstruieren des Aufruf-URI verwendet wird. Um die Eindeutigkeit sicherzustellen, fügen Sie alle nachstehenden Zeichen an den im folgenden Code angegebenen Namen an.
ENDPOINT_NAME="uci-classifier-train"
Konfigurieren des Endpunkts:
Die
endpoint.yml
-Datei enthält die Konfiguration des Endpunkts.endpoint.yml
$schema: https://azuremlschemas.azureedge.net/latest/batchEndpoint.schema.json name: uci-classifier-train description: An endpoint to perform training of the Heart Disease Data Set prediction task. auth_mode: aad_token
Erstellen des Endpunkts:
az ml batch-endpoint create --name $ENDPOINT_NAME -f endpoint.yml
Fragen Sie den Endpunkt-URI ab:
az ml batch-endpoint show --name $ENDPOINT_NAME
Bereitstellen der Pipelinekomponente
Zum Bereitstellen der Pipelinekomponente müssen wir eine Batchbereitstellung erstellen. Eine Bereitstellung ist ein Satz erforderlicher Ressourcen für das Hosting der Ressource, die für die Arbeit zuständig ist.
Konfigurieren der Bereitstellung:
Die
deployment-ordinal/deployment.yml
-Datei enthält die Konfiguration der Bereitstellung. Sie können das vollständige YAML-Schema des Batchendpunkts auf zusätzliche Eigenschaften überprüfen.deployment-ordinal/deployment.yml
$schema: https://azuremlschemas.azureedge.net/latest/pipelineComponentBatchDeployment.schema.json name: uci-classifier-train-xgb description: A sample deployment that trains an XGBoost model for the UCI dataset. endpoint_name: uci-classifier-train type: pipeline component: pipeline.yml settings: continue_on_step_failure: false default_compute: batch-cluster
Erstellen Sie die Bereitstellung:
Führen Sie den folgenden Code aus, um eine Batchbereitstellung unter dem Batchendpunkt zu erstellen und diese als Standardbereitstellung festzulegen.
az ml batch-deployment create --endpoint $ENDPOINT_NAME -f deployment-ordinal/deployment.yml --set-default
Tipp
Beachten Sie die Verwendung des
--set-default
-Flags, um anzugeben, dass diese neue Bereitstellung jetzt die Standardeinstellung ist.Ihre Bereitstellung ist einsatzbereit.
Testen der Bereitstellung
Nachdem die Bereitstellung erstellt wurde, kann sie Aufträge empfangen. Führen Sie zum Testen diese Schritte aus:
In unserer Bereitstellung müssen wir eine Dateneingabe angeben.
Die
inputs.yml
-Datei enthält die Definition der Eingabedatenressource:inputs.yml
inputs: input_data: type: uri_folder path: azureml:heart-classifier-train@latest
Tipp
Weitere Informationen zum Angeben von Eingaben finden Sie unter Erstellen von Aufträgen und Eingabedaten für Batchendpunkte.
Sie können die Standardbereitstellung folgendermaßen aufrufen:
JOB_NAME=$(az ml batch-endpoint invoke -n $ENDPOINT_NAME --f inputs.yml --query name -o tsv)
Sie können den Fortschritt der Show überwachen und die Protokolle streamen, wie im Folgenden beschrieben:
az ml job stream -n $JOB_NAME
Beachten Sie, dass nur die Eingaben der Pipeline als Eingaben im Batchendpunkt veröffentlicht werden. Zum Beispiel ist categorical_encoding
eine Eingabe eines Schritts der Pipeline, aber keine Eingabe in der Pipeline selbst. Steuern Sie auf Basis dieses Verhaltens, welche Eingaben Sie für Ihre Clients verfügbar machen möchten und welche ausgeblendet werden sollen.
Zugreifen auf Auftragsausgaben
Wenn der Auftrag abgeschlossen wurde, können wir auf einige seiner Ausgaben zugreifen. Diese Pipeline erzeugt die folgenden Ausgaben für ihre Komponenten:
-
preprocess job
: Ausgabe isttransformations_output
-
train job
: Ausgaben sindmodel
undevaluation_results
Sie können die zugehörigen Ergebnisse herunterladen mit:
az ml job download --name $JOB_NAME --output-name transformations
az ml job download --name $JOB_NAME --output-name model
az ml job download --name $JOB_NAME --output-name evaluation_results
Erstellen einer neuen Bereitstellung im Endpunkt
Endpunkte können mehrere Bereitstellungen gleichzeitig hosten, wobei nur eine Bereitstellung als Standard gilt. Daher können Sie Ihre verschiedenen Modelle durchlaufen, auf Ihrem Endpunkt bereitstellen und testen und schließlich die optimale Modellbereitstellung als Standardbereitstellung festlegen.
Ändern wir nun die Vorverarbeitung in der Pipeline, um zu ermitteln, ob wir ein leistungsfähigeres Modell erhalten können.
Ändern eines Parameters in der Vorverarbeitungskomponente der Pipeline
Die Vorverarbeitungskomponente verfügt über eine Eingabe namens categorical_encoding
, die ordinal
- oder onehot
-Werte aufweisen kann. Diese Werte entsprechen zwei verschiedenen Methoden für die Codierung kategorischer Funktionen.
-
ordinal
: Codiert die Funktionswerte mit numerischen Werten (Ordnungszahl) ab[1:n]
, wobein
die Anzahl der Kategorien in der Funktion ist. Die Ordinalcodierung impliziert, dass es eine natürliche Rangfolge unter den Funktionskategorien gibt. -
onehot
: Impliziert keine natürliche Rangfolgebeziehung, führt aber zu einem Problem mit der Dimensionalität, wenn sehr viele Kategorien vorhanden sind.
Standardmäßig wurde zuvor ordinal
verwendet. Nun ändern wir die kategorische Codierung so, dass onehot
verwendet wird, und untersuchen dann die Leistung des Modells.
Tipp
Alternativ hätten wir die categorial_encoding
-Eingabe für Clients als Eingabe für den Pipelineauftrag selbst verfügbar machen können. Wir haben uns jedoch entschieden, den Parameterwert im Vorverarbeitungsschritt zu ändern, damit wir den Parameter innerhalb der Bereitstellung ausblenden und steuern können. Dies bietet uns die Möglichkeit, mehrere Bereitstellungen unter demselben Endpunkt einzurichten.
Ändern Sie die Pipeline. Sie sieht folgendermaßen aus:
Die Pipelinekonfiguration wird in der
deployment-onehot/pipeline.yml
-Datei definiert:deployment-onehot/pipeline.yml
$schema: https://azuremlschemas.azureedge.net/latest/pipelineComponent.schema.json type: pipeline name: uci-heart-train-pipeline display_name: uci-heart-train description: This pipeline demonstrates how to train a machine learning classifier over the UCI heart dataset. inputs: input_data: type: uri_folder outputs: model: type: mlflow_model mode: upload evaluation_results: type: uri_folder mode: upload prepare_transformations: type: uri_folder mode: upload jobs: preprocess_job: type: command component: ../components/prepare/prepare.yml inputs: data: ${{parent.inputs.input_data}} categorical_encoding: onehot outputs: prepared_data: transformations_output: ${{parent.outputs.prepare_transformations}} train_job: type: command component: ../components/train_xgb/train_xgb.yml inputs: data: ${{parent.jobs.preprocess_job.outputs.prepared_data}} target_column: target eval_size: 0.3 outputs: model: type: mlflow_model path: ${{parent.outputs.model}} evaluation_results: type: uri_folder path: ${{parent.outputs.evaluation_results}}
Konfigurieren der Bereitstellung:
Die
deployment-onehot/deployment.yml
-Datei enthält die Konfiguration der Bereitstellung. Sie können das vollständige YAML-Schema des Batchendpunkts auf zusätzliche Eigenschaften überprüfen.deployment-onehot/deployment.yml
$schema: https://azuremlschemas.azureedge.net/latest/pipelineComponentBatchDeployment.schema.json name: uci-classifier-train-onehot description: A sample deployment that trains an XGBoost model for the UCI dataset using onehot encoding for variables. endpoint_name: uci-classifier-train type: pipeline component: pipeline.yml settings: continue_on_step_failure: false default_compute: batch-cluster
Erstellen Sie die Bereitstellung:
Führen Sie den folgenden Code aus, um eine Batchbereitstellung unter dem Batchendpunkt zu erstellen und diese als Standardbereitstellung festzulegen.
az ml batch-deployment create --endpoint $ENDPOINT_NAME -f deployment-onehot/deployment.yml
Ihre Bereitstellung ist einsatzbereit.
Ihre Bereitstellung ist einsatzbereit.
Testen einer nicht standardmäßigen Bereitstellung
Nachdem die Bereitstellung erstellt wurde, kann sie Aufträge empfangen. Wir können sie auf dieselbe Weise wie zuvor testen, aber jetzt rufen wir eine bestimmte Bereitstellung auf:
Rufen Sie die Bereitstellung wie folgt auf, und geben Sie dabei den Bereitstellungsparameter an, um die spezifische
uci-classifier-train-onehot
-Bereitstellung auszulösen:DEPLOYMENT_NAME="uci-classifier-train-onehot" JOB_NAME=$(az ml batch-endpoint invoke -n $ENDPOINT_NAME -d $DEPLOYMENT_NAME --f inputs.yml --query name -o tsv)
Sie können den Fortschritt der Show überwachen und die Protokolle streamen, wie im Folgenden beschrieben:
az ml job stream -n $JOB_NAME
Konfigurieren der neuen Bereitstellung als Standardbereitstellung
Wenn wir mit der Leistung der neuen Bereitstellung zufrieden sind, können wir sie als Standardbereitstellung festlegen:
az ml batch-endpoint update --name $ENDPOINT_NAME --set defaults.deployment_name=$DEPLOYMENT_NAME
Entfernen der alten Bereitstellung
Anschließend können Sie die alte Bereitstellung löschen, wenn Sie sie nicht mehr benötigen:
az ml batch-deployment delete --name uci-classifier-train-xgb --endpoint-name $ENDPOINT_NAME --yes
Bereinigen von Ressourcen
Löschen Sie dann die zugehörigen Ressourcen aus dem Arbeitsbereich:
Führen Sie den folgenden Code aus, um den Batchendpunkt und die zugrundeliegende Bereitstellung zu löschen.
--yes
wird verwendet, um den Löschvorgang zu bestätigen.
az ml batch-endpoint delete -n $ENDPOINT_NAME --yes
(Optional) Löschen Sie den Compute, es sei denn, Sie möchten Ihren Computecluster mit späteren Bereitstellungen wiederverwenden.
az ml compute delete -n batch-cluster