Verwenden von Azure Pipelines mit Azure Machine Learning

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

Sie können eine Azure DevOps pipeline verwenden, um den Lebenszyklus des maschinellen Lernens zu automatisieren. Einige der Vorgänge, die Sie automatisieren können, sind:

  • Datenvorbereitung (Extraktion, Transformation, Laden)
  • Training von maschinellen Lernmodellen mit bedarfsorientiertem horizontalem und vertikalem Skalieren.
  • Bereitstellung von Machine Learning-Modellen als öffentliche oder private Webdienste.
  • Überwachung bereitgestellter Machine Learning-Modelle (z. B. zur Leistungs- oder Datenabweichungsanalyse).

In diesem Artikel wird beschrieben, wie Sie eine Azure Pipeline erstellen, die ein Machine Learning-Modell erstellt und in Azure Machine Learning bereitstellt.

In diesem Lernprogramm werden Azure Machine Learning Python SDK v2 und Azure CLI ML-Erweiterung v2 verwendet.

Voraussetzungen

Schritt 1: Abrufen des Codes

Erstellen Sie einen Fork von folgendem Repository auf GitHub:

https://github.com/azure/azureml-examples

Schritt 2: Erstellen eines Projekts

Melden Sie sich bei Azure an. Suchen Sie nach Azure DevOps Organisationen und wählen Sie diese aus. Wählen Sie "Meine Organisationen anzeigen" aus. Wählen Sie die Organisation aus, die Sie verwenden möchten.

Erstellen Sie in Ihrer ausgewählten Organisation ein Projekt. Wenn Sie keine Projekte in Ihrer Organisation haben, wird ein Bildschirm " Erstellen eines Projekts für die ersten Schritte " angezeigt. Wählen Sie andernfalls die Schaltfläche Neues Projekt in der oberen rechten Ecke des Dashboards aus.

Schritt 3: Erstellen einer Dienstverbindung

Sie können eine vorhandene Dienstverbindung verwenden.

Sie benötigen eine Azure Resource Manager Verbindung, um sich beim Azure Portal zu authentifizieren.

  1. Wählen Sie in Azure DevOps einstellungen Project aus, und wählen Sie dann Service connections aus.

  2. Wählen Sie Dienstverbindung erstellen, wählen Sie Azure Resource Manager und dann Next aus.

  3. Verwenden Sie die Standardwerte für den Identitätstyp und die Anmeldeinformationen.

  4. Erstellen Sie Ihre Dienstverbindung. Legen Sie die bevorzugte Bereichsebene, das Abonnement, die Ressourcengruppe und den Verbindungsnamen fest.

    Screenshot der ARM-Dienstverbindung.

Schritt 4: Erstellen einer Pipeline

  1. Wechseln Sie zu Pipelines, und wählen Sie dann "Pipeline erstellen" aus.

  2. Wählen Sie GitHub als Speicherort des Quellcodes aus.

  3. Möglicherweise werden Sie zu GitHub umgeleitet, um sich anzumelden. Wenn Sie sind, geben Sie Ihre GitHub Anmeldeinformationen ein.

  4. Wenn die Liste der Repositorys angezeigt wird, wählen Sie Ihr Repository aus.

  5. Möglicherweise werden Sie zu GitHub umgeleitet, um die Azure Pipelines-App zu installieren. Wenn Sie sind, wählen Sie "Genehmigen und Installieren" aus.

  6. Wählen Sie die Starterpipeline aus. Sie überarbeiten die Startpipeline-Schablone.

Schritt 5: Erstellen einer YAML-Pipeline zum Übermitteln des Azure Machine Learning Auftrags

