Azure Machine Learning を使用した Python モデル用の MLOps

Azure Blob Storage
Azure Container Registry
Azure DevOps
Azure Machine Learning
Azure Pipelines

このリファレンス アーキテクチャでは、Azure DevOpsAzure Machine Learning を使用して、継続的インテグレーション (CI)、継続的デリバリー (CD)、および AI アプリケーション用の再トレーニング パイプラインを実装する方法を示します。 このソリューションは scikit-learn 糖尿病データセットに基づいて構築されていますが、あらゆる AI シナリオや、Jenkins や Travis といった広く普及している他のビルド システムに容易に適合させることができます。

このアーキテクチャの参照実装は、GitHub で入手できます

アーキテクチャ

Machine Learning DevOps アーキテクチャの図。

このアーキテクチャの Visio ファイルをダウンロードします。

ワークフロー

このアーキテクチャは、次のサービスで構成されています。

Azure Pipelines 。 このビルドおよびテスト システムは Azure DevOps に基づいており、ビルドおよびリリース パイプラインに使用されます。 Azure Pipelines ではこれらのパイプラインをタスクと呼ばれる論理的ステップに分割します。 たとえば、Azure CLI タスクによって Azure リソースが操作しやすくなります。

Azure Machine Learning は、大規模な機械学習モデルをトレーニング、スコアリング、デプロイ、および管理するためのクラウド サービスです。 このアーキテクチャでは、Azure Machine Learning の Python SDK を使用して、ワークスペース、コンピューティング リソース、機械学習パイプライン、およびスコアリング イメージを作成します。 Azure Machine Learning ワークスペースでは、機械学習モデルを実験、トレーニング、デプロイするための空間が提供されます。

Azure Machine Learning コンピューティング はオンデマンド仮想マシンのクラスターであり、自動スケーリングと GPU および CPU ノード オプションを備えています。 トレーニング ジョブはこのクラスターで実行されます。

Azure Machine Learning パイプライン は、シナリオをまたいで再利用できる再利用可能な機械学習ワークフローを提供します。 このユース ケースでは、これらのパイプライン内の別々のステップでトレーニング、モデル評価、モデル登録、およびイメージ作成を行います。 パイプラインはビルド フェーズの最後に発行または更新され、新しいデータの到着時にトリガーされます。

Azure Blob Storage 。 Blob コンテナーを使用して、スコアリング サービスからのログを格納します。 この場合、入力データとモデル予測の両方が収集されます。 何らかの変換後、これらのログはモデルの再トレーニングに使用できます。

Azure Container Registry 。 スコアリング Python スクリプトは Docker イメージとしてパッケージ化され、レジストリでバージョン管理されます。

Azure Container Instances 。 リリース パイプラインの一部として、スコアリング Web サービス イメージを Container Instances にデプロイすることによって QA およびステージング環境がシミュレートされ、サーバーレスで簡単にコンテナーを実行する方法を提供します。

Azure Kubernetes Service 。 スコアリング Web サービス イメージは、QA 環境で徹底的にテストされた後、マネージド Kubernetes クラスター上の運用環境にデプロイされます。

Azure Application Insights 。 この監視サービスは、パフォーマンスの異常を検出するために使用されます。

MLOps パイプライン

このソリューションは、ソフトウェア エンジニアが既に慣れているツールを使用して、AI プロジェクトのさまざまな段階をエンドツーエンドで自動化する方法を示しています。 機械学習の問題では、DevOps パイプラインに集中し続けることは簡単です。 このソリューションでは、scikit-learn 糖尿病データセットを使用して、糖尿病の可能性を予測するためのリッジ線形回帰モデルを構築します。

このソリューションは、次の 3 つのパイプラインに基づいています。

  • ビルド パイプライン。 コードをビルドしてテスト スイートを実行します。
  • 再トレーニング パイプライン。 スケジュールに従って、または新しいデータが利用可能になったらモデルを再トレーニングします。
  • リリース パイプライン。 スコアリング イメージを操作可能にし、さまざまな環境間でそれを安全に昇格させます。

以下のセクションでは、これらの各パイプラインについて説明します。

ビルド パイプライン

