Korzystanie z Azure Pipelines z Azure Machine Learning

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

Aby zautomatyzować cykl życia uczenia maszynowego, możesz użyć potoku Azure DevOps. Niektóre operacje, które można zautomatyzować, to:

  • Przygotowywanie danych (wyodrębnianie, przekształcanie, operacje ładowania).
  • Trenowanie modeli uczenia maszynowego przy użyciu skalowania na żądanie i skalowania w górę.
  • Wdrażanie modeli uczenia maszynowego jako publicznych lub prywatnych usług internetowych.
  • Monitorowanie wdrożonych modeli uczenia maszynowego (na przykład na potrzeby analizy wydajności lub dryfu danych).

W tym artykule opisano, jak utworzyć potok w Azure, który buduje model uczenia maszynowego i wdraża go w Azure Machine Learning.

W tym samouczku są używane Azure Machine Learning Python SDK w wersji 2 i Azure CLI rozszerzenie ML w wersji 2.

Wymagania wstępne

Krok 1. Pobieranie kodu

Sforkuj repozytorium poniżej z GitHub:

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

Krok 2. Tworzenie projektu

Zaloguj się do Azure. Wyszukaj i wybierz Azure DevOps organizacje. Wybierz pozycję Wyświetl moje organizacje. Wybierz organizację, której chcesz użyć.

W wybranej organizacji utwórz projekt. Jeśli nie masz żadnych projektów w organizacji, zobaczysz ekran Tworzenie projektu, aby rozpocząć pracę . W przeciwnym razie wybierz przycisk Nowy projekt w prawym górnym rogu panelu.

Krok 3. Tworzenie połączenia z usługą

Możesz użyć istniejącego połączenia usługi.

Aby uwierzytelnić się za pomocą portalu Azure, potrzebne jest połączenie Azure Resource Manager.

  1. W Azure DevOps wybierz pozycję Project settings, a następnie wybierz pozycję Połączenia z usługami.

  2. Wybierz Utwórz połączenie z usługą wybierz pozycję Azure Resource Manager, a następnie wybierz pozycję Dalej.

  3. Użyj wartości domyślnych dla typu tożsamości i poświadczeń.

  4. Utwórz połączenie usługi. Ustaw preferowany poziom zakresu, subskrypcję, grupę zasobów i nazwę połączenia.

    Zrzut ekranu przedstawiający połączenie usługi ARM.

Krok 4. Tworzenie potoku

  1. Przejdź do obszaru Potoki, a następnie wybierz pozycję Utwórz potok.

  2. Wybierz GitHub jako lokalizację kodu źródłowego.

  3. Możesz zostać przekierowany do GitHub, aby się zalogować. Jeśli tak, wprowadź swoje dane logowania do GitHub.

  4. Po wyświetleniu listy repozytoriów wybierz repozytorium.

  5. Być może nastąpi przekierowanie do GitHub w celu zainstalowania aplikacji Azure Pipelines. Jeśli tak, wybierz pozycję Zatwierdź i zainstaluj.

  6. Wybierz Starter pipeline. Zaktualizuj szablon potoku początkowego.

Krok 5: Utwórz potok YAML do przesyłania zadania w Azure Machine Learning

Usuń potok startowy i zastąp go następującym kodem YAML. W tym potoku wykonasz następujące działania:

  • Użyj zadania wersji Python, aby skonfigurować Python 3.10 i zainstalować wymagania dotyczące zestawu SDK.
  • Użyj zadania Bash, aby uruchomić skrypty Bash dla Azure Machine Learning SDK i CLI.
  • Użyj zadania Azure CLI, aby przesłać zadanie Azure Machine Learning.

Wybierz jedną z poniższych kart, w zależności od tego, czy używasz połączenia usługi Azure Resource Manager, czy ogólnego połączenia z usługą. W pliku konfiguracyjnym YAML zastąp wartości zmiennych wartościami odpowiadającymi Twoim zasobom.

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"

Krok 6. Poczekaj na ukończenie zadania Azure Machine Learning

W kroku 5 dodano zadanie do przesłania zadania Azure Machine Learning. W tym kroku dodasz kolejne zadanie, które czeka na ukończenie zadania Azure Machine Learning.

