見出し画像

ML on SageMaker

jun-fu@bitengineers です。

盆栽は今月も成長著しく、芽が芽吹き、花も咲きました。第一陣は既に花びらが散り始め第二陣が開き始めてます。盆栽始めて3年目の春ですが、新しい気づきが多く楽しいですね。

3/18
3/8

この時期取れるデータは貴重だと思います。何かに使えるデータだといいんでけどね。。。ということでデータの解析まわりを書いていきます。

AWS SageMaker を使った Machine Learning 環境の構築を書いてます。今回は大まかな流れを中心にしてます。

AWS SageMaker 

以前に AWS Edukit のチュートリアルを試した時に SageMaker を使用しました。あれから半年以上経ちましたが、仕切り直します。今回は Document を読むところから進めます。

Overview

一般に普及・充実している Machine Learning 用の library が使える事に加え、AWS を使うとクラウドの利点を活かしオンデマンドに処理可能で、 Training/Test データの分散化、モデル作成、デプロイ、後のスケーリングなどと開発〜運用まで一環した恩恵を得られるようになるようです。

エンジニア以外の人にも ML インフラストラクチャーを提供してくれるようです。

一見すると機能が多くてどれを使えば良いのかわからない印象でしたが、上記のように対象としている人を分けるとわかりやすいです。

ユースケースに応じたビルド済みモデルを使用するソリューション(JumpStart という機能) を数クリックで行えたり、自前のデータを使って独自のモデル作成するマネージド Jupyter Notebook の提供など、システム開発の上流から下流まで使えるツールを一挙にまとめた感があります。

ビルド済みモデル列挙

以上、SageMaker のぱっと見わかる特徴を掻い摘んで取り上げました。

モデル作成後の改善などの運用まわりは経験していないのでわかりませんが、一度 SageMaker の提供する Workflow を経験しておくといいのかも?

次からもう少し詳細へ入って行きます。

ML Framework

Python ML Framework が pytorch, tensorflow, scikit-learn, …etc から選択できます。

SageMaker Abstraction

複数の ML Framework をラップしているのでより上位層に新しい抽象化を導入しています。

Estimators 

training をカプセル化したもの

Models

build されたML modelsをカプセル化したもの

Predictors

Endpoint に対して python のデータ型を使ったリアルタイム推論と変換を提供する

Session

SageMaker リソースを扱う際の処理集を提供

Transformers

SageMaker 上での推論のためのバッチ変換処理のカプセル化

Processors

SageMaker 上でのデータ処理のための処理実行のカプセル化

これらの抽象化したコンポーネントを組むことで ML が SageMaker 上に実現されます。

Local Mode

Local Mode もあるので開発時は課金を気にせず使える(?)ようです。こちらは AWS の Instance の代わりに Docker で動作します。

SageMaker の使い方

開発環境

私はエンジニア枠なので AWSサービスの想定では SageMaker Studio が該当する機能になりますが、裏で何をしているかいまいちわからなかったので今回は Local 環境に Notebook を立ち上げて進めます。

sagemaker 上に Notebook Instance を立ち上げる場合はこちら。

Local 環境の Notebook で開発したコードを後に SageMaker Notebook Instance 上で使いたくなった場合も Repository を追加することで同じように動作させられます。(sdk 作りでもそうですけど、ファイルなどはlocal 環境に依存しないようにs3 などを利用することを前提としてます)

SageMaker PyTorch

次に、 PyTorch を使った場合について。

ドキュメントが初見では情報が多すぎてわからないですが、流れとしては

  • training script を用意する

  • Estimator に training script を指定しインスタンス化。Estimator.fit を実行

  • training された estimator を deploy。preditor が返される。

  • predictor.predict を実行することで推論結果を得る

となります。
分かりづらい点として Estimator.fit を呼び出すと AWS では training_job が実行され、deploy を実行すると endpoint が作成されます。課金は注意したほうがいいかもしれないですね。 

以下 Python コードレベルで。

session & role

実行権限や [Local] Session まわりで Error が起こったので以下のようにハンドリングしています。"ml.m5.large" は安めのものを選択した例です。

import boto3
import sagemaker
from sagemaker import get_execution_role
from sagemaker.local import LocalSession

LOCAL = False
if LOCAL:
    session = LocalSession()
    session.config = {'local': {'local_code': True}}
    instance_type = "local"
else:
    session = sagemaker.Session()
    instance_type = "ml.m5.large"
try:
    role = get_execution_role()
except ValueError:
    iam = boto3.client('iam')
    role = iam.get_role(RoleName='AmazonSageMaker-ExecutionRole-***********')['Role']['Arn']

session や role は節々に使用することになります。

training script

training script が実行されることで、model 定義からtraining済みの model file が作られます。この実行環境は隠蔽されておりどの環境でも同じように実行されるように引数が決めらている/られるようです。

if __name__ == '__main__':
    import argparse
    parser = argparse.ArgumentParser()
    parser.add_argument("--model-dir", type=str, default=os.environ.get("SM_MODEL_DIR"))
    parser.add_argument("--train", type=str, default=os.environ.get("SM_CHANNEL_TRAIN"))
    parser.add_argument("--test", type=str, default=os.environ.get("SM_CHANNEL_TEST"))
    parser.add_argument("--train-file", type=str, default="s3://be-bonsai/train/train.csv")
    parser.add_argument("--test-file", type=str, default="s3://be-bonsai/train/test.csv")
    args, _ = parser.parse_known_args()
    ...
    train(args)

のように引数をパースして受け取る処理を記述します。training 後 model をファイルに保存します。

    # ... train `model`, then save it to `model_dir`
    with open(os.path.join(args.model_dir, 'model.pth'), 'wb') as f:
        torch.save(model.state_dict(), f)

model_dir は引数で渡ってくるものを使うようです。

この training script は estimator から実行されます。

estimator

trainig script を "model.py" だとすると

from sagemaker.pytorch import PyTorch

estimator = PyTorch(
    entry_point = "model.py",
    role=role,
    framework_version="1.7.1",
    py_version="py3",
    instance_count=1,
    instance_type=instance_type,
)

estimator.fit({
    "train": "s3://any_bucket/train.csv",
    "test": "s3://any_bucket/test.csv",
})

と作成し fit を呼び出します。trainig script が実行され保存された model file が tar.gz に固められ s3 の所定の場所に配置されます。

処理後、deploy をして predictor を取得します。

predictor

predictor = estimator.deploy(initial_instance_count=1, instance_type=instance_type)

ここで estimator.fit で model file が正しく配置されていないと deploy は404 Not Found で失敗します。 

session.upload_data で任意の場所に配置できますがしっかり理解しないうちはハマるので止めた方がいいでしょう。(ドハマりしましたw)

predictor.predict(data)

で endpoint に引数と共に呼び出しが行われ推論結果が得られます。

おわりに

今回はここまでです。ここまで来るのに苦戦してしまい思った以上の時間を費やしてしまいました。ここで書いたのは数ある利用方法の一つです。
自分で training した model file をendpointに使用する、やGPUインスタンス上で(elastic inference)使う場合、などドキュメントを読めばもっと有力な情報が載ってます。

私はMachine Learningについては経験浅いので、自前のデータを使って推論を行う前に、何が推論結果として導きたいのか、どんなデータがあれば良いのか、再考する必要性を感じました。

実行基盤としては何かしら構築できそうなのでこれからつめていきたいと思います。

この記事が気に入ったらサポートをしてみませんか?