ml

AWS SageMaker 独自コンテナ(アルゴリズム)作成 入門

aws

2018年下旬にAWS re:Inventが開催されました。
益々、AWSの機能に目が離せない状況になってきました。

機械学習に使用するSageMakerのアップデートもありました。

今後、SageMakerがもっともっと多くのビジネスシーンや企業で利用されていくと思います。

SageMakerとは

SageMakerは簡単に分析、学習、推論ができます。

しかし、業務など複雑な処理を実装する場合、独自アルゴリズムが必要になります。

ですが、あまり情報がまとまっていない印象を受けます。

公式ブログでまとまってはいるんですが、ちょっと理解がしづらい部分があり、さくっと動かしたい人には難しいなって印象だったので解説記事+チュートリアルになります。

ということで、SageMakerで独自アルゴリズムを使う方法をご紹介します。

独自アルゴリズム(コンテナ)を作成するまでの流れ

  • 学習/推論用dockerイメージを作成する
    ECR(EC2 Container Registry)にプッシュする
    SageMakerでECRにプッシュしたdockerのリポジトリのURIを指定する
  • SageMakerの特徴

  • SageMakerは、AWSが提供している機械学習基盤です。
    スケールする環境でjupyterを使えるのでデータ量が多くローカルマシーンのスペックで困る場合に環境構築なしで使えます。
    いくつかのアルゴリズムが用意されているため、学習データを指定するだけ複雑な学習ができる。
    推論した結果を返すために、学習してモデルを生成し、APIを使ってということをせずに推論した時点でエンドポイントが提供されるため、効率的に推論結果を提供できます。

SageMakerで独自アルゴリズムを作成しないといけない理由

SageMakerで独自アルゴリズムを作成しないといけない理由は、SageMakerに存在しないアルゴリズムを使う場合です。
今、提供されているアルゴリズは100を超えていると思います。
しかし、これまで業務で使っていたアルゴリズムを使いたいと言った場合は、存在しないこともあります。
また、提供されているアルゴリズムも推論時には、predictの結果しか返してくれません。
学習または、推論時に特殊な処理や関数の呼び出しを行なっている場合は独自に実装してあげる必要があります。

実際、私はblazingTextというSageMakerが提供しているアルゴリズムで学習だけして、推論は独自に実装しました。

AWSの公式のサンプルをcloneする

AWSが公式のサンプルソースコードを用意しているので、使わせてもらいます。

サンプルソースでは、sklearnで決定木を使うようです。

git clone https://github.com/awslabs/amazon-sagemaker-examples.git

サンプルソースコードから不要なファイルの除外

サンプルソースコードには、今回、不要なファイルも多いので、スパースクローンを実行します。

スパースクローンとは、gitの機能で、リポジトリの中で一部だけクローンしたいときに使います。
別に他のファイルがあっても邪魔出ないと思う方は飛ばしてください。

cd amazon-sagemaker-examples
git config core.sparsecheckout true
vi .git/info/sparse-checkout

vimで今回利用するディレクトリを指定します。

/advanced_functionality/scikit_bring_your_own/container

変更を反映します。

git read-tree -m -u HEAD

フォルダ構成と各々のファイルの役割を理解する

では、早速今回利用するディレクトリに移動します。

cd advanced_functionality/scikit_bring_your_own/container

全体像はこのようになっています。

主要なものは、横に説明をいれています。

├── Dockerfile
├── ReadMe.md
├── build_and_push.sh -> Dockerイメージ作成&ECRにプッシュ
├── decision_trees -> 任意のフォルダ名
│   ├── nginx.conf
│   ├── predictor.py -> 推論処理(flaskベース)
│   ├── serve -> nginxとflaskをつなぐ
│   ├── train -> 学習処理
│   └── wsgi.py -> 推論処理の呼び出し
└── local_test
├── payload.csv -> API確認用のデータ
├── predict.sh -> 推論処理の確認
├── serve_local.sh -> docker起動
├── test_dir 
│   ├── input
│   │   ├── config
│   │   │   ├── hyperparameters.json
│   │   │   └── resourceConfig.json
│   │   └── data
│   │   └── training
│   │   └── iris.csv
│   ├── model
│   │   └── decision-tree-model.pkl
│   └── output
│   └── success
└── train_local.sh -> ローカルで学習処理実行

今回は、修正はしませんが独自のアルゴリズムを使う場合、`train`と`predictor.py`のみを触ることになります。

dockerイメージを作成する

shellを実行して、dockerイメージを作成し、ECRにプッシュします。

sh build_and_push.sh custom-algorithm-on-sagemaker

ECRにプッシュしたくない方は、`build.sh`というdockerイメージ作成用の処理を用意しました。

下記をbuild.shと名前をつけ、`build_and_push.sh`と同じ階層に配置し、実行してください。

image=$1

if [ "$image" == "" ]
then
echo "Usage: $0 <image-name>"
exit 1
fi

chmod +x src/train
chmod +x src/serve

# Build the docker image locally with the image name and then push it to ECR
# with the full name.

docker build -t ${image} .

これで完了です。

ローカルで学習する

dockerのイメージができたら、学習をします。

SageMakerでは、ECRにプッシュしたコンテナのURIを指定するだけなので、簡単です。

今回は、チュートリアルなのでローカルでやります。

cd local_test
sh train_local.sh custom-algorithm-on-sagemaker

ローカルで推論する

docker上で推論用のコンテナを起動して、推論します。

cd local_test
sh serve_local.sh custom-algorithm-on-sagemaker output.log
sh predict.sh

まとめ

私が、色々探してたときにはちゃんとまとまっているサイトがなくて苦労しました。
なので、このチュートリアルが他の方の手助けになればと思います。

ABOUT ME
ロッピー
コンサルタントから2018年にエンジニアに転向。年収400万円のサラリーマンエンジニアから、半年で月収100万円を稼ぐエンジニアになった。 Python、Golangなど単価の高い言語を得意とする。