Amazon SageMakerでマネージドなMLflowが使用できるようになりました

2024.06.20

こんちには。

データアナリティクス事業本部 機械学習チームの中村(nokomoro3)です。

今朝目が覚めたら、Amazon SageMakerでマネージドなMLflowが使用可能になっていました。

SageMaker Studioを立ち上げると、ApplicationsのところにMLflowが追加されています。

sagemaker-full-managed-mlflow_2024-06-20-08-41-15

今回はこちらの機能を試してみたいと思います。

MLflowを立ち上げてみる

確認

先ほどのApplicationsからMLflowを選択すると以下のような画面になりますので、「Create」を押下します。

sagemaker-full-managed-mlflow_2024-06-20-08-56-22

必要項目を入力します。

sagemaker-full-managed-mlflow_2024-06-20-08-59-11

説明文を読んでみましょう。

By default, MLflow Tracking Servers will be size Small, use MLflow 2.13.2, and use the execution role for the SageMaker Studio Domain.
Please ensure you have configured the appropriate IAM role for this MLflow Tracking Server. By default we will use the Studio Domain execution role as the tracking server role. For more details, please see the SageMaker documentation.

デフォルトではMLflowのTracking ServerのサイズはSmall、MLflowのバージョンは 2.13.2 、ロールはドメインの実行ロールが使われるようです。
(今回はSageMakerドメインの高速セットアップで自動的に作成された実行ロールとなります)

これらの設定値は「Update」を押下すると編集することができます。値については以下にも説明がありました。

Tracking Serverのサイズは、要求されるTPS(Transactions Per Second)によってSmall、Medium、Largeから選択します。

MLflowのバージョンは今は 2.13.2 のみサポートしているようです。

実行ロールが適切な権限をもっているかどうかは、以下で確認できそうです。

今回はそのまま作成を押下します。するとExperimentsの画面に遷移します。

sagemaker-full-managed-mlflow_2024-06-20-09-16-23

MLflow自体の起動状況は、MLflowの画面で以下のように確認できます。

sagemaker-full-managed-mlflow_2024-06-20-09-12-20

しばらくまつと「Creating」から「On」に遷移します。

sagemaker-full-managed-mlflow_2024-06-20-10-54-41

「Open MLflow」を押下すると、MLflowの画面を確認することができます。

sagemaker-full-managed-mlflow_2024-06-20-11-59-16

ただしこのままではアクセスできませんでした。現在のところは、高速セットアップで作成したドメインの実行ロールには、必要な権限が含まれていなかったようです。

IAMポリシーの修正

高速セットアップで作成したドメインの実行ロールには以下のポリシーが割り当たっています。

この内容を以下と比較して、不足があることを確認できました。

不足分は sagemaker-mlflow:* の部分の権限だったので、以下のように修正しました。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::*"
            ]
        },
        {            
            "Effect": "Allow",            
            "Action": [
                "sagemaker-mlflow:*"
            ],            
            "Resource": "*"        
        }
    ]
}

再確認

カスタムポリシー修正、以下のようにMLflowの画面にアクセスできることが確認できました。

sagemaker-full-managed-mlflow_2024-06-20-14-04-28

実験管理を試す

サンプルノートブックをJupyterLab Spaceで立ち上げる

今度はExperimentsの画面から、「Open sample notebook」を押下して実験を実行してみましょう。

sagemaker-full-managed-mlflow_2024-06-20-14-10-20

サンプルのプレビュー画面となりますので、さらに「Open sample notebook」を押下します。

sagemaker-full-managed-mlflow_2024-06-20-14-25-12

ノートブックを実行するためのJupyterLab Spaceを選択するダイアログが表示されます。今回は新しいSpaceを作成して作成ボタンを押下します。

sagemaker-full-managed-mlflow_2024-06-20-14-26-37

以下のようにStatusが「Running」となるまで待ちます。

sagemaker-full-managed-mlflow_2024-06-20-14-32-41

このままJupyterLabを開いてもサンプルのノートブックは現れませんでしたので、再度Experimentsの画面から「Open sample notebook」のダイアログを表示して、今度は「Use Existing Notebook」で先ほど作成したJupyterLab Spaceを選択して起動します。

sagemaker-full-managed-mlflow_2024-06-20-14-34-05

すると、JupyterLab Spaceでサンプルのノートブックが開かれた状態に遷移できました。

sagemaker-full-managed-mlflow_2024-06-20-14-35-36

MLflowのTracking Serverの設定

ノートブックの <TRACKING_SERVER_ARN> の部分は編集する必要があります。事前に作成したMLflowのリソースからARNを複製します。

sagemaker-full-managed-mlflow_2024-06-20-14-40-08