Ważne

Oba mechanizmy oczekiwania w tym kroku (zadanie AzureMLJobWaitTask@1 na karcie Azure Resource Manager i rejestracja webhooka InvokeRESTAPI@1 na karcie Ogólne) zależą od wysłania powiadomienia RunTerminated przez Azure Machine Learning z powrotem do Azure DevOps po zakończeniu zadania. Ta ścieżka powiadomienia jest obecnie badana i może nie zostać ukończona zgodnie z oczekiwaniami, powodując przekroczenie limitu czasu zadania serwera WaitFor* zamiast odzwierciedlać stan zadania Azure Machine Learning. Jeśli wystąpi to zachowanie, pobierz status zadania z pracy agenta przy użyciu polecenia az ml job show --query status, aż zwrócony zostanie stan końcowy (Completed, Failed, lub Canceled), a następnie zakończ zadanie z pasującym stanem.

Jeśli używasz połączenia usługi Resource Manager, możesz użyć rozszerzenia Machine Learning. To rozszerzenie można wyszukać w Marketplace rozszerzeń Azure DevOps lub przejść bezpośrednio do strony rozszerzenia. Zainstaluj rozszerzenie Machine Learning.

Ważne

Nie instaluj rozszerzenia Machine Learning (wersja klasyczna). Jest to starsze rozszerzenie, które nie zapewnia tej samej funkcjonalności.

W oknie Przegląd potoku dodaj zadanie serwera. W części kroków zadania wybierz pozycję Pokaż asystenta, a następnie wyszukaj pozycję AzureML. Wybierz zadanie AzureML Job Wait, a następnie podaj informacje dotyczące tego zadania.

Zadanie ma cztery dane wejściowe: Service Connection, Azure Resource Group Name, AzureML Workspace Name i AzureML Job Name. Podaj te dane wejściowe. Wynikowy kod YAML dla tych kroków jest podobny do następującego przykładu:

Uwaga

  • Zadanie oczekiwania w Azure Machine Learning jest uruchamiane na serwerze, który nie korzysta z zasobów kosztownej puli agentów i nie wymaga dodatkowych opłat. Zadania serwera (wskazywane przez pool: server) działają na tej samej maszynie co potok. Aby uzyskać więcej informacji, zobacz Zadania serwera.
  • Jedno zadanie oczekiwania w Azure Machine Learning może czekać tylko na jedno zadanie. Musisz skonfigurować oddzielne zadanie dla każdej pracy, na którą chcesz czekać.
  • Zadanie oczekiwania dla zadań Azure Machine Learning może trwać maksymalnie dwa dni. Ten limit jest twardym limitem ustawionym przez potoki 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)

Krok 7: Prześlij potok i sprawdź przebieg jego działania.

Wybierz pozycję Zapisz i uruchom. Gdy mechanizm oczekiwania w kroku 6 działa zgodnie z projektem, potok czeka na ukończenie zadania Azure Machine Learning i kończy zadanie w WaitForJobCompletion o tym samym stanie, co zadanie Azure Machine Learning. Na przykład:

  • Azure Machine Learning zadanie Succeeded == Azure DevOps Etap w WaitForJobCompletion zadaniu Succeeded

  • Azure Machine Learning Zadanie Failed == Azure DevOps Zadanie w ramach WaitForJobCompletion Zadania Failed

  • Azure Machine Learning zadanie Cancelled == Azure DevOps zadanie w ramach WaitForJobCompletion zadania Cancelled

Uwaga

Ze względu na problem wywołany w kroku 6, zadanie WaitFor* może zostać zakończone z powodu przekroczenia limitu czasu zamiast odzwierciedlać stanu zadania Azure Machine Learning. Użyj Azure Machine Learning studio, aby potwierdzić rzeczywisty wynik zadania do momentu przywrócenia ścieżki powiadomienia.

Wskazówka

Pełne zadanie Azure Machine Learning można wyświetlić w Azure Machine Learning studio.

Czyszczenie zasobów

Jeśli nie planujesz kontynuować korzystania z potoku, usuń projekt Azure DevOps. W portalu Azure usuń tę grupę zasobów i instancję Azure Machine Learning.