Amazon SageMakerで
カスタムコンテナを使った学習
Training Toolkitを使った実装
2022/08/27 第14回勉強会
自己紹介
● 名前: 西岡 賢一郎
○ Twitter: @ken_nishi
○ note: 西岡賢一郎@研究者から経営者へ (https://note.com/kenichiro)
○ YouTube: 【経営xデータサイエンスx開発】西岡 賢一郎のチャンネル
(https://www.youtube.com/channel/UCpiskjqLv1AJg64jFCQIyBg)
● 経歴
○ 東京大学で位置予測アルゴリズムを研究し博士 (学術) を取得
○ 東京大学の博士課程在学中にデータサイエンスをもとにしたサービスを提供する株式会社ト
ライディアを設立
○ トライディアを別のIT会社に売却し、CTOとして3年半務め、2021年10月末にCTOを退職
○ CDPのスタートアップと株式会社データインフォームドの2つに所属
○ 自社および他社のプロダクト開発チーム・データサイエンスチームの立ち上げ経験
今回のお話
● カスタムコンテナ
● sagemaker-training-toolkit
● SageMaker上でイメージのbuild
● デモ
カスタムコンテナ (前回のおさらい)
SageMakerのEndpoint作成フロー
SageMakerで学習を実施しEndpoint作成する
Step
1.学習 (fit)
2.モデル作成
3.Endpoint Config作成
4.Endpoint作成
トレーニングと推論のDockerイメージ
トレーニングと推論では別々のイメージを使うこともできる。
小さいコンテナのほうが実行は早くなるが、管理コストとのバランスで決める。
トレーニング用イメージ 推論用イメージ
カスタムコンテナ
出典: https://aws.amazon.com/jp/blogs/news/sagemaker-custom-containers-pattern-training/
カスタムコンテナは以下の3種類のパターンで
作成できる
1. AWS 提供のコンテナイメージを拡張
a. 最も簡単
b. 独自ライブラリを使いたいときなど
2. 独自のコンテナイメージ + SageMaker
Training Toolkit
a. SageMaker Training Toolkit
3. スクラッチのコンテナイメージ
a. 非推奨
b. 最も難しい
c. SageMaker Training Jobの外部とデータとの
やり取りの使用の理解が必要
今回は、2の独自のコンテナイメージ +
SageMaker Training Toolkitでカスタムコンテナ
を作る方法を紹介
今回はこちらを紹介
sagemaker-training-toolkit
sagemaker-training-toolkitのイメージ作成に必要な3つのこと
必ずやることは以下の3つ
1. 使いたいイメージの中で
pip install sagemaker-training
を実行
2. 学習用スクリプトを /opt/ml/code下に配置
3.SAGEMAKER_PROGRAM でスクリプトを指定
(カスタムコンテナ構築に必要な唯一の環境変
数)
出典: https://github.com/aws/sagemaker-training-toolkit
指定する項目が少なくて
実装も簡単!
https://github.com/knishioka/machine-learning-workshop/blob/main/sagemaker/sklearn_custom_ml.py
学習用スクリプト train.py
大きく分けて2つのパートを用意しておく
1.モデルを学習しシリアライズし
/opt/ml/modelに保存
○ SKlearnのコンテナはカスタムスクリプトをイン
ポートするため、間違えて実行されないように
if __name__ == "__main__" に入れておく
2.学習済みモデルを/opt/ml/modelから読
み込む
○ model_fnは、学習、評価、予測をサポートする
すべてのロジックを含む関数
学習 → シリアライズ → /opt/ml/modelに保存
/opt/ml/modelからモデル読み込み
学習パートと推論用のモデル読み込
みを実装。
推論を別のイメージにする場合は推
論用の実装は不要。
学習 推論
コンテナ内の構造
● /opt/ml
すべてSageMaker用となるため、アルゴリズムが必要
とするようなデータを置いてはいけない
● /opt/ml/input
トレーニングジョブ実行時に利用
● /opt/ml/code
コンテナが実行するスクリプトを配置
● /opt/ml/model
アルゴリズムによって生成されたモデルを書き込む
● /opt/ml/output
モデル以外に保存するアーティファクトを書き込む
● /opt/ml/failure
トレーニングに失敗した場合、すべてのアルゴリズム
の出力を書き込む
出典: https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/amazon-sagemaker-toolkits.html
CHANNELを理解する
SM_CHANNEL_XXXのXXXがそのまま展開(Fileモード)。
例えば、以下のように実行すると
fit({
"training": "s3://path/to/training"
"validation": "s3://path/to/validation",
"testing": "s3://path/to/testing"
})
コンテナ内の以下の場所にデータが展開される
● /opt/ml/input/data/training
● /opt/ml/input/data/validation
● /opt/ml/input/data/testing
チャネル名は大文字として環境変数に設定される
● SM_CHANNEL_TRAINING=/opt/ml/input/data/training
● SM_CHANNEL_VALIDATION=/opt/ml/input/data/validation
● SM_CHANNEL_TESTING=/opt/ml/input/data/testing
SageMakerがトレーニング時に行うこと
● docker run image train を実行
○ train引数によりコンテナ内のデフォルトのCMDが上書きされる
● ENTRYPOINTで実行形式を指定
○ 例: ENTRYPOINT ["python", "k-means-algorithm.py"]
○ ENTRYPOINTで直接実行ファイルを指定することで、SageMaker APIからSIGTERMや
SIGKILLのシグナルを送ることができるようになる
● ハイパーパラメータで渡された値はオプションとして渡される
hyperparameters={"max_leaf_nodes": 30} python … --max_leaf_nodes 30
argparseなどで読み込む
SageMaker上でイメージのbuild
通常のbuild
● SageMakerでカスタムコンテナを使うためにはECRに作成したイメージをプ
ッシュする必要がある
● ECRにプッシュするためには、dockerコマンドだけでなくawsコマンドも使
う必要があり、ステップが少し多い
docker build
aws ecr get-
login
aws ecr create-
repository
docker push
実行コマンドが多い!!
sm-dockerをつかったbuild
sm-docker コマンドで以下の作業を一つのコマンドで実行
1.Dockerfile・コード・buildspec.ymlをS3へアップロード
2.CodeBuildでのイメージのbuild
3.ECRへのイメージのアップロード
出典: https://aws.amazon.com/blogs/machine-learning/using-the-amazon-sagemaker-studio-image-build-cli-to-build-container-images-from-your-studio-notebooks/
たった一つのコマンドで
多くのタスクを実行
sm-dockerの使い方
● SageMaker実行ロールの設定
○ SageMakerで使用している実行ロールに対して、CodeBuildの信頼ポリシーを追加
○ SageMakerで使用している実行ロールに対して、ECRにレポジトリを作成しイメージをプッ
シュできる権限を追加
○ 詳しくは、Using the Amazon SageMaker Studio Image Build CLI to build container images
from your Studio notebooks を参照
● インストール: !pip install sagemaker-studio-image-build
● イメージ作成: !sm-docker build .
最初の準備は大変だが
実行は圧倒的に楽!!
Trust Policy追記
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": [
"codebuild.amazonaws.com"
]
},
"Action": "sts:AssumeRole"
}
]
}
codebuildを追加する
Permission Policy追加
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"codebuild:DeleteProject",
"codebuild:CreateProject",
"codebuild:BatchGetBuilds",
"codebuild:StartBuild"
],
"Resource":
"arn:aws:codebuild:*:*:project/sagemaker-studio*"
},
{
"Effect": "Allow",
"Action": "logs:CreateLogStream",
"Resource": "arn:aws:logs:*:*:log-
group:/aws/codebuild/sagemaker-studio*"
},
{
"Effect": "Allow",
"Action": [
"logs:GetLogEvents",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:*:*:log-
group:/aws/codebuild/sagemaker-studio*:log-stream:*"
},
{
"Effect": "Allow",
"Action": "logs:CreateLogGroup",
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"ecr:CreateRepository",
"ecr:BatchGetImage",
"ecr:CompleteLayerUpload",
"ecr:DescribeImages",
"ecr:DescribeRepositories",
"ecr:UploadLayerPart",
"ecr:ListImages",
"ecr:InitiateLayerUpload",
"ecr:BatchCheckLayerAvailability",
"ecr:PutImage"
],
"Resource": "arn:aws:ecr:*:*:repository/sagemaker-
studio*"
},
{
"Effect": "Allow",
"Action": "ecr:GetAuthorizationToken",
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:DeleteObject",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::sagemaker-*/*"
},
{
"Effect": "Allow",
"Action": [
"s3:CreateBucket"
],
"Resource": "arn:aws:s3:::sagemaker*"
},
{
"Effect": "Allow",
"Action": [
"iam:GetRole",
"iam:ListRoles"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": "iam:PassRole",
"Resource": "arn:aws:iam::*:role/*",
"Condition": {
"StringLikeIfExists": {
"iam:PassedToService": "codebuild.amazonaws.com"
}
}
}
]
}
codebuildやecrやS3などの
権限を追加する
カスタムコンテナの使用
● image_uriにECRのURIを指定
● その他はSageMakerが用意してい
るイメージを使った場合の実装と
同じ
image_uri以外は
いつも通りの実装
デモ
● SageMaker上でのイメージのビルドとカスタムコンテナを使った学習の実行
● コード
○ 全体: https://github.com/knishioka/machine-learning-
workshop/tree/main/sagemaker/custom_container_with_sagemaker-training-toolkit
○ 実行用notebook: https://github.com/knishioka/machine-learning-
workshop/blob/main/sagemaker/custom_container_with_sagemaker-training-
toolkit/training_with_custom_container.ipynb

