Amazon Sagemaker

  • AWSで機械学習をするためのサービス群
    • 非常に多くのサービスで構成されている
    • 翻訳などのAI系サービス群は含まず

SageMaker (AWS) を利用するメリット

  • 必要な量のインフラリソースを必要なときだけ利用可能
  • GPUの他にもクラウド独自のASIC/FPGAを利用可能(AWSでは ASIC)
  • Sagemaker SDK を利用することで学習・推論の処理フローを完全にプログラム化してGitなどで管理
  • 他のAWSサービスとの連携(アプリケーション化・セキュリティ管理)

MLのライフサイクルとSageMakerサービスの対比

  1. データの蓄積
    • 特になし ⇒ とりあえずS3に置いとけばなんとかなる。 (RDSやRedshiftなども利用可能)
  2. アノテーション
    • SageMaker GroundTruth ⇒ S3上のデータにアノテーションするためのWeb GUI
  3. データの分析
    • SageMaker Notebook ⇒
      • AWS上にJupyter/JupyterLabインスタンスを作成してくれる
      • インスタンスの初期化スクリプトの設定、非公開gitリポジトリをアタッチが可能
  4. 前処理
    • SageMaker Pipeline / SageMaker Processing ⇒
      • 用意したデータの前処理コードを学習コードと合わせてパイプライン化してくれる。
      • 学習コードと前処理コードを分割しておくことで、コードが推論時の前処理にも流用可能に。
      • Pipelineは推論の際にも流用したい前処理、Processingはその他の前処理とモデル構築後の後処理・評価処理で利用。
  5. 学習(トレーニング)
    • Traning Job / Hyperparameter Tuning job ⇒ トレーニングしてくれる。分散学習とか、パラメータ自動チューニングとか。
  6. 推論
    • Batch Transform Job / Endpoint ⇒ それぞれ、スループット重視のバッチ推論、レイテンシ重視のリアルタイム推論。必要に応じて自動スケーリングしてくれたりする。

また、学習から推論のデプロイまでの流れや、AWSのその他サービスとの連携のため SageMaker Workflow (Apache Airflowのマネージドサービス)を利用できる

Amazon SageMaker で学習を行う4パターン

SageMakerはコンテナ(Docker)の技術をベースに構築されており、これによりかなり柔軟性が高い。(SageMaker上で実行されるコードをそのままローカルでお試し実行したり)

SageMakerでは、3タイプのコンテナ活用方式が提供されている。

基本的にはカスタマイズ性と手間の少なさのトレードオフで選択することになる。

  1. ビルトインアルゴリズム
    1. 最も定型的なパターンで、学習・推論アルゴリズムまで実装済みのコンテナを利用。
    2. ユーザーは学習用データの準備と、必要ならばハイパーパラメータの値を決める。
  2. 構築済みコンテナイメージ
    1. よく使われるフレームワークがすでにインストール済みのコンテナを利用。
    2. ユーザーはを1に加えて学習用スクリプトを用意する。
  3. カスタムコンテナイメージ
    1. 必要なミドルウェアやフレームワークが予め用意されていない場合に自前で作成したコンテナを利用。
    2. ユーザーは2に加えDockerfileを用意して必要なコンテナをレジストリに登録しておく必要がある。

また、変わり種としてAutoML系のサービスである SageMaker Autopilot も利用可能。

Sagemakerの各タイプ比較

ビルトインアルゴリズムの利用

SageMaker SDK からの利用

https://github.com/awslabs/amazon-sagemaker-examples/blob/master/introduction_to_amazon_algorithms/linear_learner_mnist/linear_learner_mnist.ipynb

↑のサンプルコードから大事そうなところだけ拾うと

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})

現在用意されているビルトインアルゴリズム

構築済みコンテナの利用

  • 構築済みコンテナを利用する場合は学習コードの準備が必要となる。
    • 学習コードでは規定の環境変数の利用や、(フレームワークによっては)特定の名前のメソッドを実装する必要があるので注意が必要。

ビルトインアルゴリズムと大きくは変わらないので、サンプルコードを使って説明。

SageMaker SDK の利用

https://github.com/awslabs/amazon-sagemaker-examples/tree/master/sagemaker-python-sdk/tensorflow_keras_cifar10

学習のキック

## 構築済みコンテナは専用クラスが用意されているのでそれを利用すれば良い
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 からの利用

https://github.com/awslabs/amazon-sagemaker-examples/tree/master/advanced_functionality/tensorflow_bring_your_own

学習のキック(ビルトインアルゴリズムに近い)

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

  • 複数の関連する学習の評価結果や、ハイパーパラメータを収集し管理する

参考リンク

サンプルコード集

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