Amazon SageMakerの調査メモ
Amazon Sagemaker
- AWSで機械学習をするためのサービス群
- 非常に多くのサービスで構成されている
- 翻訳などのAI系サービス群は含まず
SageMaker (AWS) を利用するメリット
- 必要な量のインフラリソースを必要なときだけ利用可能
- GPUの他にもクラウド独自のASIC/FPGAを利用可能(AWSでは ASIC)
- Sagemaker SDK を利用することで学習・推論の処理フローを完全にプログラム化してGitなどで管理
- 他のAWSサービスとの連携(アプリケーション化・セキュリティ管理)
MLのライフサイクルとSageMakerサービスの対比
- データの蓄積
- 特になし ⇒ とりあえずS3に置いとけばなんとかなる。 (RDSやRedshiftなども利用可能)
- アノテーション
- SageMaker GroundTruth ⇒ S3上のデータにアノテーションするためのWeb GUI
- データの分析
- SageMaker Notebook ⇒
- AWS上にJupyter/JupyterLabインスタンスを作成してくれる
- インスタンスの初期化スクリプトの設定、非公開gitリポジトリをアタッチが可能
- SageMaker Notebook ⇒
- 前処理
- SageMaker Pipeline / SageMaker Processing ⇒
- 用意したデータの前処理コードを学習コードと合わせてパイプライン化してくれる。
- 学習コードと前処理コードを分割しておくことで、コードが推論時の前処理にも流用可能に。
- Pipelineは推論の際にも流用したい前処理、Processingはその他の前処理とモデル構築後の後処理・評価処理で利用。
- SageMaker Pipeline / SageMaker Processing ⇒
- 学習(トレーニング)
- Traning Job / Hyperparameter Tuning job ⇒ トレーニングしてくれる。分散学習とか、パラメータ自動チューニングとか。
- 推論
- Batch Transform Job / Endpoint ⇒ それぞれ、スループット重視のバッチ推論、レイテンシ重視のリアルタイム推論。必要に応じて自動スケーリングしてくれたりする。
また、学習から推論のデプロイまでの流れや、AWSのその他サービスとの連携のため SageMaker Workflow (Apache Airflowのマネージドサービス)を利用できる
Amazon SageMaker で学習を行う4パターン
SageMakerはコンテナ(Docker)の技術をベースに構築されており、これによりかなり柔軟性が高い。(SageMaker上で実行されるコードをそのままローカルでお試し実行したり)
SageMakerでは、3タイプのコンテナ活用方式が提供されている。
基本的にはカスタマイズ性と手間の少なさのトレードオフで選択することになる。
- ビルトインアルゴリズム
- 最も定型的なパターンで、学習・推論アルゴリズムまで実装済みのコンテナを利用。
- ユーザーは学習用データの準備と、必要ならばハイパーパラメータの値を決める。
- 構築済みコンテナイメージ
- よく使われるフレームワークがすでにインストール済みのコンテナを利用。
- ユーザーはを1に加えて学習用スクリプトを用意する。
- カスタムコンテナイメージ
- 必要なミドルウェアやフレームワークが予め用意されていない場合に自前で作成したコンテナを利用。
- ユーザーは2に加えDockerfileを用意して必要なコンテナをレジストリに登録しておく必要がある。
また、変わり種としてAutoML系のサービスである SageMaker Autopilot も利用可能。
ビルトインアルゴリズムの利用
- AWSがすでに用意してくれているコードを利用して学習を行う。
- アルゴリズムには入力仕様などが規定されているので、それに沿ったデータの準備が必要。
SageMaker SDK からの利用
↑のサンプルコードから大事そうなところだけ拾うと
import boto3
import re
from sagemaker import get_execution_role
from sagemaker.amazon.amazon_estimator import get_image_uri
## 利用アルゴリズムのキー
container = get_image_uri(boto3.Session().region_name, 'linear-learner')
## train_instance_type を local/local_gpu とするとローカルでお試し実行できる
## input_path/output_path は S3://~~~ またはローカルの場合 file:///~~~
linear = sagemaker.estimator.Estimator(container,
get_execution_role(),
train_instance_count=1,
train_instance_type='ml.c4.xlarge',
output_path=output_path,
sagemaker_session=sagemaker.Session())
linear.set_hyperparameters(feature_dim=784,
predictor_type='binary_classifier',
mini_batch_size=200)
linear.fit({'train': input_path})
現在用意されているビルトインアルゴリズム
- BlazingText アルゴリズム
- DeepAR 予測アルゴリズム
- 因数分解機アルゴリズム
- イメージ分類アルゴリズム
- IP Insights アルゴリズム
- K-Means アルゴリズム
- K 最近傍 (k-NN) アルゴリズム
- 潜在的ディリクレ配分 (LDA) アルゴリズム
- 線形学習アルゴリズム
- ニューラルトピックモデル (NTM) アルゴリズム
- Object2Vec アルゴリズム
- オブジェクト検出アルゴリズム
- 主成分分析法 (PCA) アルゴリズム
- ランダムカットフォレスト (RCF) アルゴリズム
- セマンティックセグメンテーションアルゴリズム
- Sequence to Sequence アルゴリズム
- XGBoost アルゴリズム
構築済みコンテナの利用
- 構築済みコンテナを利用する場合は学習コードの準備が必要となる。
- 学習コードでは規定の環境変数の利用や、(フレームワークによっては)特定の名前のメソッドを実装する必要があるので注意が必要。
ビルトインアルゴリズムと大きくは変わらないので、サンプルコードを使って説明。
SageMaker SDK の利用
学習のキック
## 構築済みコンテナは専用クラスが用意されているのでそれを利用すれば良い
from sagemaker.tensorflow import TensorFlow
from sagemaker import get_execution_role
train_instance_type = "local"
role = get_execution_role()
estimator = TensorFlow(entry_point = "./mnist_mlp.py",
role=role,
train_instance_count=1,
train_instance_type=train_instance_type,
framework_version="1.12.0",
py_version='py3',
script_mode=True,
hyperparameters={'batch-size': 64,
'num-classes': 10,
'epochs': 4})
estimator.fit(input_data)
学習スクリプト
from __future__ import print_function
import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras import backend as K
# モデル保存
def save(model, model_dir):
sess = K.get_session()
tf.saved_model.simple_save(
sess,
os.path.join(model_dir, 'model/1'),
inputs={'inputs': model.input},
outputs={t.name: t for t in model.outputs})
# 学習からモデルの保存まで
def train(args):
##
## 何らかの学習コード
##
save(model, args.model_dir)
if __name__ == '__main__':
parser = argparse.ArgumentParser()
# hyperparameters はコマンドライン引数で渡される
parser.add_argument('--batch-size', type=int, default=128)
parser.add_argument('--num-classes', type=int, default=10)
parser.add_argument('--epochs', type=int, default=12)
# SM_** という名前の環境変数が準備されている
parser.add_argument('--model-dir', type=str, default=os.environ['SM_MODEL_DIR'])
parser.add_argument('--train', type=str, default=os.environ['SM_CHANNEL_TRAINING'])
args, _ = parser.parse_known_args()
train(args)
現在用意されている構築済みコンテナ
https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/frameworks.html
利用できるバージョンも決まっているので注意
カスタムコンテナの利用
- カスタムコンテナを利用する場合、Dockerfileの準備が必要となる。
- コンテナはディレクトリ構成などがルールとして決まっていて、それに沿う必要がある。
- ECRに置いておく必要がある?
SageMaker SDK からの利用
学習のキック(ビルトインアルゴリズムに近い)
from sagemaker.estimator import Estimator
hyperparameters = {'train-steps': 100}
instance_type = 'local'
## ECR(AWSのコンテナレジストリ)にコンテナが保存されている前提
estimator = Estimator(role=role,
train_instance_count=1,
train_instance_type=instance_type,
image_name='sagemaker-tf-cifar10-example:latest',
hyperparameters=hyperparameters)
estimator.fit('file:///tmp/cifar-10-data')
Dockerfile
FROM tensorflow/tensorflow:1.8.0-py3
RUN apt-get update && apt-get install -y --no-install-recommends nginx curl
# Download TensorFlow Serving
# https://www.tensorflow.org/serving/setup#installing_the_modelserver
RUN echo "deb [arch=amd64] http://storage.googleapis.com/tensorflow-serving-apt stable tensorflow-model-server tensorflow-model-server-universal" | tee /etc/apt/sources.list.d/tensorflow-serving.list
RUN curl https://storage.googleapis.com/tensorflow-serving-apt/tensorflow-serving.release.pub.gpg | apt-key add -
RUN apt-get update && apt-get install tensorflow-model-server
ENV PATH="/opt/ml/code:${PATH}"
# /opt/ml 配下に学習スクリプトを配置しておく
COPY /cifar10 /opt/ml/code
WORKDIR /opt/ml/code
AutoPilot
データ用意して以下のような感じでキックするだけで全部やってくれる。
以下のkaggleデータを使って試してみたのでSageMaker Notebookにある結果を共有します。
https://www.kaggle.com/mlg-ulb/creditcardfraud
https://www.kaggle.com/janiobachmann/credit-fraud-dealing-with-imbalanced-datasets
accuracy: 0.9992099
boto3からの利用
SageMaker SDK ではなく boto3 からキックされる。
import sagemaker
import boto3
from sagemaker import get_execution_role
import time
region = boto3.Session().region_name
session = sagemaker.Session()
role = get_execution_role()
sm = boto3.Session().client(service_name='sagemaker',region_name=region)
job_name = 'autopilot-sample-cc'
sm.create_auto_ml_job(
AutoMLJobName=job_name,
InputDataConfig=[{
'DataSource': {
'S3DataSource': {
'S3DataType': 'S3Prefix',
'S3Uri': 's3://sagemaker-my-test/creditcard.csv'
}
},
'TargetAttributeName': 'Class'
}],
OutputDataConfig={
'S3OutputPath': 's3://sagemaker-my-test/cc-output'
},
ProblemType='BinaryClassification',
AutoMLJobObjective={
'MetricName': 'Accuracy'
},
RoleArn=role
)
学習モデルを使った推論
Endpoint(リアルタイム推論)
# 学習処理からそのまま実行したい場合、以下の通り事前に作成したEstimaterからデプロイできる
predictor = estimator.deploy(initial_instance_count=1,
instance_type='ml.m4.xlarge')
# 学習処理と別スクリプトの場合は学習の成果物であるModelを読み込みする(要SDKドキュメント参照)
model = sagemaker.model.Model(model_data,
image,
role=None,
predictor_cls=None,
env=None,
name=None,
vpc_config=None, ....)
predictor = model.deploy(initial_instance_count=1,
instance_type='ml.m4.xlarge')
# 作成したpredictorに入力データを食わせることで推論を行う
predictor.predict(input_data, ...)
deploy時にオートスケーリング設定などを行ったりできる
Transform Job(バッチ推論)
# 学習処理からそのまま実行したい場合、以下の通り事前に作成したEstimaterから実行できる
transformer = estimator.transformer(instance_count=1,
instance_type='ml.m4.xlarge',
output_path='...')
# 学習処理と別スクリプトの場合は学習の成果物であるModelを読み込みする(要SDKドキュメント参照)
model = sagemaker.model.Model(model_data,
image,
role=None,
predictor_cls=None,
env=None,
name=None,
vpc_config=None, ....)
transformer = model.deploy(initial_instance_count=1,
instance_type='ml.m4.xlarge')
# 作成したpredictorに入力データを食わせることで推論を行う
transformer.transform(input_path, ...)
今回紹介できなかったけど面白そうなSageMaker関連サービス
SageMaker Neo
- TVMコンパイラをベースにしたモデルコンパイラ
- モデルの省メモリ化、高速化を行ってくれる
SageMaker Studio
- 機械学習のためのWebIDE(アナリスト向け?)
- JypyterLabベースのなにか
SageMaker Debugger
- 学習時に内部状況をモニタリングするためのSDK
AWS Marketplace
- 自作のモデルやアルゴリズムをパッケージングして販売可能(流行ってなさそう)
AWS Experiments
- 複数の関連する学習の評価結果や、ハイパーパラメータを収集し管理する
参考リンク
サンプルコード集