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 アーキテクチャをいくつか理解することをお勧めします。 特定の機械学習プロジェクトに最適なアーキテクチャを選ぶ必要があります。

前提条件

注意

Git バージョン 2.27 以降が必要です。 Git コマンドのインストールについて詳しくは、https://git-scm.com/downloads でお使いのオペレーティング システムを選んでください

重要

この記事の CLI コマンドは、Bash を使ってテストされました。 異なるシェルを使うと、エラーが発生する可能性があります。

Azure と DevOps で認証を設定する

Azure Machine Learning で MLOps プロジェクトを設定する前に、Azure DevOps 用に認証を設定する必要があります。

サービス プリンシパルの作成

デモを使うには、作業する環境の数 (開発か、運用か、両方) に応じて、1 つまたは 2 つのサービス プリンシパルを作成する必要があります。 これらのプリンシパルは、次のいずれかの方法を使って作成できます。

  1. Azure Cloud Shell を起動します。

    ヒント

    Cloud Shell を初めて起動すると、Cloud Shell 用のストレージ アカウントの作成を求められます。

  2. 求められたら、Cloud Shell で使われる環境として Bash を選びます。 上部のナビゲーション バーのドロップダウンで環境を変更することもできます

    クラウド シェル環境ドロップダウンのスクリーンショット。

  3. 次の bash コマンドをコンピューターにコピーし、projectNamesubscriptionIdenvironment の各変数を実際のプロジェクトの値で更新します。 開発環境と運用環境の両方を作成する場合は、環境ごとにこのスクリプトを 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."
    
  4. 編集したコマンドを Azure Shell にコピーして実行します (Ctrl + Shift + v キー)。

  5. これらのコマンドを実行すると、サービス プリンシパルに関連する情報が表示されます。 この情報を安全な場所に保存します。この情報は、後のデモで Azure DevOps を構成するために使います。

    {
       "appId": "<application id>",
       "displayName": "Azure-ARM-dev-Sample_Project_Name",
       "password": "<password>",
       "tenant": "<tenant id>"
    }
    
  6. 開発環境と運用環境のサービス プリンシパルを作成する場合は、ステップ 3 を繰り返します。 このデモでは、1 つの環境のみ (運用環境) を作成します。

  7. サービス プリンシパルが作成されたら、Cloud Shell を閉じます。

Azure DevOps を設定する

  1. Azure DevOps に移動します。

  2. [新しいプロジェクトの作成] を選びます (このチュートリアルでは、プロジェクトを mlopsv2 という名前にします)。

    ADO プロジェクトのスクリーンショット。

  3. プロジェクトの [プロジェクトの設定] (プロジェクト ページの左下) で、[サービス接続] を選びます。

  4. [サービス接続の作成」] を選択します。

    ADO の [新しいサービス接続] ボタンのスクリーンショット。

  5. [Azure Resource Manager][次へ][サービス プリンシパル (手動)][次へ] の順に選び、スコープ レベルで [サブスクリプション] を選びます。

    • [サブスクリプション名] - サービス プリンシパルが格納されているサブスクリプションの名前を使います。
    • [サブスクリプション ID] - サブスクリプション ID としては、ステップ 1 で使った subscriptionId を使います
    • [サービス プリンシパル ID] - サービス プリンシパル ID としては、ステップ 1 の出力から appId を使います
    • [サービス プリンシパル キー] - サービス プリンシパル キーとしては、ステップ 1 の出力から password を使います
    • [テナント ID] - テナント ID としては、ステップ 1 の出力の tenant を使います
  6. サービス接続に Azure-ARM-Prod という名前を付けます。

  7. [すべてのパイプラインへのアクセス許可を与える] を選んでから、[確認して保存] を選びます。

Azure DevOps のセットアップが正常に終わりました。

