クラウド上の MLflow

May 09 2023
この記事では、クラウド (AWS および GCP) で mlflow をホストし、機械学習実験を実行し、パラメーターとメトリクスをログに記録し、モデルをモデル レジストリに保存する方法について説明します。mlflow は、エンドツーエンドの機械学習ライフサイクルを管理するオープン ソース プラットフォームです。その主な機能は次のとおりです: mlflow をローカルマシンで実行できますが、クラウドでホストすることには利点があります mlflow には次の 3 つの主要コンポーネントがあります: 上記のアーキテクチャ図は、必要なすべての AWS サービスと、それらがどのように相互作用するかを示していますAWS で mlflow をホストするために。

この記事では、クラウド (AWS および GCP) で mlflow をホストし、機械学習実験を実行し、パラメーターとメトリクスをログに記録し、モデルをモデル レジストリに保存する方法について説明します。

mlflowとは何ですか?

mlflow は、エンドツーエンドの機械学習ライフサイクルを管理するオープン ソース プラットフォームです。主な機能は次のとおりです。

  1. 実験の追跡:すべての機械学習実験とそれらをクエリする機能を維持します
  2. 再現性:機械学習コードをパッケージ化し、それらの結果を任意のプラットフォームで再現できます。
  3. デプロイ:さまざまな環境で ML モデルをデプロイする機能 (例: AWS Sagemaker、GCP クラウド実行など)
  4. モデル レジストリ:集中リポジトリでモデルの複数のバージョンを維持する

ローカル マシンで mlflow を実行できますが、クラウドでホストすることには利点があります

  1. クラウド ストレージ、コンピューティング パワー、セキュリティなどを活用できます。
  2. 各チーム メンバーからのすべての実験の集中ビュー

mlflow には、次の 3 つの主要コンポーネントがあります。

  1. ダッシュボード:各実験の実験、モデル パラメーター、メトリックなどのリストを確認できる UI です。
  2. メタ ストア:バックエンド データベース (MySql) を使用して、すべての実験、パラメーター、メトリックなどを保存します。
  3. Artifactory Store:シリアル化されたモデルなどの大きなファイルに使用します。一般に、Amazon S3 や GCP Cloud Storage などの分散ファイル システムを使用しています。
  1. ドッカー
  2. MySql データベース
  3. 分散ファイル システム
MLflow-AWS アーキテクチャ

上記のアーキテクチャ図は、必要なすべての AWS サービスと、AWS で mlflow をホストするためにそれらがどのように相互作用するかを示しています。サーバーレスである AWS Fargate を使用して mlflow を起動します。

まず、mlflow とその依存関係をパッケージ化する docker ファイルを作成する必要があります。requirements.txt で次の依存関係を定義します。

mlflow のインストールとサーバーの実行のための docker ファイル

docker ファイルにはバケットとその他のデータベース接続の詳細が変数として含まれており、これらの値は Fargate タスク定義で環境変数として設定されます

dockerfile を取得したら、以下のコマンドを実行して docker イメージをビルドします。

docker build -t mlflowtracker .

AWS ECR リポジトリの作成

ここで、ローカルで作成した Docker イメージを AWS のコンテナ レジストリにプッシュする必要があります。

# Login 
aws ecr get-login-password --region region | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.region.amazonaws.com

# Tag local docker image
docker tag <image_name> aws_account_id.dkr.ecr.region.amazonaws.com/repository_name:tag

# Push image
docker push aws_account_id.dkr.ecr.region.amazonaws.com/repository_name:tag

次に、AWS RDS MySql インスタンスを作成するために、mlflow がメタ情報を保存するための MySql が必要です。

AWS RDS で MySql を作成する手順については、ここをクリックしてください

モデル アーティファクトを保存するには、mlflow 用の S3 バケットを作成する必要があります。aws コンソールに移動し、s3 を検索してバケット名を指定し、すべてのパブリック アクセスをブロックしていることを確認して、[バケットの作成] をクリックします。

S3 バケットを作成する

次に、fargate をコンピューティングとして選択して、AWS ECS クラスターを作成する必要があります。aws コンソールに移動して Elastic Container Service を検索し、[クラスターの作成] をクリックします。クラスターの作成ページで、クラスター名を指定し、vpc とサブネットを選択します。デフォルトでは、fargate オプションが選択されます。

ECS クラスターの作成

ECS では、タスクは Docker イメージを実行する粒度レベルのエンティティであり、kubernetes のポッドに似ています。そのため、ECR にアップロードした Docker イメージを使用するタスク定義を作成する必要があります。ここでは、環境変数の値を定義します。タスク定義を作成するには、[Amazon Elastic Container Service] > [タスク定義] > [新しいタスク定義の作成]に移動し、タスク名、ECR にアップロードしたイメージ URI、コンテナ ポート、および環境変数を提供します。

ECS タスク定義