Löschen Sie die Startpipeline, und ersetzen Sie sie durch den folgenden YAML-Code. In dieser Pipeline führen Sie Folgendes aus:

  • Verwenden Sie die Python Versionsaufgabe, um Python 3.10 einzurichten und die SDK-Anforderungen zu installieren.
  • Verwenden Sie die Bash-Aufgabe, um Bash-Skripts für das Azure Machine Learning SDK und die CLI auszuführen.
  • Verwenden Sie die Azure CLI Aufgabe, um einen Azure Machine Learning Auftrag zu übermitteln.

Wählen Sie eine der folgenden Registerkarten aus, je nachdem, ob Sie eine Azure Resource Manager Dienstverbindung oder eine generische Dienstverbindung verwenden. Ersetzen Sie in der Pipeline YAML die Werte von Variablen durch Werte, die Ihren Ressourcen entsprechen.

name: submit-azure-machine-learning-job

trigger:
- none

variables:
  service-connection: 'machine-learning-connection' # replace with your service connection name
  resource-group: 'machinelearning-rg' # replace with your resource group name
  workspace: 'docs-ws' # replace with your workspace name

jobs:
- job: SubmitAzureMLJob
  displayName: Submit AzureML Job
  timeoutInMinutes: 300
  pool:
    vmImage: ubuntu-latest
  steps:
  - task: UsePythonVersion@0
    displayName: Use Python >=3.10
    inputs:
      versionSpec: '>=3.10'

  - bash: |
      set -ex

      az version
      az extension add -n ml
    displayName: 'Add AzureML Extension'

  - task: AzureCLI@2
    name: submit_azureml_job_task
    displayName: Submit AzureML Job Task
    inputs:
      azureSubscription: $(service-connection)
      workingDirectory: 'cli/jobs/pipelines-with-components/nyc_taxi_data_regression'
      scriptLocation: inlineScript
      scriptType: bash
      inlineScript: |
      
        # submit component job and get the run name
        job_name=$(az ml job create --file single-job-pipeline.yml -g $(resource-group) -w $(workspace) --query name --output tsv)

        # set output variable for next task
        echo "##vso[task.setvariable variable=JOB_NAME;isOutput=true;]$job_name"

Schritt 6: Warten, bis der Azure Machine Learning Auftrag abgeschlossen ist

In Schritt 5 haben Sie einen Job hinzugefügt, um einen Azure Machine Learning Auftrag zu übermitteln. In diesem Schritt fügen Sie einen weiteren Auftrag hinzu, der auf den Abschluss des Azure Machine Learning Auftrags wartet.

Wichtig

Beide Wartemechanismen in diesem Schritt (die Aufgabe AzureMLJobWaitTask@1 auf der Registerkarte Azure Resource Manager und die InvokeRESTAPI@1-Webhook-Registrierung auf der Registerkarte "Allgemein") hängen davon ab, dass Azure Machine Learning eine RunTerminated-Benachrichtigung an Azure DevOps zurücksendet, wenn der Auftrag abgeschlossen ist. Dieser Benachrichtigungspfad wird derzeit untersucht und könnte möglicherweise nicht wie erwartet abgeschlossen werden, was dazu führen könnte, dass der WaitFor*-Serverauftrag ein Timeout hat, anstatt den Status des Azure Machine Learning-Auftrags widerzuspiegeln. Wenn dieses Verhalten auftritt, rufen Sie den Auftragsstatus eines Agentauftrags ab, indem Sie az ml job show --query status verwenden, bis ein Endzustand (Completed, Failed, oder Canceled) zurückgegeben wird, und schließen Sie die Aufgabe mit einem entsprechenden Status ab.

Wenn Sie eine Resource Manager Dienstverbindung verwenden, können Sie die Machine Learning Erweiterung verwenden. Sie können auf der Seite Azure DevOps Erweiterungen Marketplace nach dieser Erweiterung suchen oder direkt zur Seite Extension wechseln. Installieren Sie die Machine Learning Erweiterung.

Wichtig

Installieren Sie die erweiterung Machine Learning (classic) nicht. Es handelt sich um eine ältere Erweiterung, die nicht dieselbe Funktionalität bereitstellt.

