Azure Machine LearningでAzure Pipelinesを使用する

Azure DevOps サービス |Azure DevOps Server 2022 - Azure DevOps Server 2019

Azure DevOps パイプラインを使用して、機械学習のライフサイクルを自動化できます。 自動化できる操作の一部は次のとおりです。

  • データ準備 (抽出、変換、読み込み操作)。
  • オンデマンドのスケールアウトとスケールアップを使用して機械学習モデルをトレーニングします。
  • パブリックまたはプライベート Web サービスとしての機械学習モデルのデプロイ。
  • デプロイされた機械学習モデルの監視 (パフォーマンスやデータドリフト分析など)。

この記事では、機械学習モデルを構築し、Azure Machine LearningにデプロイするAzure パイプラインを作成する方法について説明します。

このチュートリアルでは、Azure Machine Learning Python SDK v2 および Azure CLI ML 拡張機能 v2 を使用します。

前提 条件

手順 1: コードを取得する

GitHubから次のリポジトリをフォークします。

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

手順 2: プロジェクトを作成する

Azureにサインインします。 Azure DevOps組織を検索して選択します。 自分の組織を表示を選択します。 使用する組織を選択します。

選択した組織内で 、プロジェクトを作成します。 組織内にプロジェクトがない場合は、[ 作業を開始するためのプロジェクトの作成 ] 画面が表示されます。 それ以外の場合は、ダッシュボードの右上隅にある New Project ボタンを選択します。

手順 3: サービス接続を作成する

既存のサービス接続を使用できます。

Azure ポータルで認証するには、Azure Resource Manager接続が必要です。

  1. Azure DevOpsで、Project 設定を選択し、Service connections を選択します。

  2. サービス接続の作成を選択し、 Azure Resource Managerを選択し、 Nextを選択します。

  3. ID の種類と資格情報の既定値を使用します

  4. サービス接続を作成します。 優先スコープ レベル、サブスクリプション、リソース グループ、接続名を設定します。

    ARM サービス接続のスクリーンショット。

手順 4: パイプラインを作成する

  1. [パイプライン] に移動し、[パイプラインの作成] を選択します。

  2. ソース コードの場所として GitHub を選択します。

  3. サインインするGitHubにリダイレクトされる場合があります。 その場合は、GitHub資格情報を入力します。

  4. リポジトリの一覧が表示されたら、リポジトリを選択します。

  5. Azure Pipelines アプリをインストールするために、GitHubにリダイレクトされる場合があります。 その場合は、[ 承認してインストール] を選択します。

  6. スターター パイプラインを選択します。 スターター パイプライン テンプレートを更新します。

手順 5: Azure Machine Learning ジョブを送信する YAML パイプラインを作成する

スターター パイプラインを削除し、次の YAML コードに置き換えます。 このパイプラインでは、次の操作を行います。

  • Python バージョン タスクを使用して Python 3.10 を設定し、SDK の要件をインストールします。
  • bash タスクを使用して、Azure Machine Learning SDK と CLI の bash スクリプトを実行します。
  • Azure CLI タスクを使用して、Azure Machine Learning ジョブを送信します。

Azure Resource Manager サービス接続と汎用サービス接続のどちらを使用しているかに応じて、次のいずれかのタブを選択します。 パイプライン YAML で、変数の値をリソースに対応する値に置き換えます。

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"

手順 6: Azure Machine Learning ジョブが完了するまで待つ

手順 5 では、Azure Machine Learning ジョブを送信するジョブを追加しました。 この手順では、Azure Machine Learning ジョブの完了を待機する別のジョブを追加します。

重要

この手順の待機メカニズム (Azure Resource Manager タブの AzureMLJobWaitTask@1 タスクと [汎用] タブの InvokeRESTAPI@1 webhook 登録) は、ジョブの終了時に RunTerminated 通知をAzure DevOpsに戻すAzure Machine Learningによって異なります。 この通知パスは現在調査中であり、想定どおりに完了していない可能性があるため、Azure Machine Learning ジョブの状態を反映するのではなく、WaitFor* サーバー ジョブがタイムアウトになる可能性があります。 この動作が発生した場合は、終了状態 (az ml job show --query statusCompleted、またはFailed) が返されるまで、Canceledを使用してエージェント ジョブからジョブの状態をポーリングし、一致する状態でタスクを終了します。

Resource Manager サービス接続を使用している場合は、Machine Learning拡張機能を使用できます。 この拡張機能は、Azure DevOps拡張機能 Marketplace で検索するか、extension ページに直接移動します。 Machine Learning拡張機能をインストールします。

重要

Machine Learning (クラシック) 拡張機能はインストールしないでください。 これは、同じ機能を提供しない古い拡張機能です。

[パイプライン レビュー] ウィンドウで、サーバー ジョブを追加します。 ジョブのステップ部分で、[ アシスタントの表示] を選択し、 AzureML を検索します。 AzureML ジョブ待機タスクを選択し、ジョブの情報を指定します。

タスクには、Service ConnectionAzure Resource Group NameAzureML Workspace Name、および AzureML Job Name の 4 つの入力があります。 これらの入力を指定します。 これらの手順の結果の YAML は、次の例のようになります。

メモ

  • Azure Machine Learning ジョブ待機タスクは、高価なエージェント プール リソースを使用せず、追加料金も必要としないサーバー ジョブで実行されます。 サーバー ジョブ ( pool: server で示されます) は、パイプラインと同じコンピューター上で実行されます。 詳細については、「 サーバー ジョブ」を参照してください。
  • 1 つのAzure Machine Learning ジョブ待機タスクは、1 つのジョブしか待機できません。 待機するジョブごとに個別のタスクを設定する必要があります。
  • Azure Machine Learning ジョブ待機タスクは、最大 2 日間待機できます。 この制限は、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)

手順 7: パイプラインを送信し、パイプラインの実行を確認する

[ 保存して実行] を選択します。 手順 6 の待機メカニズムが設計どおりに動作すると、パイプラインはAzure Machine Learning ジョブが完了するのを待機し、Azure Machine Learning ジョブと同じ状態で WaitForJobCompletion のタスクを終了します。 例えば:

  • Azure Machine Learning ジョブ Succeeded == Azure DevOpsのWaitForJobCompletionジョブSucceededの下のタスク

  • Azure Machine Learning ジョブFailed == Azure DevOps ジョブWaitForJobCompletionの下のタスクFailed

  • Azure Machine Learning ジョブの Cancelled == Azure DevOps タスクの WaitForJobCompletion ジョブの下での Cancelled

メモ

手順 6 で呼び出された問題のため、WaitFor* ジョブは、Azure Machine Learning ジョブの状態を反映するのではなく、タイムアウトになる可能性があります。 通知パスが復元されるまで、Azure Machine Learning スタジオを使用して実際のジョブの結果を確認します。

ヒント

Azure Machine Learning スタジオで完全なAzure Machine Learning ジョブを表示できます。

リソースのクリーンアップ

パイプラインを引き続き使用する予定がない場合は、Azure DevOps プロジェクトを削除します。 Azure ポータルで、リソース グループと Azure Machine Learning インスタンスを削除します。