Amazon SageMakerでカスタムコンテナを使った学習

Editor's Notes

  • #3 こちらが私のプロフィールとなります。 機械学習には、大学時代の研究から携わっており、自分で立ち上げたスタートアップでも機械学習を使ったサービスを提供していました。 プロダクト開発チームやデータサイエンスチームの立ち上げなどもやっています。
  • #6 ここでは、SageMakerでどのように学習をしていくかを説明。 SageMakerではECRやS3を使って学習を進めていく。 ECRは学習や推論に使うイメージの取得に使われ、S3は学習データなどの入力データや学習済みモデルなどの出力に使う。 fitでは学習済みモデルがS3に保存されるが、これだけだとSageMakerで学習済みモデルを使えないので、create_modelをすることにより、学習済みモデルを作る。 あとは細かい話として、エンドポイントを作ることで外部から推論を実行できるようになる。
  • #7 こちらは、先程のフローをもう少し簡略化したもの。 青い丸が解析者がやるアクション。 重要な点はfitとcreate_modelがそれぞれ学習と推論のためのアクションであり、それらに対してコンテナが必要となること。 つまり、学習で独自のコンテナを使うということは、fitで使うコンテナを自分で作るということになる。
  • #8 カスタムコンテナの作り方は3種類。 1, 2, 3の順番で難易度が高くなる。 まず一つ目がAWSがすでに提供しているコンテナイメージを拡張する方法。独自ライブラリを使いたい場合などはこちらで対応。 2つめがSageMaker Training Toolkitを使ったもの。こちらは自分で好きなベースイメージを選ぶことができる。 3つめがスクラッチで作っていくもの。こちらはTraining Jobが外部とどのようにデータをやり取りしているか知る必要があり難しい。
  • #10 sagemaker-training-toolkitの使い方は非常にシンプル。 自分の好きなベースイメージを使ったDockerfileの中で3つの操作を指定するだけ。 まず一つ目が、sagemaker-trainingのライブラリをインストールします。こちらはpipを使えばすぐにインストールできます。 次に学習用の独自スクリプトを/opt/ml/code/train.pyに配置します。 そして、環境変数SAGEMAKER_PROGRAMにtrain.pyを指定します。 train.pyの実装は必要ですが、コンテナイメージ自体はこんなにシンプルに作ることができるようになっています。
  • #11 では、学習用スクリプトはどんなものかを紹介。 こちらは、学習と推論両方に対応するために作ったスクリプトで、大きく分けて2つのパートに別れている。 一つがname==mainとなっている部分。ここが学習データを読み込み、学習をし、学習済みモデルを保存する部分。 学習モデルの保存場所は決まっていて、/opt/ml/modelに保存する。 もう一つが推論のためのモデルの読み込みで、model_fn関数で定義されている。 こちらは先程の/opt/ml/modelからモデルを読み込む。 /opt/ml/modelは環境変数でSM_MODEL_DIRで呼び出すこともできる。
  • #12 コンテナ内の構造をもう少し説明。
  • #13 CHANNELがどのように作成されるか理解しておくことも重要。 fitのときにどのように与えるかでCHANNELは変わる。 training, validation, testingで与えた場合は、/opt/ml/input/data以下にそれぞれのデータが配置される。 そして、環境変数SM_CHANNEL_でそれぞれのパスを取得できるようになる。
  • #14 最後にSageMakerがトレーニングのときに行うことを紹介。
  • #15 sagemaker-training-toolkitの使い方は紹介済み。 sagemaker上でのイメージのbuildについて説明。
  • #16 イメージはbuild下だけでは使えないので、ecrにプッシュする必要がある。 イメージを作ってecrにログインして、ecrにレポジトリを作って、そこにpushするという作業が必要。 何回も修正するたびに作り直すのもめんどくさい。
  • #17 sagemaker上ではsm-dockerを使えば、面倒くさい作業を一気にやることができます。 sm-dockerでbuildをすると、dockerfile, コード、buildspec.ymlなどをs3へアップロードし、codebuildでイメージをbuildし、ecrへのイメージのアップロードまでしてくれます。
  • #18 sm-docker自体のインストールはpip installをするだけなので簡単なのですが、実際に実行するためにはSageMakerに紐付いている実行ロールに信頼ポリシーと権限を追加する必要があります。 ここが少しハードルが高い部分。 IAMをいじらないといけない。 ただ、この設定をしてしまえば、sm-docker buildとするだけで、簡単にイメージの作成とプッシュまで行ってくれる。
  • #19 詳細はあとから見てほしいが、trust policyとpermission policyを少し紹介。 trust policyに関しては、codebuildのものを追加するだけ。
  • #20 permisson policyはもはや文字が小さくて見えないと思うが、codebuildやecr, s3などの権限を追加。 policyさえ作ってしまえばいいし、サンプルとなるポリシーも公開されているので、IAMに慣れている人であれば、設定はそこまで大変ではない。
  • #21 最後にカスタムコンテナを使った実行のためのコードを紹介。 こちらは非常に簡単で、image_uriに先程作ったECRのURIを指定するだけ。
  • #22 最後に簡単にデモ。