背景
SageMaker関連の記事では、コードの中で学習させたモデルをそのままデプロイする
というようなサンプルコードを多く見かける。
例えば以下のように、モデル(コード中ではbt_model
)を定義して学習し、そのままその変数を使ってデプロイする(コード中ではbt_model.deploy
)というようなもの。
# データの準備部分は省略
# モデルを定義
import boto3
region_name = boto3.Session().region_name
container = sagemaker.image_uris.retrieve("blazingtext", region_name)
bt_model = sagemaker.estimator.Estimator(container,
role=role,
instance_count=1,
instance_type='ml.m4.xlarge',
input_mode= 'File',
sagemaker_session=sess)
# パラメータを設定
bt_model.set_hyperparameters(mode="supervised",
epochs=10,
vector_dim=10,
early_stopping=True,
patience=4,
min_epochs=5)
# 学習
bt_model.fit(inputs=data_channels, logs=True)
# デプロイ
text_classifier = bt_model.deploy(initial_instance_count = 1,instance_type = 'ml.m4.xlarge')
しかし例えば、前日に学習させたモデルを翌日にデプロイするといった場合、
Pythonを一度終了してしまうと、モデルの変数(上記の場合bt_model
)は消えているため、デプロイができない。
bt_model
を再度学習するのはもちろん避けたい。
ではどうするか?
既存の学習済みモデルをS3から取得してデプロイする
こういった場合は、sagemaker.model.Model
を使う。
学習されたモデルはS3上に出力されているので、それを参照してデプロイすることができる。
公式ドキュメント
image_url
はモデルを動かすための(学習にも使ったであろう)Dockerコンテナイメージ
model_data
は学習したモデルが格納されているS3の場所(URI)
role
はSageMakerを使うためのAWSのrole
predictor_cls
はよくわからんけど必須。詳しくはこちら
import sagemaker
# 既存のモデルを取得して、bt_modelに入れる
bt_model = sagemaker.model.Model(
image_uri = sagemaker.image_uris.retrieve("blazingtext", "ap-northeast-1")
,model_data = "s3://sagemaker-ap-northeast-1-****************************/model.tar.gz"
,role = "arn:aws:iam::*********************************"
,predictor_cls = sagemaker.predictor.RealTimePredictor
)
# bt_modelをデプロイする
text_classifier = bt_model.deploy(initial_instance_count = 1,instance_type = 'ml.m4.xlarge')
これで、以前に作成した学習済みモデルや、他人の作ったモデルをデプロイすることができます。
おわり
終わりです。お疲れ様でした。