Fügen Sie im Fenster "Pipelineüberprüfung" einen Serverauftrag hinzu. Wählen Sie im Schritteteil des Auftrags Assistent anzeigen aus, und suchen Sie dann nach AzureML. Wählen Sie die Aufgabe "AzureML-Auftrag warten" aus , und geben Sie dann die Informationen für den Auftrag an.

Der Vorgang verfügt über vier Eingaben: Service Connection, Azure Resource Group Name, AzureML Workspace Name und AzureML Job Name. Geben Sie diese Eingaben an. Das resultierende YAML für diese Schritte ähnelt dem folgenden Beispiel:

Hinweis

  • Der Azure Machine Learning Job-Wartetask läuft auf einem Server-Job, was keine teuren Ressourcen aus dem Agentenpool verwendet und keine zusätzlichen Kosten verursacht. Serveraufträge (angegeben durch pool: server) werden auf demselben Computer wie Ihre Pipeline ausgeführt. Weitere Informationen finden Sie unter Serveraufträge.
  • Ein Azure Machine Learning Wartetask kann nur auf einen Auftrag warten. Sie müssen für jeden Auftrag, auf den Sie warten möchten, eine separate Aufgabe einrichten.
  • Der Azure Machine Learning Auftragswartevorgang kann maximal zwei Tage lang warten. Dieser Grenzwert ist ein harter Grenzwert, der von Azure DevOps Pipelines festgelegt wird.
- job: WaitForAzureMLJobCompletion
  displayName: Wait for AzureML Job Completion
  pool: server
  timeoutInMinutes: 0
  dependsOn: SubmitAzureMLJob
  variables: 
    # Save the name of the azureMl job submitted in the previous step to a variable. It will be used as an input to the AzureML Job Wait task.
    azureml_job_name_from_submit_job: $[ dependencies.SubmitAzureMLJob.outputs['submit_azureml_job_task.JOB_NAME'] ] 
  steps:
  - task: AzureMLJobWaitTask@1
    inputs:
      serviceConnection: $(service-connection)
      resourceGroupName: $(resource-group)
      azureMLWorkspaceName: $(workspace)
      azureMLJobName: $(azureml_job_name_from_submit_job)

Schritt 7: Übermitteln der Pipeline und Überprüfen der Pipelineausführung

Wählen Sie "Speichern" und "Ausführen" aus. Wenn der Wartemechanismus in Schritt 6 wie geplant funktioniert, wartet die Pipeline auf den Abschluss des Azure Machine Learning Auftrags und beendet den Vorgang unter WaitForJobCompletion mit demselben Status wie der Azure Machine Learning Auftrag. Zum Beispiel:

  • Azure Machine Learning Job Succeeded == Azure DevOps Aufgabe unter WaitForJobCompletion Job Succeeded

  • Azure Machine Learning Job Failed == Azure DevOps Aufgabe unter WaitForJobCompletion Job Failed

  • Azure Machine Learning Aufgabe Cancelled == Azure DevOps Aufgabe innerhalb WaitForJobCompletion Aufgabe Cancelled

Hinweis

Aufgrund des Problems, das in Schritt 6 hervorgehoben wurde, kann beim WaitFor*-Job ein Timeout auftreten, anstatt den Status des Azure Machine Learning-Auftrags widerzuspiegeln. Verwenden Sie Azure Machine Learning Studio, um das tatsächliche Auftragsergebnis zu bestätigen, bis der Benachrichtigungspfad wiederhergestellt wird.

Tipp

Sie können den vollständigen Azure Machine Learning Auftrag in Azure Machine Learning Studio anzeigen.

Bereinigen von Ressourcen

Wenn Sie nicht beabsichtigen, die Pipeline weiterhin zu verwenden, löschen Sie Ihr Azure DevOps Projekt. Löschen Sie im Azure-Portal Ihre Ressourcengruppe und Azure Machine Learning Instanz.