Azure Machine LearningワークスペースをCLIv2で操作する 応用編2-自動デプロイパイプラインの構築

概要

本記事はAzure Machine LearningワークスペースをCLIv2を使って操作するチュートリアルの最終章です。
使い方を習得すれば自動化パイプラインを自身で構築できるようになります。

やりたいこと

前回の記事で最新データを用いたモデル作成の自動化を行いました。
最後にCLIv2を使用して推論エンドポイントを自動更新する方法を紹介します。

準備

初回の記事はこちらをご参照ください。
入門編1、2と応用編1が完了している前提で自動化基盤の構築を進めていきます。

blog.jbs.co.jp

Azure CLI 拡張機能(CLIv2)によるデプロイパイプラインの作成

全体像

前回は機械学習を定期的に実行して、モデルファイルをAzure Machine Learningワークスペースに登録する仕組みを構築しました。
これによってモデルが継続的に作成される状態になりましたが、今回はモデルの登録をトリガーに、最新のモデルでエンドポイントを自動更新する基盤を構築します。

モデル登録をトリガーにする場合は外部サービスを使用します。
Azure Event Gridを使用して、モデルの登録をトリガーに外部で動作を作成することができます。
learn.microsoft.com

モデル登録トリガーによるデプロイ動作を実現するために外部サービスを活用します。
GitHub Actionsから入門編2で作成したデプロイ用CLIv2のコマンドを叩いて、Azure Machine Learningワークスペースを動作させます。
learn.microsoft.com

前提

GitHubアカウントとyamlファイルを格納・Workflowを定義する新規リポジトリが必要になります。
認証を実施すればプライベートリポジトリでも実行可能ですが、今回はパブリックリポジトリで実行します。

また入門編1,2で使用したスクリプトを使用しますが、詳細は後述します。

Azure Event GridでLogic Appsをトリガーする

Azure Machine Learningワークスペースの変更をEvent Gridトリガーで検知します。
Azure portalを通してトリガーを定義していきます。
learn.microsoft.com

Azure Portalからワークスペースを開き、イベントの項目を選択します。
ここでEvent Gridでトリガーする先を作成できます。今回はLogic Appsを選択します。

Logic Appsデザイナーの画面に移動しますので、まずはEvent Gridトリガーの内容を設定していきます。

リソースの種類をMicrosoft.MachineLearningServices.Workspaceに設定します。
ワークスペースからは定義されたトリガーを使用することができます。

  • データセットのドリフトが検出された時
  • モデルがデプロイされた時
  • モデルが登録された時
  • 実行が完了したとき
  • 実行ステータスが変化したとき

学習パイプラインによってモデルが登録された際に動作をさせたいので、ModelDeployedを選択します。

Azure Logic AppsからGitHub Actionsをトリガーする

上記に引き続き、Logic Appsの設定を行っていきます。

LogicAppsでEvent Gridからのトリガーを受け取り、GitHub Actionsをトリガーします。
完成イメージは以下の通りです。

JSONの解析

ModelRegistered イベントのデータを解析して使用するために、JSONの解析モジュールを設定します。
これによって登録されたモデルの詳細情報をLogic Appsに受け渡すことができます。

modelNameやmodelVersionを後のリポジトリディスパッチイベントに受け渡すことで、指定したモデル名のみデプロイするように設定することができます。

コンテンツを「本文」に設定し、スキーマに以下の内容を設定します。

{
    "properties": {
        "data": {
            "properties": {
                "modelName": {
                    "type": "string"
                },
                "modelProperties": {
                    "properties": {
                        "azureml.artifactPrefix": {
                            "type": "string"
                        },
                        "flavors": {
                            "type": "string"
                        },
                        "flavors.python_function": {
                            "type": "string"
                        },
                        "flavors.sklearn": {
                            "type": "string"
                        },
                        "mlflow.modelSourceUri": {
                            "type": "string"
                        },
                        "model_json": {
                            "type": "string"
                        }
                    },
                    "type": "object"
                },
                "modelTags": {
                    "properties": {},
                    "type": "object"
                },
                "modelVersion": {
                    "type": "string"
                }
            },
            "type": "object"
        },
        "dataVersion": {
            "type": "string"
        },
        "eventTime": {
            "type": "string"
        },
        "eventType": {
            "type": "string"
        },
        "id": {
            "type": "string"
        },
        "metadataVersion": {
            "type": "string"
        },
        "subject": {
            "type": "string"
        },
        "topic": {
            "type": "string"
        }
    },
    "type": "object"
}

