SageMakerで「TensorFlow hub」に公開されているモデルをデプロイしてみる:Amazon SageMaker Advent Calendar 2018

概要

こんにちは、データインテグレーション部のyoshimです。
この記事は「クラスメソッド Amazon SageMaker Advent Calendar」の2日目の記事となります。

目次

1.やること

SageMakerSDKを使って、TensorFlowの学習済みモデルを推論エンドポイントとしてデプロイする方法についての紹介です。
今回のテーマは下記の2点です。

  • TensorFlow Hub」に公開されている学習済みモデルをSageMakerの推論エンドポイントとしてデプロイする
  • 「1つのエンドポイントに複数のモデルをデプロイ」し、「推論時にモデルを区別」する

具体的には、画像分類をするために、「TensorFlow Hub」に公開されている「MobilenetV2」モデルを推論エンドポイントにデプロイしました。
学習済みモデルをそのままデプロイするだけなら、20分程度で実行できます。

2.「TensorFlow Hub」について

TensorFlow Hub」とは一体なんなのか、ということについては、公式HPに説明がありましたので、こちらからそのまま説明しようと思います。

TensorFlow Hub is a library for the publication, discovery, and consumption of reusable parts of machine learning models. A module is a self-contained piece of a TensorFlow graph, along with its weights and assets, that can be reused across different tasks in a process known as transfer learning. Transfer learning can:
Train a model with a smaller dataset,
Improve generalization, and
Speed up training.

「TensorFlow hub」では、「事前学習済みのモジュール」を提供しています。
なので、「事前学習済みモデルをそのまま利用する」こともできますし、「自分のデータに合わせてfine-tuning」することもできます。

3.やってみる

今回実行するコードはこちらをご参照ください。
本エントリーでは、要点だけを記述しようかと思います。

3-1.パッケージのインストール

「SageMaker SDK」を新しいものにアップデートし、更に必要となるパッケージをインストールします。

!pip install -U --quiet "sagemaker>=1.14.2"
!pip install -U --quiet opencv-python tensorflow-hub

3-2.学習済みモデルをダウンロード

「TensorFlow hub」から学習済みのモデルをダウンロードしてきます。
ここでは「sample_utils.py」というファイルに必要な関数を記述しています。

import sample_utils

model_name = 'mobilenet_v2_140_224'
export_path = 'mobilenet'
model_path = sample_utils.tfhub_to_savedmodel(model_name, export_path)

もし、複数のモデルをデプロイする必要がある場合は、他のモデルもダウンロードしておきましょう。

second_model_name = 'mobilenet_v2_035_224'
second_model_path = sample_utils.tfhub_to_savedmodel(second_model_name, export_path)

3-3.モデルのファイルを圧縮する

ダウンロードしてきたモデルのファイルを圧縮します。

!tar -C "$PWD" -czf mobilenet.tar.gz mobilenet/

複数のモデルを1エンドポイントにデプロイする場合は、まとめて1ファイルに圧縮する必要があります。
具体的には、下記のようなディレクトリ構成にする必要があります。

└── mobilenet
  ├── model1
  │   └── <version number>
  │       ├── saved_model.pb
  │       └── variables
  │           └── ...
  └── model2
      └── <version number>
          ├── saved_model.pb
          └── variables
              └── ...

引用:sagemaker-python-sdkのGit

3-4.モデルのファイルをS3にアップロードする

モデルのファイルをS3にアップロードします。

from sagemaker.session import Session

bucket = '' # your bucket

model_data = Session().upload_data(bucket = bucket, path='mobilenet.tar.gz', key_prefix='tfhub/model')

3-5.推論エンドポイントをデプロイする

S3にアップロードしたファイルを元に推論エンドポイントをデプロイします。
複数のモデルを1エンドポイントにデプロイする場合は「env」変数で「デフォルトで利用するモデル」を指定すると、推論する時にモデルを区別できます。

from sagemaker.tensorflow.serving import Model

# Use an env argument to set the name of the default model.
# This is optional, but recommended when you deploy multiple models
# so that requests that don't include a model name are sent to a 
# predictable model.
env = {'SAGEMAKER_TFS_DEFAULT_MODEL_NAME': 'mobilenet_v2_140_224'}

model = Model(model_data=model_data, role=sagemaker_role, framework_version=1.11, env=env)
predictor = model.deploy(initial_instance_count=1, instance_type='ml.c5.xlarge')

3-6.推論

実際に推論してみます。
「sample_utils.image_file_to_tensor」は本チュートリアルで提供されている関数ですが、ここでは画像ファイルをtensorに変換しているだけです。
なので、もし画像サイズが224*224でない場合は、resize処理を追加する必要があります。

こんな子猫の画像を投入すると...

kitten_image = sample_utils.image_file_to_tensor('kitten.jpg')
result = predictor.predict(kitten_image)

# add class labels to the predicted result
sample_utils.add_imagenet_labels(result)

# show the probabilities and labels for the top predictions
sample_utils.print_probabilities_and_labels(result)

ちゃんと猫だと判別できています。

もし、複数のモデルを1エンドポイントにデプロイしている場合は、下記のように異なるpredictorオブジェクトを生成(モデル名を指定)することで推論先のモデルを区別することができます。
(指定しない場合は、今回は「mobilenet_v2_140_224」をデフォルトで利用しています)

predictor2 = Predictor(predictor.endpoint, model_name='mobilenet_v2_035_224')
result = predictor.predict(kitten_image)

4.注意点

  • fine-tuningしたい場合は、こちらを参考にし、更に「sample_utils.py」の処理を少し修正する必要があります
  • 利用が終わったら推論エンドポイントを削除しましょう

5.まとめ

「SageMaker」、「TensorFlow hub」を利用することで、画像分類用エンドポイントを簡単にデプロイすることができました。

執筆時点(2018年11月25日)で、「TensorFlow hubの「Tutorials」を見てみると「画像分類」以外にも様々なモデルが公開されており、fine-tuningのやり方についてもドキュメントがありますので、もし興味があったら一度触ってみてはいかがでしょうか?

また、「1つのエンドポイントに複数のモデルをデプロイ」できると、A/Bテスト時にコスト削減につながりそうでいいな、と感じました。
明日は、レコメンドモデルをGluonで作ってみようと思います。

6.引用

TensorFlow Hub
deploying_tensorflow_serving.rst
tensorflow_serving_container