SageMaker

SageMaker用のコードをローカルで動かす – scikit-learnの決定木でアヤメの種類を分類

投稿日:

SageMakerはローカルで使うことができるので、それを試してみた。
この記事を書くにあたって以下の公式の記事を参考にしています。
オンプレミス環境から Amazon SageMaker を利用する

機械学習のHelloWorld

アヤメデータをschikit-learnの決定木分類器で学習して種類を予測する.
結構いろいろなところで機械学習のHelloWorldとして使われている例題を題材にしていく.
sagemaker-python-sdk/scikit_learn_iris

既に SageMaker用のサンプルコードがあるので、
これをローカルで学習・推論できるように修正していく。

構成は以下の通り.
公式のブログの通り、SageMaker Notebook用に書かれた.ipynb を Local用に微修正するだけで動く。

  • SageMaker Notebookで動かすための.ipynb
  • .ipynbから呼ぶschikit-learnコード

SageMakerのサンプルはSageMakerのJupyterNotebookで動くように書かれているがが、
ちょっと修正するだけでローカルで動くようになる様子。(1つしか試してないけど)

前準備

学習と推論をローカルで行うが、そのために裏でDockerのコンテナが走る。
ローカルコンピュータ用にDockerをインストールしておく必要がある。

CredentialsとIAM

以下が必要。

  • AmazonSageMakerFullAccess 権限をもった IAM ユーザの Credential
  • AmazonSageMakerFullAccess の IAM ロール

ローカルコードからAWSリソースにアクセスするために aws configure を使って設定する。
Credentialsが書かれたcsvをダウンロードし aws configure の応答に答えていく。

SageMaker PythonSDKインストール

SageMaker PythonSDKをインストールする。
実行するコードに応じてSDKのバージョンを指定することができる。

バージョンを指定しない場合は以下の通り。

ローカルのJupyter Notebookでファイルを修正

scikit_learn_estimator_example_with_batch_transform.ipynb を
ローカルのJupyter Notebookで修正していく。

SageMaker ローカルSessionを開始

SageMakerを想定したコードは以下。

それをローカルで動かすために以下のように修正する
localSession()というセッションが用意されているのでそれを使用する。
ローカルでは get_execution_role()では ロールを取得できないので直接ロールのARNを指定する。

学習用データの準備 (変更なし)

学習用データが巨大であればS3にデータを準備する(と書かれている).
アヤメデータは軽量なので、ローカルファイルに保存する。

その後、用意したローカルデータをSageMaker Python SDKに食わせる。

Scikit learn Estimator

scikit-learnの機械学習は以下の3段構成になっている。

  • Estimator: 与えられたデータから学習(fit)する
  • Transformer: 与えられたデータを変換(transform)する
  • Predictor: 与えられたデータから結果を予測(Predict)する

SageMakerは機械学習プラットフォームであって、かなり多くのライブラリや手法がサポートされている。
その中で、scikit-learnもサポートされていて、SKLearn Estimatorとして使用できる。
要は、schikit-learn のI/Fに準じたコードを SageMaker に内包することができる。
SKLearn Estimatorに scikit-learn コードを食わせると SageMakerから SKLearn インスタンスとして操作できる.

例えば、.ipynbで以下のように書く.

SKLearnにentry_pointとして渡しているのがscikit-learnのコード本体。
内容は以下。普通の決定木分類のコードにSageMakerとのIFに関わるコードが追加されている。

実行時引数として、SM_MODEL_DIR、SM_OUTPUT_DATA_DIR、SM_CHANNEL_TRAINが渡される。
fitで学習した結果(つまり係数)をシリアライズしSM_MODEL_DIRに保存する。

model_fnでは、SM_MODEL_DIRにシリアライズされた係数をデシリアライズし、
scikit-learnの決定木分類木オブジェクトを返す。

学習

SageMaker(またはローカル)の.ipynb は、SKLearnインスタンスに対して fit() を実行するだけで良い。

推論

なんと、推論はWebインターフェースになっている。
推論コンテナ内でnginxが動作し、PythonWebAppが wsgi(gunicorn) を介してnginxから入力/応答する。

SageMaker(またはローカル)の.ipynbからは、SKLearnインスタンスに対してdeploy()を実行する。
推論コンテナへのインターフェースとなるインスタンスが生成され、後はこのインスタンスに対してpredict()を呼ぶ。

推論用にデータを集めて predict()を実行する例。
テストデータと推論の結果を並べて表示している。 うまくいっていれば同じになるはず。
(こんな風に訓練データとテストデータを拾って良いのかはさておき…)

/invocationsというURLに対してPOSTリクエストが発行されている。
応答は以下の通り、
テストデータの説明変数と、predict()の結果得られた値が一致していそう。

まとめ

SageMaker用の機械学習のHelloWorldをローカルで動かしてみた。
(かなり雑だけども), SageMakerのサンプルコードをちょっと修正するだけでローカルで動くことがわかった。

-SageMaker
-

Copyright© ikuty.com , 2021 AllRights Reserved Powered by AFFINGER4.