リポジトリディスパッチイベント

GitHub Actions Workflowをトリガーするために、リポジトリディスパッチイベントを使用します。 learn.microsoft.com

イベント作成後に自身のGitHubアカウントでログインします。
リポジトリ所有者とリポジトリ名は、今回ワークフローを定義するリポジトリの情報をそれぞれ記載します。

ワークフローをトリガーするための固有のイベント名を設定しますが、今回は適当にhogeとします。
後述するワークフローのyamlファイルで、この名称によってトリガーするように設定します。

これでロジックアプリ側の設定は完了なので、名前を付けて保存を選択してください。

GitHub Actions Workflowからaz mlコマンドを実行する

ここまででAzure Machine Learningワークスペースにモデルが登録された時に、GitHub Actions Workflowがトリガーされる仕組みを構築しました。
ここからはワークフローからCLIv2コマンドを叩いて、自動でデプロイする動作を作成していきます。

Azureへの接続作成とSecretsの登録

GitHub ActionsからAzureリソースに接続するためには、認証を行う必要があります。
Azure Active Directoryを使用してアプリの登録を行い、GitHub側から接続するためのクライアントシークレットを作成します。 詳細は以下の記事をご参照ください。 learn.microsoft.com

リポジトリのActionsシークレットには以下の3項目を設定します。

シークレット名 説明
AZURE_CREDENTIALS 上記で作成したアプリのクライアントシークレット値
AZURE_ML_WORKSPACE_NAME 対象のAzure Machine Learningワークスペース名
AZURE_RESOURCE_GROUP_NAME Azure Machine Learningワークスペースの配置されたリソースグループ名

デプロイ用プログラムのプッシュ

入門編1,2で作成した以下3ファイルをGitHubリポジトリに格納します。

  • training-env.yml
  • score.py
  • managed_endpoint_deployment.yml

ディレクトリ構造はこの形です。
.github/workflows/main.ymlの中身は後述します。

┣ .github/
┃     ┗ workflows/
┃            ┗ main.yml
┗ aml_yamls/
         ┣ managed_endpoint_deployment.yml
         ┣ environments/
         ┃   ┗ training-env.yml
         ┗ scripts/
                ┗ score.py
Workflowファイルの作成

GitHubでも動作の中身をyaml形式で定義します。

.github/workflows/main.yml

name: Azure ML Trigger Pipeline Sample

on:
  repository_dispatch:
    types: [hoge] 

defaults:
  run:
    working-directory: aml_yamls

permissions:
      id-token: write
      contents: read

jobs:
  job-deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3
      - name: Log in with Azure
        uses: azure/login@v1
        with:
          creds: '${{secrets.AZURE_CREDENTIALS}}'
      - name: Install ML extension for az command
        run: az extension add --name ml --version 2.11.0
      - name: Create ML Job
        run: az ml online-deployment create -f managed_deployment.yml --all-traffic -g ${{secrets.AZURE_RESOURCE_GROUP_NAME}} -w ${{secrets.AZURE_ML_WORKSPACE_NAME}}

repository_dispatchで先ほど定義したLogic Appsのイベント名を指定します。
仮想マシンからAzureにログインし、azコマンドをインストールしてマネージドエンドポイントのデプロイを実行します。

以上によって新規でモデルが登録された際に、自動でそのモデルがデプロイ済みマネージドエンドポイントに適用されます。

前回の記事で軽く触れましたが、このままだと作成した最新モデルを常に適用してしまうため、精度を判定するジョブを挟んで過学習などの影響で低精度になったモデルのデプロイを防ぐようにする必要があります。

おわりに

CLIv2の自動化パイプラインについてのシリーズ記事は以上になります。
筆者はSDKv1からCLIv2に移行しましたが、yamlファイルも読みやすく、コマンドも簡単だったため非常に便利に感じました。
本記事が皆様のML Ops環境構築の参考になれば幸いです。

執筆担当者プロフィール
西野 佑基

西野 佑基(日本ビジネスシステムズ株式会社)

機械学習系ソリューション開発、業務Webアプリ開発、開発環境自動化などを担当。

担当記事一覧