Azure DevOps を使用してソース リポジトリを設定する

  1. Azure DevOps で作成したプロジェクトを開きます

  2. [リポジトリ] セクションを開き、[リポジトリのインポート] を選びます

    Azure DevOps での最初のリポジトリ インポートのスクリーンショット。

  3. [クローン URL] フィールドに「https://github.com/Azure/mlops-v2-ado-demo」と入力します。 ページの下部にある [インポート] を選びます。

    Azure DevOps の MLOps デモ リポジトリのインポートのスクリーンショット。

  4. 左側のナビゲーション ウィンドウの下部にある [プロジェクトの設定] を開きます

  5. [リポジトリ] セクションの [リポジトリ] を選びます。 前の手順で作成したリポジトリを選びます。[セキュリティ] タブを選びます

  6. [ユーザーのアクセス許可] セクションで、mlopsv2 Build Service ユーザーを選びます。 [投稿] アクセス許可を [許可] に変更し、[ブランチの作成] アクセス許可を [許可] に変更します。 Azure DevOps のアクセス許可のスクリーンショット。

  7. 左側のナビゲーション ウィンドウで [パイプライン] セクションを開き、[パイプラインの作成] ボタンの横にある縦に 3 つ並んだドットを選びます。 [セキュリティの管理] を選びます

    パイプラインのセキュリティのスクリーンショット。

  8. [ユーザー] セクションで、プロジェクトの mlopsv2 Build Service アカウントを選びます。 [ビルド パイプラインの編集] アクセス許可を [許可] に変更します

    [セキュリティの追加] のスクリーンショット。

注意

これで前提条件のセクションは終わり、それに応じてソリューション アクセラレータのデプロイを行うことができます。

Azure DevOps を使用したインフラストラクチャのデプロイ

このステップでは、前の手順で作成した Azure Machine Learning ワークスペースにトレーニング パイプラインをデプロイします。

ヒント

MLOps v2 リポジトリをチェックアウトしてインフラストラクチャをデプロイする前に、ソリューション アクセラレータのアーキテクチャ パターンを理解していることを確認してください。 例では、従来の ML プロジェクトの種類を使います。

Azure インフラストラクチャ パイプラインを実行する

  1. リポジトリ mlops-v2-ado-demo に移動し、config-infra-prod.yml ファイルを選択します。

    重要

    リポジトリのメイン ブランチが選択されていることを確認します。

    ADO でのリポジトリのスクリーンショット。

    この構成ファイルでは、一意性を確保するために、名前空間と後置値を使って成果物の名前を指定します。 構成の次のセクションを好みに合わせて更新します。

     namespace: [5 max random new letters]
     postfix: [4 max random new digits]
     location: eastus
    

    注意

    CV や NLP などのディープ ラーニング ワークロードを実行している場合は、デプロイ ゾーンで GPU コンピューティングを使用できることを確認します。

  2. [コミット] を選択してコードをプッシュし、これらの値をパイプラインで取得します。

  3. [パイプライン] セクションに移動します

    ADO パイプラインのスクリーンショット。

  4. [Create Pipeline] を選択します。

  5. [Azure Repos Git] を選択します。

    ADO の [コードはどこにありますか?] のスクリーンショット。

  6. 前のセクションからクローンしたリポジトリ mlops-v2-ado-demo を選びます

  7. [既存の Azure Pipelines YAML ファイル] を選択します。

    Azure DevOps の構成ステップのパイプライン ページのスクリーンショット。

  8. main ブランチ、mlops/devops-pipelines/cli-ado-deploy-infra.yml の順に選び、[続行] を選びます。

  9. パイプラインを実行します。終わるまで数分かかります。 パイプラインで次の成果物が作成されるはずです。

    • ストレージ アカウント、Container Registry、Application Insights、Keyvault、Azure Machine Learning ワークスペース自体などのワークスペース用のリソース グループ。
    • ワークスペースには、コンピューティング クラスターも作成されます。
  10. これで、MLOps プロジェクトのインフラストラクチャがデプロイされました。 ADO のインフラ パイプライン画面のスクリーンショット。

    注意

    "Unable move and reuse existing repository to required location" (既存のリポジトリを必要な場所に移動して再利用できません) という警告は無視してかまいません。

トレーニングとデプロイのサンプル シナリオ

ソリューション アクセラレータには、ニューヨーク市のタクシー料金を予測する線形回帰を実行するエンドツーエンドの機械学習パイプラインのサンプルのコードとデータが含まれています。 パイプラインはコンポーネントで構成され、それぞれが異なる機能を提供します。これは、ワークスペースに登録し、バージョン管理し、さまざまな入力と出力で再利用できます。 Computer Vision シナリオと NLP シナリオのサンプル パイプラインとワークフローには、さまざまな手順やデプロイの手順があります。

このトレーニング パイプラインには、次の手順が含まれています。

データを準備する

  • このコンポーネントは、複数のタクシー データセット (黄と緑) を取得し、データのマージとフィルター処理を行い、トレーニングと値および評価のデータセットを準備します。
  • 入力: ./data/ の下のローカル データ (複数の .csv ファイル)
  • 出力: 単一の準備済みデータセット (.csv) とトレーニング、値、テスト データセット。

