はじめに
こちらは、 Managing your machine learning lifecycle with MLflow and Amazon SageMakerを参考にして実際に作成したものです。
ただし、このブログの紹介で作成しているのは、MLflowをECS上にDeployし、S3とRDSをそれぞれArtifact store、backendストアにするところまでなので、 SageMakerもまとめて作りたい場合はこちらを!
MLflow初であれば→MLflow 基礎
準備
-
AWSアカウント → まだ無い場合はSign Up
-
aws-cdk
をインストール&設定- 詳細はこちらを参照
-
https://github.com/aws-samples/amazon-sagemaker-mlflow-fargate をClone
1. MLflowをFarget上にCloudFormationStackを用いてDeploy
-
上記のレポCloneしたディレクトリへ移動
cd amazon-sagemaker-mlflow-fargate
-
必要なものをインストール
python3 -m venv .venv source .venv/bin/activate pip3 install -r requirements.txt
-
デプロイ (25分くらいかかる)
AWSの特定のprofileを使用している場合は、
--profile <profile名>
をつけるcdk deploy --parameters ProjectName=mlflow --require-approval never
結果詳細
cdk deploy --parameters ProjectName=mlflow --require-approval never --profile naka-personal ... ✅ DeploymentStack Outputs: DeploymentStack.LoadBalancerDNS = Deplo-MLFLO-xxx-xxxx.elb.ap-northeast-1.amazonaws.com DeploymentStack.MLFLOWLoadBalancerDNSAEFB7E43 = Deplo-MLFLO-xxxx-xxxxx.elb.ap-northeast-1.amazonaws.com Stack ARN: arn:aws:cloudformation:ap-northeast-1:xxxxx:stack/DeploymentStack/798f4a90-313e-11ec-a179-0aa3345c497f
Docker起動していないとエラーになる
Dockerを起動していないと以下のようなエラーになるので注意
cdk deploy --parameters ProjectName=mlflow --require-approval never --profile naka-personal [Warning at /DeploymentStack/MLflow/Container/AssetImage] DockerImageAsset.repositoryName is deprecated. Override "core.Stack.addDockerImageAsset" to control asset locations DeploymentStack: deploying... [0%] start: Publishing 8f0fed36a7179b1d96d969db07932d3497d1d1a297b54c7b1eb5dd77dc952f06:current Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? [100%] fail: docker build --tag cdkasset-8f0fed36a7179b1d96d969db07932d3497d1d1a297b54c7b1eb5dd77dc952f06 . exited with error code 1: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? ❌ DeploymentStack failed: Error: Failed to publish one or more assets. See the error messages above for more information. at Object.publishAssets (/usr/local/lib/node_modules/aws-cdk/lib/util/asset-publishing.ts:25:11) at Object.deployStack (/usr/local/lib/node_modules/aws-cdk/lib/api/deploy-stack.ts:252:3) at CdkToolkit.deploy (/usr/local/lib/node_modules/aws-cdk/lib/cdk-toolkit.ts:189:24) at initCommandLine (/usr/local/lib/node_modules/aws-cdk/bin/cdk.ts:225:9) Failed to publish one or more assets. See the error messages above for more information.
このコマンドでデプロイされたもの (app.pyにかかれている) (CloudFormation Stack
DeploymentStack
でも詳細確認可):- IAM ROLE
DeploymentStack-MLflowExecutionRoleXXXXXXXXXXX
- SECRET
-
dbPassword
がSecretManagersに作成される
-
- VPC
- Vpc:
DeploymentStack/VPC
: 10.0.0.0/24 <- このCidrがすでに使われている場合はエラるかも - Subnets:
DeploymentStack/VPC/PublicSubnet1
DeploymentStack/VPC/PrivateSubnet1
DeploymentStack/VPC/DBSubnet2
DeploymentStack/VPC/PrivateSubnet2
DeploymentStack/VPC/PublicSubnet2
DeploymentStack/VPC/DBSubnet1
- Others: RouteTable, InterneteGateway, ElasticIP
- Vpc:
- S3 BUCKET
mlflow-artifacts-<account id>
- DATABASE
- 名前: ランダム文字列, size:
db.t2.small
, Engine:MySQL Community
- 名前: ランダム文字列, size:
- FARGATE SERVICE
- ECS cluster using Fargate:
mlflow
- Service:
mlflow
- ECR:
<account id>.dkr.ecr.ap-northeast-1.amazonaws.com/aws-cdk/assets
- Service:
- ECS cluster using Fargate:
- IAM ROLE
-
MLflow UIの確認
アウトプットのDeploymentStack.LoadBalancerDNS
に書いてあるリンクを開く。
※ただし、LBがPublicで、MLflowはuser access controlの機能を提供してないので、実際に使う場合には、PrivateLinkなどを使ってPrivateにする必要がある
2. SageMakerからの連携
ブログ内ではSageMakerの作成部分は書かれていないため省略… (予想外。) 最後にに比較を書いたので、SageMakerも含めて作成したい場合は、そちらも参考に。
SageMakerの中でのプロジェクト管理をMLflowのRemoteURIを用いて行えるようになる
import mlflow
mlflow.set_tracking_uri('<YOUR LOAD BALANCER URI>')
3. Farget上に作成したMLflowの削除 (20分ほどかかる)
作成したものの削除
cdk destroy --parameters ProjectName=mlflow --require-approval never --profile naka-personal
Are you sure you want to delete: DeploymentStack (y/n)? y
DeploymentStack: destroying...
...
✅ DeploymentStack: destroyed
比較 & まとめ
関連したCDKがいくつかあり試したので、一応所感を書いておく。
-
aws-mlflow-sagemaker-cdk:
- 2021-10-14 に作られた最新のもので、SageMakerとMLflowをまとめて構築できる最強のパック。
- TypescriptっぽいのでPythonに慣れてる人にとってはちょっとマイナス。
- MLflowのEndpointがinternalロードバランサーで作成されるので、デフォルトではMLflow UIへのアクセス方法がない‥ → Client VPNを使って試した記事はこちら
-
amazon-sagemaker-mlflow-fargate:
- こちらは今回紹介したもの
- コードはPython
- MLflowのEndpointがInternet facingとなるので、セキュリティ上そのままは使えない
- 名前からはSageMakerとMLflow両方デプロイするように見えて実は、MLflowをFargate上にデプロイしているだけなので、SageMakerは別途自分で作成する必要がある
-
amazon-sagemaker-cdk-examples:
- SageMakerのCDKサンプルが沢山入っているもの
- MLflowは関係ない
- 一番使いたかったのは、 notebook-teamsだが、こちらはVPCやSubnetまで作成するので、今回紹介した MLflowをFargate上に構築するのとあまり相性が良くない。別々でVPCが作成されたあとのPrivateLinkなどの設定を別途作成する必要がある。→ それなら一番上のaws-mlflow-sagemaker-cdkが一番楽そう。
これらは、どれもVPCの構築からしてくれるので、全く何もないところにPOCで構築して試すにはもってこいである。ただし、既存のVPCの上に構築したい場合には、他のものを探したり自分で書き直す必要がありそう。
Reference
- aws-samples/aws-mlflow-sagemaker-cdk
- aws-samples/amazon-sagemaker-mlflow-fargate
- aws-samples/amazon-sagemaker-cdk-examples
- Managing your machine learning lifecycle with MLflow and Amazon SageMaker
- MLflow
- cdk コマンドの機能を 実際に叩いて理解する 【 AWS CDK Command Line Interface 】
- AWS Cloud Development Kit(CDK)(Python)を使って「VPC+Sagemaker+Lambda」環境構築してみた(Sagemaker編)