コードがチェックインされるたびに CI パイプラインがトリガーされます。 コードをビルドしてテスト スイートを実行した後、更新された Azure Machine Learning パイプラインを発行します。 ビルド パイプラインは以下のタスクで構成されます。

  • コード品質。 これらのテストでは、コードがチームの標準に準拠していることを確認します。

  • 単体テスト。 これらのテストでは、コードが正常に動作し、安定していること、またコード カバレッジが十分であることを確認します。

  • データ テスト。 これらのテストでは、期待されるスキーマと分布にデータ サンプルが準拠していることを検証します。 他のユース ケースに合わせてこのテストをカスタマイズし、新しいデータの到着時にトリガーされる独立したデータ サニティ パイプラインとして実行します。 たとえば、データ テスト タスクをデータ インジェスト パイプラインに移動して、より早くテストできるようにします。

注意

機械学習モデルのトレーニングに使用されるデータに対して DevOps プラクティスを有効にすることを検討する必要がありますが、これについては、この記事では説明しません。 データ インジェスト パイプラインの CI/CD に対するアーキテクチャとベスト プラクティスの詳細については、「データ インジェスト パイプラインの DevOps」を参照してください。

Azure Machine Learning および Python SDK 用のインフラストラクチャをセットアップするときに、以下の 1 回限りのタスクが発生します。

  • Azure Machine Learning 関連のすべてのリソースをホストするワークスペースを作成します。
  • トレーニング ジョブを実行するコンピューティング リソースを作成します。
  • 更新されたトレーニング スクリプトを使用して機械学習パイプラインを作成します。
  • トレーニング ワークフローを調整するために、機械学習パイプラインを REST エンドポイントとして発行します。 次のセクションではこの手順について説明します。

再トレーニング パイプライン

機械学習パイプラインでは、モデルを非同期的に再トレーニングするプロセスが調整されます。 再トレーニングは、スケジュールに基づいてトリガーすることも、新しいデータが利用可能になったときに、前のステップで公開されているパイプライン REST エンドポイントを呼び出すことによってトリガーすることもできます。

このパイプラインには以下の手順が含まれています。

  • モデルのトレーニング。 実行履歴に保存されている新しいモデルを取得するために、トレーニング Python スクリプトが Azure Machine Learning コンピューティング リソースで実行されます。 トレーニングは AI プロジェクトで最もコンピューティング リソースを消費するタスクであるため、このソリューションでは Azure Machine Learning コンピューティングを使用します。

  • モデルの評価。 単純な評価テストで新しいモデルと既存のモデルを比較します。 新しいモデルの方が優れている場合にのみ、それを昇格させます。 それ以外の場合、モデルは登録されず、パイプラインはキャンセルされます。

  • モデルの登録。 再トレーニングしたモデルは、Azure Machine Learning Model レジストリに登録されます。 このサービスは、モデルを簡単に再現できるよう、モデルのバージョン管理をメタデータ タグと併せて提供します。

リリース パイプライン

このパイプラインは、スコアリング イメージを操作可能にし、さまざまな環境にまたがってそれを安全に昇格させる方法を示します。 このパイプラインは QA と運用の 2 つの環境に区分されています。

QA 環境

  • モデル成果物トリガー。 新しい成果物が利用可能になるたびに、リリース パイプラインがトリガーされます。 Azure Machine Learning モデル管理に新しく登録されるモデルは、リリース成果物として扱われます。 この場合、登録された新しいモデルごとにパイプラインがトリガーされます。

  • スコアリング イメージの作成。 登録されたモデルは、スコアリング スクリプトおよび Python の依存関係 (Conda YAML ファイル) と共に、運用化 Docker イメージにパッケージ化されます。 イメージは Azure Container Registry を通じて自動的にバージョン管理されます。

  • Container Instances へのデプロイ。 このサービスは、非運用環境を作成するために使用されます。 スコアリング イメージもここにデプロイされ、これは主にテストに使用されます。 Container Instances は Docker イメージをテストするための簡単で迅速な方法を提供します。

  • Web サービスのテスト。 簡単な API テストで、イメージが正しくデプロイされていることを確認します。

運用環境

  • Azure Kubernetes Service にデプロイ。 このサービスは、スコアリング イメージを Web サービスとして運用環境に大規模デプロイするために使用されます。

  • Web サービスのテスト。 簡単な API テストで、イメージが正しくデプロイされていることを確認します。

考慮事項

以降の考慮事項には、ワークロードの品質向上に使用できる一連の基本原則である Azure "Well-Architected Framework" の要素が組み込まれています。 詳細については、「Microsoft Azure Well-Architected Framework」を参照してください。

スケーラビリティ