モデルのトレーニング

  • このコンポーネントは、トレーニング セットで線形リグレッサーをトレーニングします。
  • 入力: トレーニング データセット
  • 出力: トレーニング済みモデル (pickle 形式)

モデルの評価

  • このコンポーネントは、トレーニング済みのモデルを使って、テスト セットでタクシー料金を予測します。
  • 入力: ML モデルとテスト データセット
  • 出力: モデルのパフォーマンスと、デプロイするかどうかのデプロイ フラグ。
  • このコンポーネントは、モデルのパフォーマンスと、新しいテスト データセットでの以前にデプロイされたすべてのモデルを比較し、モデルを運用環境に昇格させるかどうかを決定します。 モデルの運用環境への昇格は、AML ワークスペースにモデルを登録することによって行われます。

モデルを登録する

  • このコンポーネントは、テスト セットでの予測の精度に基づいてモデルにスコアを付けます。
  • 入力: トレーニング済みのモデルとデプロイ フラグ。
  • 出力: Azure Machine Learning に登録されたモデル。

モデル トレーニング デプロイのパイプライン

  1. ADO パイプラインに移動します

    ADO パイプラインのスクリーンショット。

  2. [新しいパイプライン] を選択します。

    ADO での [新しいパイプライン] ボタンのスクリーンショット。

  3. [Azure Repos Git] を選択します。

    ADO の [コードはどこにありますか?] のスクリーンショット。

  4. 前のセクションからクローンしたリポジトリ mlopsv2 を選びます

  5. [既存の Azure Pipelines YAML ファイル] を選択します。

    ADO の構成ステップのパイプライン ページのスクリーンショット。

  6. ブランチとして main を選び、/mlops/devops-pipelines/deploy-model-training-pipeline.yml を選んでから、[続行] を選びます。

  7. パイプラインを保存して実行します

注意

この時点で、インフラストラクチャが構成され、MLOps アーキテクチャのプロトタイプ作成ループがデプロイされます。 トレーニング済みのモデルを運用環境に移動する準備ができました。

トレーニング済みモデルのデプロイ

このシナリオには、トレーニング済みモデルのデプロイ方法として、バッチ スコアリング、またはリアルタイム スコアリングのためのエンドポイントへのモデルのデプロイという 2 つのアプローチの事前構築済みワークフローが含まれます。 これらのワークフローのいずれかまたは両方を実行して、Azure ML ワークスペースでのモデルのパフォーマンスをテストできます。 この例では、リアルタイム スコアリングを使用します。

ML モデル エンドポイントをデプロイする

  1. ADO パイプラインに移動します

    ADO パイプラインのスクリーンショット。

  2. [新しいパイプライン] を選択します。

    ADO でのエンドポイントの [新しいパイプライン] ボタンのスクリーンショット。

  3. [Azure Repos Git] を選択します。

    ADO の [コードはどこにありますか?] のスクリーンショット。

  4. 前のセクションからクローンしたリポジトリ mlopsv2 を選びます

  5. [既存の Azure Pipelines YAML ファイル] を選択します。

    Azure DevOps の構成ステップのパイプライン ページのスクリーンショット。

  6. ブランチとして main を選択し、マネージド オンライン エンドポイント /mlops/devops-pipelines/deploy-online-endpoint-pipeline.yml を選択したら、[続行] を選びます。

  7. オンライン エンドポイントの名前は一意である必要があるため、taxi-online-$(namespace)$(postfix)$(environment) を別の一意の名前に変更して、[実行] を選びます。 失敗しない場合は、既定値を変更する必要はありません。

    Azure DevOps バッチ デプロイ スクリプトのスクリーンショット。

    重要

    既存のオンライン エンドポイント名が原因で実行が失敗する場合は、前に説明したようにパイプラインを再作成し、<自分のエンドポイント名><自分のエンドポイント名 (ランダムな番号)> に変更します

  8. 実行が完了すると、次の画像のような出力が表示されます。

    ADO のパイプライン バッチ実行結果ページのスクリーンショット。

  9. このデプロイをテストするには、AzureML ワークスペースの [エンドポイント] タブに移動し、エンドポイントを選択して [テスト] タブをクリックします。/data/taxi-request.json で複製されたリポジトリにあるサンプルの入力データを使用して、エンドポイントをテストできます。

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

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

次の手順