Usare Azure Pipelines con Azure Machine Learning

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

È possibile usare una pipeline Azure DevOps per automatizzare il ciclo di vita di Machine Learning. Alcune delle operazioni che è possibile automatizzare sono:

  • Preparazione dei dati (estrazione, trasformazione, operazioni di caricamento).
  • Addestramento di modelli di Machine Learning con scalabilità orizzontale e verticale su richiesta.
  • Distribuzione di modelli di Machine Learning come servizi Web pubblici o privati.
  • Monitoraggio dei modelli di Machine Learning distribuiti, ad esempio per l'analisi delle prestazioni o della deriva dei dati.

Questo articolo descrive come creare una pipeline di Azure che compila un modello di Machine Learning e la distribuisce in Azure Machine Learning.

Questa esercitazione usa Azure Machine Learning Python SDK v2 e interfaccia della riga di comando di Azure l'estensione ML v2.

Prerequisiti

Passaggio 1: Ottenere il codice

Crea un fork del seguente repository da GitHub:

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

Passaggio 2: Creare un progetto

Accedere a Azure. Cercare e selezionare organizzazioni Azure DevOps. Selezionare Visualizza le organizzazioni. Selezionare l'organizzazione da usare.

All'interno dell'organizzazione selezionata creare un progetto. Se non sono presenti progetti nell'organizzazione, viene visualizzata la schermata Crea un progetto per iniziare . In caso contrario, selezionare il pulsante Nuovo Project nell'angolo superiore destro del dashboard.

Passaggio 3: Creare una connessione al servizio

È possibile usare una connessione al servizio esistente.

È necessaria una connessione Azure Resource Manager per l'autenticazione con il portale di Azure.

  1. In Azure DevOps selezionare Project settings e quindi selezionare Service connections.

  2. Selezionare Crea connessione al servizio, selezionare Azure Resource Manager e quindi selezionare Next.

  3. Usare i valori predefiniti per Tipo di identità e Credenziali.

  4. Crea la connessione al servizio. Impostare il livello di ambito preferito, la sottoscrizione, il gruppo di risorse e il nome della connessione.

    Screenshot della connessione al servizio ARM.

Passaggio 4: Creare una pipeline

  1. Passare a Pipeline e quindi selezionare Crea pipeline.

  2. Selezionare GitHub come percorso del codice sorgente.

  3. È possibile che si venga reindirizzati a GitHub per accedere. In caso affermativo, immettere le credenziali GitHub.

  4. Quando vedi l'elenco dei repository, seleziona il tuo repository.

  5. Potresti essere reindirizzato a GitHub per installare l'app Azure Pipelines. In caso affermativo, selezionare Approva e installa.

  6. Selezionare la pipeline di avvio. Aggiorni il modello di pipeline di avvio.

Passaggio 5: Creare una pipeline YAML per sottoporre un job di Azure Machine Learning

Eliminare la pipeline iniziale e sostituirla con il codice YAML seguente. In questa pipeline:

  • Usare l'attività della versione Python per configurare Python 3.10 e installare i requisiti del componente SDK.
  • Usare l'attività Bash per eseguire script bash per Azure Machine Learning SDK e l'interfaccia della riga di comando.
  • Usare l'attività dell'interfaccia della riga di comando di Azure per inviare un processo di Azure Machine Learning.

Selezionare una delle schede seguenti, a seconda che si usi una connessione al servizio Azure Resource Manager o una connessione di servizio generica. Nella pipeline YAML sostituire i valori delle variabili con valori corrispondenti alle risorse.

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"

Passaggio 6: Attendere il completamento del processo di Azure Machine Learning

Nel passaggio 5 è stato aggiunto un processo per inviare un processo di Azure Machine Learning. In questo passaggio si aggiunge un altro processo che attende il completamento del processo di Azure Machine Learning.

Importante

Entrambi i meccanismi di attesa in questo passaggio (l'attività AzureMLJobWaitTask@1 nella scheda Azure Resource Manager e la registrazione webhook InvokeRESTAPI@1 nella scheda Generica) dipendono dall'invio di una notifica RunTerminated da parte di Azure Machine Learning ad Azure DevOps al termine del processo. Questo percorso di notifica è attualmente in fase di indagine e potrebbe non essere completato come previsto, causando il timeout del processo del server WaitFor* anziché riflettere lo stato del processo di Azure Machine Learning. Se si verifica questo comportamento, eseguire il polling dello stato del processo da un processo dell'agente usando az ml job show --query status finché non viene restituito uno stato terminale (Completed, Failed o Canceled), quindi uscire dall'attività con uno stato corrispondente.

Se si usa una connessione al servizio Resource Manager, è possibile usare l'estensione Machine Learning. È possibile cercare questa estensione nella pagina Azure DevOps Extensions Marketplace oppure passare direttamente alla pagina extension. Installare l'estensione Machine Learning.

Importante

Non installare l'estensione Machine Learning (classica). Si tratta di un'estensione meno recente che non fornisce la stessa funzionalità.

Nella finestra di revisione della pipeline, aggiungere un'attività server. Nella parte dei passaggi del processo selezionare Mostra assistente e quindi cercare AzureML. Selezionare l'attività Attesa processo AzureML, quindi fornire le informazioni per il processo.

L'attività ha quattro input: Service Connection, Azure Resource Group Name, AzureML Workspace Name e AzureML Job Name. Fornire questi input. Il codice YAML risultante per questi passaggi è simile all'esempio seguente:

Nota

  • L'attività di attesa di un processo di Azure Machine Learning viene eseguita su un processo server, che non usa risorse costose del pool di agenti e non comporta costi aggiuntivi. I processi server (indicati da pool: server) vengono eseguiti nello stesso computer della pipeline. Per altre informazioni, vedere Processi del server.
  • Un'attività di attesa processi di Azure Machine Learning può attendere un solo processo. È necessario configurare un'attività separata per ogni processo per cui si vuole attendere.
  • L'attività di attesa del processo di Azure Machine Learning può attendere per un massimo di due giorni. Questo limite è un limite rigido impostato dalle pipeline Azure DevOps.
- 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)

Passaggio 7. Inviare la pipeline e verificarne l'esecuzione

Selezionare Salva ed esegui. Quando il meccanismo di attesa nel passaggio 6 funziona come progettato, la pipeline attende il completamento del processo Azure Machine Learning e termina l'attività in WaitForJobCompletion con lo stesso stato del processo Azure Machine Learning. Per esempio:

  • Processo di Azure Machine Learning Succeeded == Attività Azure DevOps nel processo WaitForJobCompletionSucceeded

  • Processo di Azure Machine Learning Failed == Attività Azure DevOps nel processo WaitForJobCompletionFailed

  • Processo di Azure Machine Learning Cancelled == Attività Azure DevOps nel processo WaitForJobCompletionCancelled

Nota

A causa del problema evidenziato nel passaggio 6, il job WaitFor* potrebbe andare in timeout anziché riflettere lo stato del job di Azure Machine Learning. Usare studio di Azure Machine Learning per confermare il risultato effettivo del processo fino al ripristino del percorso di notifica.

Suggerimento

È possibile visualizzare il processo di Azure Machine Learning completo in studio di Azure Machine Learning.

Pulire le risorse

Se non si prevede di continuare a usare la pipeline, eliminare il progetto Azure DevOps. Nel portale di Azure, elimina il gruppo di risorse e l'istanza di Azure Machine Learning.