Azure DevOps を使用して MLOps を設定する
適用対象:Azure CLI ml extension v2 (現行)Python SDK azure-ai-ml v2 (現行)
Azure Machine Learning を使うと、Azure DevOps パイプラインと統合して、機械学習のライフサイクルを自動化できます。 自動化できる操作の一部を次に示します。
- Azure Machine Learning インフラストラクチャのデプロイ
- データの準備 (抽出、変換、読み込み操作)
- オンデマンドのスケールアウトとスケールアップを使った機械学習モデルのトレーニング
- パブリックまたはプライベートの Web サービスとしての機械学習モデルのデプロイ
- デプロイされた機械学習モデルの監視 (パフォーマンス分析など)
この記事では、Azure Machine Learning を使って、NYC のタクシー料金を予測する線形回帰を実行するエンド ツー エンドの MLOps パイプラインを設定する方法について説明します。 パイプラインはコンポーネントで構成され、それぞれが異なる機能を提供します。これは、ワークスペースに登録し、バージョン管理し、さまざまな入力と出力で再利用できます。 MLOps 用の推奨される Azure アーキテクチャと Azure MLOps (v2) ソリューション アクセラレータを使って、Azure Machine Learning で MLOps プロジェクトをすばやく設定します。
ヒント
ソリューションを実装する前に、MLOps 用に推奨される Azure アーキテクチャをいくつか理解することをお勧めします。 特定の機械学習プロジェクトに最適なアーキテクチャを選ぶ必要があります。
前提条件
- Azure サブスクリプション。 Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。 無料版または有料版の Azure Machine Learning をお試しください。
- Azure Machine Learning ワークスペース。
- ローカル コンピューターで実行されている Git。
- Azure DevOps の組織。
- ソース リポジトリとパイプラインをホストする Azure DevOps プロジェクト。
- Azure DevOps と Terraform を使ってインフラストラクチャを構築する場合は、Azure DevOps 用の Terraform 拡張機能
注意
Git バージョン 2.27 以降が必要です。 Git コマンドのインストールについて詳しくは、https://git-scm.com/downloads でお使いのオペレーティング システムを選んでください
重要
この記事の CLI コマンドは、Bash を使ってテストされました。 異なるシェルを使うと、エラーが発生する可能性があります。
Azure と DevOps で認証を設定する
Azure Machine Learning で MLOps プロジェクトを設定する前に、Azure DevOps 用に認証を設定する必要があります。
サービス プリンシパルの作成
デモを使うには、作業する環境の数 (開発か、運用か、両方) に応じて、1 つまたは 2 つのサービス プリンシパルを作成する必要があります。 これらのプリンシパルは、次のいずれかの方法を使って作成できます。
Azure Cloud Shell を起動します。
ヒント
Cloud Shell を初めて起動すると、Cloud Shell 用のストレージ アカウントの作成を求められます。
求められたら、Cloud Shell で使われる環境として Bash を選びます。 上部のナビゲーション バーのドロップダウンで環境を変更することもできます
次の bash コマンドをコンピューターにコピーし、projectName、subscriptionId、environment の各変数を実際のプロジェクトの値で更新します。 開発環境と運用環境の両方を作成する場合は、環境ごとにこのスクリプトを 1 回実行し、それぞれにサービス プリンシパルを作成する必要があります。 このコマンドでは、指定したサブスクリプションのサービス プリンシパルに共同作成者ロールも付与されます。 これは、Azure DevOps でそのサブスクリプション内のリソースを適切に使うために必要です。
projectName="<your project name>" roleName="Contributor" subscriptionId="<subscription Id>" environment="<Dev|Prod>" #First letter should be capitalized servicePrincipalName="Azure-ARM-${environment}-${projectName}" # Verify the ID of the active subscription echo "Using subscription ID $subscriptionID" echo "Creating SP for RBAC with name $servicePrincipalName, with role $roleName and in scopes /subscriptions/$subscriptionId" az ad sp create-for-rbac --name $servicePrincipalName --role $roleName --scopes /subscriptions/$subscriptionId echo "Please ensure that the information created here is properly save for future use."
編集したコマンドを Azure Shell にコピーして実行します (Ctrl + Shift + v キー)。
これらのコマンドを実行すると、サービス プリンシパルに関連する情報が表示されます。 この情報を安全な場所に保存します。この情報は、後のデモで Azure DevOps を構成するために使います。
{ "appId": "<application id>", "displayName": "Azure-ARM-dev-Sample_Project_Name", "password": "<password>", "tenant": "<tenant id>" }
開発環境と運用環境のサービス プリンシパルを作成する場合は、ステップ 3 を繰り返します。 このデモでは、1 つの環境のみ (運用環境) を作成します。
サービス プリンシパルが作成されたら、Cloud Shell を閉じます。
Azure DevOps を設定する
Azure DevOps に移動します。
[新しいプロジェクトの作成] を選びます (このチュートリアルでは、プロジェクトを
mlopsv2
という名前にします)。プロジェクトの [プロジェクトの設定] (プロジェクト ページの左下) で、[サービス接続] を選びます。
[サービス接続の作成」] を選択します。
[Azure Resource Manager]、[次へ]、[サービス プリンシパル (手動)]、[次へ] の順に選び、スコープ レベルで [サブスクリプション] を選びます。
- [サブスクリプション名] - サービス プリンシパルが格納されているサブスクリプションの名前を使います。
- [サブスクリプション ID] - サブスクリプション ID としては、ステップ 1 で使った
subscriptionId
を使います - [サービス プリンシパル ID] - サービス プリンシパル ID としては、ステップ 1 の出力から
appId
を使います - [サービス プリンシパル キー] - サービス プリンシパル キーとしては、ステップ 1 の出力から
password
を使います - [テナント ID] - テナント ID としては、ステップ 1 の出力の
tenant
を使います
サービス接続に Azure-ARM-Prod という名前を付けます。
[すべてのパイプラインへのアクセス許可を与える] を選んでから、[確認して保存] を選びます。
Azure DevOps のセットアップが正常に終わりました。
Azure DevOps を使用してソース リポジトリを設定する
Azure DevOps で作成したプロジェクトを開きます
[リポジトリ] セクションを開き、[リポジトリのインポート] を選びます
[クローン URL] フィールドに「https://github.com/Azure/mlops-v2-ado-demo」と入力します。 ページの下部にある [インポート] を選びます。
左側のナビゲーション ウィンドウの下部にある [プロジェクトの設定] を開きます
[リポジトリ] セクションの [リポジトリ] を選びます。 前の手順で作成したリポジトリを選びます。[セキュリティ] タブを選びます
[ユーザーのアクセス許可] セクションで、mlopsv2 Build Service ユーザーを選びます。 [投稿] アクセス許可を [許可] に変更し、[ブランチの作成] アクセス許可を [許可] に変更します。
左側のナビゲーション ウィンドウで [パイプライン] セクションを開き、[パイプラインの作成] ボタンの横にある縦に 3 つ並んだドットを選びます。 [セキュリティの管理] を選びます
[ユーザー] セクションで、プロジェクトの mlopsv2 Build Service アカウントを選びます。 [ビルド パイプラインの編集] アクセス許可を [許可] に変更します
注意
これで前提条件のセクションは終わり、それに応じてソリューション アクセラレータのデプロイを行うことができます。
Azure DevOps を使用したインフラストラクチャのデプロイ
このステップでは、前の手順で作成した Azure Machine Learning ワークスペースにトレーニング パイプラインをデプロイします。
ヒント
MLOps v2 リポジトリをチェックアウトしてインフラストラクチャをデプロイする前に、ソリューション アクセラレータのアーキテクチャ パターンを理解していることを確認してください。 例では、従来の ML プロジェクトの種類を使います。
Azure インフラストラクチャ パイプラインを実行する
リポジトリ
mlops-v2-ado-demo
に移動し、config-infra-prod.yml ファイルを選択します。重要
リポジトリのメイン ブランチが選択されていることを確認します。
この構成ファイルでは、一意性を確保するために、名前空間と後置値を使って成果物の名前を指定します。 構成の次のセクションを好みに合わせて更新します。
namespace: [5 max random new letters] postfix: [4 max random new digits] location: eastus
注意
CV や NLP などのディープ ラーニング ワークロードを実行している場合は、デプロイ ゾーンで GPU コンピューティングを使用できることを確認します。
[コミット] を選択してコードをプッシュし、これらの値をパイプラインで取得します。
[パイプライン] セクションに移動します
[Create Pipeline] を選択します。
[Azure Repos Git] を選択します。
前のセクションからクローンしたリポジトリ
mlops-v2-ado-demo
を選びます[既存の Azure Pipelines YAML ファイル] を選択します。
main
ブランチ、mlops/devops-pipelines/cli-ado-deploy-infra.yml
の順に選び、[続行] を選びます。パイプラインを実行します。終わるまで数分かかります。 パイプラインで次の成果物が作成されるはずです。
- ストレージ アカウント、Container Registry、Application Insights、Keyvault、Azure Machine Learning ワークスペース自体などのワークスペース用のリソース グループ。
- ワークスペースには、コンピューティング クラスターも作成されます。
これで、MLOps プロジェクトのインフラストラクチャがデプロイされました。
注意
"Unable move and reuse existing repository to required location" (既存のリポジトリを必要な場所に移動して再利用できません) という警告は無視してかまいません。
トレーニングとデプロイのサンプル シナリオ
ソリューション アクセラレータには、ニューヨーク市のタクシー料金を予測する線形回帰を実行するエンドツーエンドの機械学習パイプラインのサンプルのコードとデータが含まれています。 パイプラインはコンポーネントで構成され、それぞれが異なる機能を提供します。これは、ワークスペースに登録し、バージョン管理し、さまざまな入力と出力で再利用できます。 Computer Vision シナリオと NLP シナリオのサンプル パイプラインとワークフローには、さまざまな手順やデプロイの手順があります。
このトレーニング パイプラインには、次の手順が含まれています。
データを準備する
- このコンポーネントは、複数のタクシー データセット (黄と緑) を取得し、データのマージとフィルター処理を行い、トレーニングと値および評価のデータセットを準備します。
- 入力: ./data/ の下のローカル データ (複数の .csv ファイル)
- 出力: 単一の準備済みデータセット (.csv) とトレーニング、値、テスト データセット。
モデルのトレーニング
- このコンポーネントは、トレーニング セットで線形リグレッサーをトレーニングします。
- 入力: トレーニング データセット
- 出力: トレーニング済みモデル (pickle 形式)
モデルの評価
- このコンポーネントは、トレーニング済みのモデルを使って、テスト セットでタクシー料金を予測します。
- 入力: ML モデルとテスト データセット
- 出力: モデルのパフォーマンスと、デプロイするかどうかのデプロイ フラグ。
- このコンポーネントは、モデルのパフォーマンスと、新しいテスト データセットでの以前にデプロイされたすべてのモデルを比較し、モデルを運用環境に昇格させるかどうかを決定します。 モデルの運用環境への昇格は、AML ワークスペースにモデルを登録することによって行われます。
モデルを登録する
- このコンポーネントは、テスト セットでの予測の精度に基づいてモデルにスコアを付けます。
- 入力: トレーニング済みのモデルとデプロイ フラグ。
- 出力: Azure Machine Learning に登録されたモデル。
モデル トレーニング デプロイのパイプライン
ADO パイプラインに移動します
[新しいパイプライン] を選択します。
[Azure Repos Git] を選択します。
前のセクションからクローンしたリポジトリ
mlopsv2
を選びます[既存の Azure Pipelines YAML ファイル] を選択します。
ブランチとして
main
を選び、/mlops/devops-pipelines/deploy-model-training-pipeline.yml
を選んでから、[続行] を選びます。パイプラインを保存して実行します
注意
この時点で、インフラストラクチャが構成され、MLOps アーキテクチャのプロトタイプ作成ループがデプロイされます。 トレーニング済みのモデルを運用環境に移動する準備ができました。
トレーニング済みモデルのデプロイ
このシナリオには、トレーニング済みモデルのデプロイ方法として、バッチ スコアリング、またはリアルタイム スコアリングのためのエンドポイントへのモデルのデプロイという 2 つのアプローチの事前構築済みワークフローが含まれます。 これらのワークフローのいずれかまたは両方を実行して、Azure ML ワークスペースでのモデルのパフォーマンスをテストできます。 この例では、リアルタイム スコアリングを使用します。
ML モデル エンドポイントをデプロイする
ADO パイプラインに移動します
[新しいパイプライン] を選択します。
[Azure Repos Git] を選択します。
前のセクションからクローンしたリポジトリ
mlopsv2
を選びます[既存の Azure Pipelines YAML ファイル] を選択します。
ブランチとして
main
を選択し、マネージド オンライン エンドポイント/mlops/devops-pipelines/deploy-online-endpoint-pipeline.yml
を選択したら、[続行] を選びます。オンライン エンドポイントの名前は一意である必要があるため、
taxi-online-$(namespace)$(postfix)$(environment)
を別の一意の名前に変更して、[実行] を選びます。 失敗しない場合は、既定値を変更する必要はありません。重要
既存のオンライン エンドポイント名が原因で実行が失敗する場合は、前に説明したようにパイプラインを再作成し、<自分のエンドポイント名> を <自分のエンドポイント名 (ランダムな番号)> に変更します
実行が完了すると、次の画像のような出力が表示されます。
このデプロイをテストするには、AzureML ワークスペースの [エンドポイント] タブに移動し、エンドポイントを選択して [テスト] タブをクリックします。
/data/taxi-request.json
で複製されたリポジトリにあるサンプルの入力データを使用して、エンドポイントをテストできます。
リソースをクリーンアップする
- パイプラインを続けて使わない場合は、Azure DevOps プロジェクトを削除します。
- Azure portal で、リソース グループと Azure Machine Learning インスタンスを削除します。
次の手順
- Python SDK v2 のインストールとセットアップ
- Python CLI v2 のインストールとセットアップ
- GitHub での Azure MLOps (v2) ソリューション アクセラレータ
- Machine Learning を使用した MLOps に関するトレーニング コース
- Azure Machine Learning での Azure Pipelines について詳しく理解する
- Azure Machine Learning での GitHub Actions について詳しく理解する
- 1 時間かからずに Azure に MLOps をデプロイする - Community MLOps V2 アクセラレータのビデオ