タスク定義の作成中に、 AWS によって自動的に作成されるecsTaskExecutionロールを選択します。s3 アクセス ポリシーを追加して、s3 バケットに読み書きできるようにしてください。

タスク定義を作成したら、上記で作成したタスク定義を使用するサービスを作成する必要があります。サービスの作成中に、必要なタスクの最小数と最大数を選択できるため (ここでは 1 つのタスクのみを選択しました)、自動スケーリングを行うことができます。このステップでロードバランサーを作成するオプションがあります。

ECS サービスを作成するには、Amazon Elastic Container Service >clusters >cluster_name> Create and provide service name に移動し、タスク定義と以前に作成したリビジョンを選択し、タスクの最小数と最大数を入力し、ネットワーク セクションで vpc を選択し、アプリケーションを選択します。ロード・バランサー・セクションでロード・バランサーを指定し、名前、リスナー・ポート、ターゲット・グループ名を指定します

タスク オーケストレーションのための ECS サービス
ECS サービス ロード バランサー

サービスを作成すると、必要な数のタスクがスピンアップされ、ロード バランサーの URL を使用して mlflow ダッシュボードを起動できます。

注:ロード バランサーは、インバウンドおよびアウトバウンドのネットワーク ルールを定義するセキュリティ グループを使用します。mlflow UI にアクセスできるように、ルールを変更または追加する必要があります。

AWS で mlflow をホストしたので、クラウド上の mlflow を指定してローカルから機械学習実験を実行しましょう

実験を実行した後、実験中にログに記録した mlflow のすべてのパラメーター、メトリック、およびモデルを確認できます。

mlflow と実験結果 — AWS

GCP 上の MLflow

MLflow-GCP アーキテクチャ

上記のアーキテクチャ図は、必要な GCP サービスと、GCP で mlflow をホストするためにそれらがどのように相互作用するかを示しています。サーバーレスである GCP Cloudrun を使用して mlflow を起動します。

boto3をgoogle-cloud-storageに変更する必要があることを除いて、同じ Dockerfile と requirements.txt を使用できます (AWS の MLflow セクションを参照してください)。

デフォルトのアーティファクトの Dockerfile 内の変数、データベース接続の詳細は、Google cloudrun の環境変数として構成されます

次のコマンドを実行して、Docker イメージをビルドし、タグ付けして、Google Container Registry (GCR) にプッシュします。

# Build docker image
docker build -t mlflowtracker-gcp .

# Install docker credential helper using gcloud
gcloud components install docker-credential-gcr docker-credential-gcr configure-docker

# Tag docker image
docker tag <local_image_name> gcr.io/gcp_project_id/mlflowtracker-gcp:latest

# Push docker image
docker push gcr.io/gcp_project_id/mlflowtracker-gcp:latest

mlflow メタストア用の GCP MySQL インスタンスの作成

DB インスタンスを作成しました。次に、データベースとユーザーを作成して、mlflow がこれらの詳細を使用してデータベースに接続できるようにする必要があります。SQL ページで、[データベース] をクリックし、[データベースの作成] をクリックしてデータベース名を指定します。同様にユーザーのリンクをクリックし、ユーザー名とパスワードを入力します

GCP MySQL データベースの作成
GCP MySQL データベース ユーザーの作成

モデル アーティファクトを格納するために、mlflow 用のクラウド ストレージ バケットを作成する必要があります。クラウド ストレージ バケットを作成するには、GCP コンソールでクラウド ストレージを検索し、[作成] ボタンをクリックして、バケット名とリージョンを指定し、[作成] をクリックします。

mlflow モデル アーティファクト用の GCP バケット

コンテナ レジストリにアップロードした Docker イメージを使用する CloudRun サービスを gcp で作成します。クラウド実行インスタンスを作成するには、クラウド実行ページに移動して [サービスの作成] をクリックし、GCR にアップロードしたコンテナー イメージを選択して、コンテナー ポート、CPU とメモリの値、自動スケーリング用の最小インスタンスと最大インスタンス、および環境変数を指定します。

GCP クラウドラン
GCP Cloudrun の構成

注: cloudrun で選択したサービス アカウントがクラウド ストレージにアクセスできることを確認してください。そうしないと、モデル アーティファクトのアップロードが失敗します。

GCP で mlflow をホストしたので、クラウド上の mlflow を指定してローカルから機械学習実験を実行しましょう

実験を実行した後、実験中にログに記録した mlflow のすべてのパラメーター、メトリック、およびモデルを確認できます。

mlflow と実験結果 - GCP

注: コンソールを使用してすべてのクラウド リソースを手動で作成しました。Infrastructure as Code (Terraform または CloudFormation) を使用することをお勧めします

AWS および GCP クラウド プラットフォームで mlflow をホストし、クラウドで機械学習の実験を実行する方法について、よく理解していただけたでしょうか。

ハッピーラーニング!!