Azure DevOps のビルド パイプラインは、あらゆる規模のアプリケーションに合わせてスケーリングできます。 ビルド パイプラインには最大タイムアウトがあり、これはパイプラインが実行されているエージェントによって異なります。 自己ホスト型エージェント (プライベート エージェント) 上ではビルドを無制限に実行できます。 Microsoft がホストするパブリック プロジェクト用のエージェントでは、ビルドを 6 時間実行できます。 プライベート プロジェクトの場合、制限は 30 分です。

最大タイムアウトを使用するには、Azure Pipelines YAML ファイルで次のプロパティを設定します。

jobs:
- job: <job_name>
  timeoutInMinutes: 0

ビルド パイプラインを速やかに終了させ、単体テストと他のテストのサブセットのみを実行するのが理想的です。 これにより、変更をすばやく検証し、問題が発生した場合は修正することができます。 実行時間の長いテストは業務時間外に実行します。

リリース パイプラインは、リアルタイム スコアリング Web サービスを発行します。 QA 環境へのリリースは便宜上 Container Instances を使用して行われますが、QA/ステージング環境で実行されている別の Kubernetes クラスターを使用できます。

Azure Kubernetes Service クラスターのサイズに応じて、運用環境をスケーリングします。 クラスターのサイズは、デプロイするスコアリング Web サービスで予想される負荷によって異なります。 リアルタイム スコアリング アーキテクチャの場合、スループットは重要な最適化メトリックです。 ディープ ラーニング以外のシナリオでは、CPU で十分に負荷を処理できます。しかし、ディープ ラーニングのワークロードで速度がボトルネックになっているときは、一般的に CPU よりも GPU の方が優れたパフォーマンスを発揮します。 Azure Kubernetes Service は CPU と GPU 両方のノード タイプをサポートしているため、このソリューションではイメージのデプロイにそれを使用します。 詳細については、ディープ ラーニング モデルのデプロイに関する GPU と CPU の比較に関するページを参照してください。

Azure Machine Learning コンピューティング リソースのノード数に応じて再トレーニング パイプラインをスケールアップおよびスケールダウンし、自動スケール オプションを使用してクラスターを管理します。 このアーキテクチャでは、CPU を使用します。 ディープ ラーニング ワークロードには GPU の方が適した選択肢であり、Azure Machine Learning コンピューティングによってサポートされています。

管理

  • 再トレーニング ジョブの監視。 機械学習パイプラインでは、マシン クラスター全体の再トレーニングが調整され、それらのマシンを監視する簡単な方法が提供されます。 Azure Machine Learning UI を使用して、パイプラインのセクションでログを確認します。 また、これらのログは BLOB にも書き込まれ、Azure Storage Explorer などのツールを使用してそこから読み取ることができます。

  • ログ記録。 Azure Machine Learning では、機械学習ライフサイクルの各ステップでログを記録するための簡単な方法が提供されています。 ログは BLOB コンテナーに保存されます。 詳細については、Azure Machine Learning でログ記録を有効にするを参照してください。 より高度な監視を行うには、ログを使用するように Application Insights を構成します。

  • セキュリティ。 すべてのシークレットと資格情報は Azure Key Vault に保存され、Azure Pipelines では変数グループを使用してアクセスします。

コストの最適化

コストの最適化とは、不要な費用を削減し、運用効率を向上させる方法を検討することです。 詳しくは、コスト最適化の柱の概要に関する記事をご覧ください。

Azure DevOps は、オープンソース プロジェクトおよびユーザーが 5 人までの小規模プロジェクトでは無料です。 より大規模なチームの場合は、ユーザー数に基づいてプランを購入してください。

コンピューティングはこのアーキテクチャのコストを最も左右し、そのコストはユース ケースによって異なります。 このアーキテクチャでは Azure Machine Learning コンピューティングを使用しますが、他のオプションも利用できます。 Azure Machine Learning では、コンピューティング クラスターをサポートする仮想マシンに追加料金は加算されません。 コンピューティング クラスターが 0 ノード以上になるように構成すると、使用されていないときは 0 ノードにスケールダウンでき、料金は発生しません。 コンピューティング料金は、ノード タイプ、ノード数、およびプロビジョニング モード (低優先度または専用) によって異なります。 Azure 料金計算ツールを使用して、Machine Learning やその他のサービスのコストを見積もることができます。

このシナリオのデプロイ

この参照アーキテクチャをデプロイするには、GitHub リポジトリ概要ガイドで説明されている手順に従ってください。

共同作成者

この記事は、Microsoft によって保守されています。 当初の寄稿者は以下のとおりです。

プリンシパル作成者:

  • Praneet Singh Solanki | シニア ソフトウェア エンジニア

次のステップ