Azure Machine Learning で Azure Pipelines を使用する

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

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

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

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

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

前提条件

ステップ 1: コードを取得する

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

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

ステップ 2: Azure Pipelines にサインインする

Azure Pipelines にサインインします。 サインインすると、ブラウザーが https://dev.azure.com/my-organization-name に移動し、Azure DevOps ダッシュボーが表示されます。

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

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

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

Azure portal で認証を行うには、Azure Resource Manager 接続が必要です。

  1. Azure DevOps で、[プロジェクト設定] を選択し、[サービス接続] ページを開きます。

  2. [+ 新しいサービス接続] を選択し、[Azure Resource Manager] を選択します。

  3. 既定の認証方法である [サービス プリンシパル (自動)] を選びます。

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

    Screenshot of ARM service connection.

ステップ 4: パイプラインを作成する

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

  2. 最初に、ソース コードの場所として GitHub を選択し、ウィザードの手順を実行します。

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

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

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

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

手順 5: Azure Machine Learning ジョブを送信するための YAML パイプラインを構築する

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

  • Python バージョン タスクを使用して Python 3.8 を設定し、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.8
    inputs:
      versionSpec: '>=3.8'

  - 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 サービス接続を使用している場合は、"Machine Learning" 拡張機能を使用できます。 この拡張機能を Azure DevOps 拡張機能マーケットプレースで検索することも、拡張機能に直接移動することもできます。 "Machine Learning" 拡張機能をインストールします。

重要

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

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

タスクには次の 4 個の入力があります。Service ConnectionAzure Resource Group NameAzureML Workspace NameAzureML Job Name。 これらの入力を埋めます。 これらの手順の結果の YAML は、次の例のようになります。

Note

  • Azure Machine Learning ジョブ待機タスクはサーバー ジョブで実行され、高価なエージェント プール リソースを使い切らず、追加料金の必要はありません。 (pool: server によって示される) サーバー ジョブは、パイプラインと同じマシンで実行されます。 詳細については、「サーバー ジョブ」を参照してください。
  • 1 つの Azure Machine Learning ジョブ待機タスクは、1 つのジョブのみを待機できます。 待機したいジョブごとに個別のタスクを設定する必要があります。
  • Azure Machine Learning ジョブ待機タスクは、最大 2 日間待機できます。 これは、Azure DevOps Pipelines によって設定されるハード制限です。
- job: WaitForAzureMLJobCompletion
  displayName: Wait for AzureML Job Completion
  pool: server
  timeoutInMinutes: 0
  dependsOn: SubmitAzureMLJob
  variables: 
    # We are saving the name of azureMl job submitted in previous step to a variable and it will be used as an inut 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: パイプラインを送信し、パイプラインの実行を確認する

[保存および実行] を選択します。 パイプラインは、Azure Machine Learning ジョブの完了を待機し、WaitForJobCompletion の下のタスクを Azure Machine Learning ジョブと同じ状態で終了させます。 例: Azure Machine Learning ジョブ Succeeded == Azure DevOps タスク WaitForJobCompletion の下のジョブ Succeeded Azure Machine Learning ジョブ Failed == Azure DevOps タスク WaitForJobCompletion の下のジョブ Failed Azure Machine Learning ジョブ Cancelled == Azure DevOps タスク WaitForJobCompletion の下のジョブ Cancelled

ヒント

完全な Azure Machine Learning ジョブは、Azure Machine Learning スタジオで確認できます。

リソースをクリーンアップする

パイプラインを続けて使わない場合は、Azure DevOps プロジェクトを削除します。 Azure portal で、リソース グループと Azure Machine Learning インスタンスを削除します。