Share via


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:

Screenshot der Pipeline mit den Komponenten für die Vorverarbeitung und das Training.

Das Beispiel in diesem Artikel basiert auf Codebeispielen, die im Repository azureml-examples enthalten sind. Um die Befehle lokal auszuführen, ohne YAML und andere Dateien kopieren/einfügen zu müssen, klonen Sie zunächst das Repository, und ändern Sie dann die Verzeichnisse zum Ordner:

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

Stellen Sie vor dem Ausführen der Schritte in diesem Artikel sicher, dass Sie über die folgenden erforderlichen Komponenten verfügen:

  • Ein Azure-Abonnement. 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. Wenn Sie keins haben, führen Sie die Schritte im Artikel Verwalten von Azure Machine Learning-Arbeitsbereichen aus, um einen Arbeitsbereich zu erstellen.

  • Stellen Sie sicher, dass Sie im Arbeitsbereich über die folgenden Berechtigungen verfügen:

    • Erstellen oder Verwalten von Batchendpunkten und Batchbereitstellungen: Verwenden Sie die Rolle für Besitzer oder Mitwirkende oder eine benutzerdefinierte Rolle, die Microsoft.MachineLearningServices/workspaces/batchEndpoints/* zulässt.

    • Erstellen von ARM-Bereitstellungen in der Arbeitsbereichsressourcengruppe: Verwenden Sie die Rolle für Besitzer oder Mitwirkende oder eine benutzerdefinierte Rolle, die Microsoft.Resources/deployments/write in der Ressourcengruppe zulässt, in der der Arbeitsbereich bereitgestellt wird.

  • Für die Arbeit mit Azure Machine Learning müssen Sie die folgende Software installieren:

    Die Azure CLI und die ml-Erweiterung für Azure Machine Learning.

    az extension add -n ml
    

    Hinweis

    Bereitstellungen der Pipelinekomponenten für Batchendpunkte wurden in Version 2.7 der Erweiterung ml für die Azure CLI eingeführt. Verwenden Sie az extension update --name ml, um die letzte Version davon zu erhalten.

Herstellen einer Verbindung mit Ihrem Arbeitsbereich

Der Arbeitsbereich ist die Ressource der obersten Ebene für Azure Machine Learning und ein zentraler Ort für die Arbeit mit allen Artefakten, die Sie während der Nutzung von Azure Machine Learning erstellen. In diesem Abschnitt stellen wir eine Verbindung mit dem Arbeitsbereich her, in dem Sie die Bereitstellung vornehmen werden.

Übergeben Sie die Werte für Ihre Abonnement-ID, Ihren Arbeitsbereich, Ihren Standort und Ihre Ressourcengruppe im folgenden Code:

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:

  1. 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.
    
  2. 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 die transformations-Eingabe optional ist, kann die preprocess_job-Komponente während des Trainings und der Bewertung verwendet werden.
    • categorical_encoding: Die Codierungsstrategie für die kategorischen Funktionen (ordinal oder onehot).
  • 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:

Ein Bild der Pipeline mit der Auftragseingabe, den Pipelinekomponenten und den Ausgaben an jedem Schritt der Pipeline.

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

  1. 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"
    
  2. 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
    
  3. Erstellen des Endpunkts:

    az ml batch-endpoint create --name $ENDPOINT_NAME -f endpoint.yml
    
  4. 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.

  1. 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
    
  2. 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.

  3. 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:

  1. 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.

  2. 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)
    
  3. 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 ist transformations_output
  • train job: Ausgaben sind model und evaluation_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], wobei n 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.

  1. Ä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}}
    
  2. 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
    
  3. 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.

  4. 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:

  1. 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)
    
  2. 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

Nächste Schritte