Usar Azure Pipelines com Azure Machine Learning

Azure DevOps Services | Azure DevOps Server 2022 – Azure DevOps Server 2019

Você pode usar um pipeline Azure DevOps para automatizar o ciclo de vida do machine learning. Algumas das operações que você pode automatizar são:

  • Preparação de dados (operações de extração, transformação e carregamento).
  • Treinar modelos de aprendizado de máquina com escalabilidade horizontal e vertical sob demanda.
  • Implantação de modelos de machine learning como serviços Web públicos ou privados.
  • Monitorando modelos de machine learning implantados (como para análise de desempenho ou de descompasso de dados).

Este artigo descreve como criar um pipeline de Azure que cria um modelo de machine learning e o implanta em Azure Machine Learning.

Este tutorial usa Azure Machine Learning Python SDK v2 e CLI do Azure extensão ML v2.

Pré-requisitos

Etapa 1: Obter o código

Faça um fork do seguinte repositório do GitHub:

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

Etapa 2: Criar um projeto

Entre no Azure. Pesquise e selecione Azure DevOps organizações. Selecione Exibir minhas organizações. Selecione a organização que você deseja usar.

Em sua organização selecionada, crie um projeto. Se você não tiver nenhum projeto em sua organização, verá uma tela Criar um projeto para começar . Caso contrário, selecione o botão New Project no canto superior direito do painel.

Etapa 3: Criar uma conexão de serviço

Você pode usar uma conexão de serviço existente.

Você precisa de uma conexão Azure Resource Manager para autenticar com o portal Azure.

  1. Em Azure DevOps, selecione Configurações do projeto e, em seguida, selecione Conexões de serviço.

  2. Selecione Criar conexão de serviço, selecione Azure Resource Manager e selecione Avançar.

  3. Use os valores padrão para o tipo de identidade e a credencial.

  4. Crie sua conexão de serviço. Defina o nível de escopo preferencial, a assinatura, o grupo de recursos e o nome da conexão.

    Captura de tela da conexão de serviço do ARM.

Etapa 4: Criar um pipeline

  1. Vá para Pipelines e, em seguida, selecione Criar Pipeline.

  2. Selecione GitHub como o local do código-fonte.

  3. Você pode ser redirecionado para entrar no GitHub. Se estiver, insira suas credenciais de GitHub.

  4. Quando vir a lista de repositórios, selecione seu repositório.

  5. Você pode ser redirecionado para GitHub para instalar o aplicativo Azure Pipelines. Se estiver, selecione Aprovar & instalar.

  6. Selecione o pipeline Inicial. Atualize o modelo de pipeline inicial.

Etapa 5: Criar um pipeline YAML para enviar o trabalho de Azure Machine Learning

Exclua o pipeline inicial e substitua-o pelo código YAML a seguir. Neste fluxo de trabalho, você:

  • Use a tarefa de versão Python para configurar Python 3.10 e instalar os requisitos do SDK.
  • Use a tarefa Bash para executar scripts bash para o SDK e a CLI do Azure Machine Learning.
  • Use a tarefa do CLI do Azure para enviar um job do Azure Machine Learning.

Selecione uma das guias a seguir, dependendo se você estiver usando uma conexão de serviço Azure Resource Manager ou uma conexão de serviço genérica. No YAML do pipeline, substitua os valores das variáveis por valores que correspondem aos seus recursos.

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"

Etapa 6: Aguardar a conclusão do trabalho Azure Machine Learning

Na etapa 5, você adicionou um trabalho para submeter uma tarefa do Azure Machine Learning. Nesta etapa, você adicionará outro trabalho que aguarda a conclusão do trabalho Azure Machine Learning.

Importante

Ambos os mecanismos de espera nesta etapa (a tarefa AzureMLJobWaitTask@1 na guia Azure Resource Manager e o registro de webhook InvokeRESTAPI@1 na guia Genérico) dependem de o Azure Machine Learning enviar uma notificação de volta à Azure DevOps quando a tarefa for concluída. Este caminho de notificação está atualmente sob investigação e pode não ser concluído conforme o esperado, fazendo com que o trabalho do servidor WaitFor* expire em vez de refletir o status do trabalho do Azure Machine Learning. Se você encontrar esse comportamento, verifique o status da tarefa de um agente usando az ml job show --query status até que seja retornado um estado terminal (Completed, Failed ou Canceled) e encerre a tarefa com um status correspondente.

Se você estiver usando uma conexão de serviço Resource Manager, poderá usar a extensão Machine Learning. Você pode pesquisar essa extensão no Marketplace de Extensões do Azure DevOps ou ir diretamente para a página da extensão. Instale a extensão Machine Learning.

Importante

Não instale a extensão Machine Learning (clássico). É uma extensão mais antiga que não fornece a mesma funcionalidade.

Na janela de revisão de pipeline, adicione um trabalho de servidor. Na parte de etapas do trabalho, selecione Mostrar assistente e pesquise por AzureML. Selecione a tarefa AzureML Job Wait e forneça as informações para o trabalho.

A tarefa tem quatro entradas: Service Connection, Azure Resource Group Name, AzureML Workspace Name e AzureML Job Name. Forneça esses dados de entrada. O YAML resultante para estas etapas é semelhante ao seguinte exemplo:

Nota

  • O tarefa de espera do trabalho do Azure Machine Learning é executada em um trabalho de servidor, que não usa recursos caros do pool de agentes e não requer encargos adicionais. Trabalhos de servidor (indicados por pool: server) são executados no mesmo computador que o pipeline. Para obter mais informações, consulte trabalhos do servidor.
  • Uma tarefa de espera de trabalho do Azure Machine Learning só pode esperar por um trabalho. É necessário configurar uma tarefa separada para cada trabalho pelo qual você deseja aguardar.
  • A tarefa de espera do trabalho do Azure Machine Learning pode aguardar no máximo dois dias. Esse limite é um limite rígido definido por Azure DevOps pipelines.
- 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)

Etapa 7: Enviar o pipeline e verificar a execução do pipeline

Selecione Salvar e executar. Quando o mecanismo de espera na Etapa 6 funciona conforme projetado, o pipeline aguarda a conclusão do trabalho do Azure Machine Learning e termina a tarefa em WaitForJobCompletion com o mesmo status do trabalho do Azure Machine Learning. Por exemplo:

  • Trabalho do Azure Machine Learning Succeeded == Tarefa do Azure DevOps no trabalho WaitForJobCompletionSucceeded

  • Trabalho do Azure Machine Learning Failed == Tarefa do Azure DevOps no trabalho WaitForJobCompletionFailed

  • Trabalho do Azure Machine Learning Cancelled == Tarefa do Azure DevOps no trabalho WaitForJobCompletionCancelled

Nota

Devido ao problema mencionado na Etapa 6, o trabalho WaitFor* pode expirar em vez de refletir o status do trabalho do Azure Machine Learning. Use Estúdio do Azure Machine Learning para confirmar o resultado real do trabalho até que o caminho de notificação seja restaurado.

Dica

Você pode exibir o trabalho de Azure Machine Learning completo em Estúdio do Azure Machine Learning.

Limpar recursos

Se você não planeja continuar usando o pipeline, exclua seu projeto de Azure DevOps. No portal do Azure, exclua seu grupo de recursos e instância do Azure Machine Learning.