そしてノートブック内の以下の値を差し替えます。

# Provide the ARN of the Tracking Server that you want to track your training job with
tracking_server_arn = '<TRACKING_SERVER_ARN>'

サンプルノートブックの修正

その他、いくつかそのままでは動かない部分があるため対応を実施します。

SageMaker SDKを最新化

まずはSageMaker SDKを最新化します。(切り分けの過程でこちらが必須かどうかまでは不明ですが年のため)

起動されるJupyterLab Space次第ではありますが、今回は sagemaker-distribution:1.8.0-cpu でJupyterLab Spaceが作成されたため、SageMaker SDKのバージョンは 2.219.0 となっていました。こちらを以下のコマンドで最新の 2.224.0 にアップグレードします。

!pip install --upgrade sagemaker

バージョンを確認するには、以下を実行ください。最新になっていないようであればノートブックを再起動しましょう。

import sagemaker
print(sagemaker.__version__)

# sagemaker.config INFO - Not applying SDK defaults from location: /etc/xdg/sagemaker/config.yaml
# sagemaker.config INFO - Not applying SDK defaults from location: /home/sagemaker-user/.config/sagemaker/config.yaml
# 2.224.0

requirements.txtの修正

追加でインストールするPythonパッケージを管理するrequirements.txtが、サンプルノートブックではたくさん記載されていますが、mlflowとsagemaker-mlflowだけにしておきます。
(サンプルノートブックの通り全部をそのまま使うと、指定のバージョンが見つからないケースがありました)

%%writefile training_code/requirements.txt
mlflow==2.13.2
sagemaker-mlflow==0.1.0

warm poolの無効化

最後に以下で指定されている keep_alive_period_in_seconds=3600 を削除またはコメントアウトします。

sklearn = SKLearn(
    entry_point='train.py',
    source_dir='training_code',
    framework_version='1.2-1',
    instance_type='ml.c4.xlarge',
    role=role,
    sagemaker_session=sagemaker_session,
    hyperparameters={'max_leaf_nodes': 30},
    # keep_alive_period_in_seconds=3600,
    environment={
        'MLFLOW_TRACKING_ARN': tracking_server_arn
    }
)

こちらが有効になっていると、通常のTrainingジョブとは別のサービスクォータ「for training warm pool usage」の引き上げが必要になるため、設定を削除して「for training job usage」側の制限が適用されるようにしました。サービスクォータの設定値によってはそのままでも問題ないはずです。

ノートブックの実行

これらの修正が終わった後、ノートブックのすべてのセルを一括実行しれば完了です。

結果の確認

Trainingジョブが完了すると、MLflowの画面が更新され、以下のように学習結果が表示されることを確認できました。

sagemaker-full-managed-mlflow_2024-06-20-16-26-58

いろいろクリックして学習結果やメトリクスを確認できますので、触ってみてください。

モデル登録

MLflowの画面からModelを登録することが可能です。以下のように「Run Name」のところをクリックします。

sagemaker-full-managed-mlflow_2024-06-20-16-50-47

右上の「Register model」をクリックします。

sagemaker-full-managed-mlflow_2024-06-20-16-51-23

更新する場合はモデルを選択すればよいはずですが、今回は新規に「Create New Model」を選択します。

sagemaker-full-managed-mlflow_2024-06-20-16-52-01

Model Nameを入力して、「Register」を押下します。

sagemaker-full-managed-mlflow_2024-06-20-16-53-24

Detailsのところに、Registered Modelが追加されていることが分かると思います。

sagemaker-full-managed-mlflow_2024-06-20-16-53-58

SageMaker StudioのModelsからも、登録したモデルを確認することができました。

sagemaker-full-managed-mlflow_2024-06-20-16-56-22

リソースの停止

料金が発生しないよう、使用したリソースを停止していきます。

まずは「Running instances」から、JupyterLab Spaceを停止します。

sagemaker-full-managed-mlflow_2024-06-20-16-48-39

またMLflowのページから「Delete」もしくは「Stop」を実行します。

sagemaker-full-managed-mlflow_2024-06-20-16-49-12

Deleteの場合は、実験管理のメタデータ(メトリクスやパラメータ等)が失われるのでご注意ください。(学習したモデルのデータはS3に格納されているので失われないようです)

Are you sure you want to delete the tracking server cm-nakamura-mlflow?
Deleting a tracking server will result in losing all experiment metadata (metrics, parameters, runs) you logged to it. Your artifacts (model weights, images, datasets) will still remain in the S3 bucket configured for this tracking server.

まとめ

いかがでしたでしょうか。本記事がSageMaker Studioで使用できるようになったマネージドなMLflowが気になる方への参考になれば幸いです。