概要
本記事はAzure Machine LearningワークスペースをCLIv2を使って操作するチュートリアルの最終章です。
使い方を習得すれば自動化パイプラインを自身で構築できるようになります。
やりたいこと
前回の記事で最新データを用いたモデル作成の自動化を行いました。
最後にCLIv2を使用して推論エンドポイントを自動更新する方法を紹介します。
準備
初回の記事はこちらをご参照ください。
入門編1、2と応用編1が完了している前提で自動化基盤の構築を進めていきます。
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環境構築の参考になれば幸いです。