Taste of Tech Topics

Acroquest Technology株式会社のエンジニアが書く技術ブログ

Amazon SageMakerを使って機械学習モデルのエンドポイントをなるべく簡単に作成する

こんにちは。新人も終わりに差し掛かっている佐々木@です。

去年の12月、AWSの新サービスを発表するイベント「AWS re:Invent 2017」が行われました。
この中で発表されたサービスのひとつに、SageMakerがあります。
今回はこのSageMakerというサービスを使って、機械学習のモデルのエンドポイントを作成していきます。
この記事では機械学習自体にはあまり触れないので、機械学習をある程度やっているけど、
もっと楽にやりたいという人向けの記事となります。

Amazon SageMakerとは

簡単に言うと、AWS上で、データの前処理、学習、モデルの評価、公開を
今までよりも簡単に行えるようにできるサービスです。
aws.amazon.com

何が嬉しいのか

一通り触ってみましたが、SageMakerを使うと

  1. 環境構築の手間がいらない
  2. 作成したモデルをエンドポイントとして簡単に公開できる。

といったことがうれしいポイントとしてあります。
特に、個人的には1番目のポイントが大きいです。
SageMakerでは、前処理用、学習用、推論用の環境をそれぞれ別々に、
自動でセットアップして処理を行えるので、
エンジニアはアルゴリズムに集中できるようになります。

仮にオンプレでモデルの公開までしようとする場合は
f:id:acro-engineer:20180116232047p:plain:w700
という段階が必要になると思います。
それが、SageMakerを使うと、
f:id:acro-engineer:20180116232315p:plain:w400
というように簡単になります。

実際に使ってみる

それでは、SageMakerを実際に使ってみましょう。
今回はSageMakerにもともと用意されているノートブックを使って、
なるべく簡単にエンドポイントを作成していきます。

まずSageMakerにログインするとこのような画面になります。
f:id:acro-engineer:20180105163442p:plain

そしてここから、ノートブックインスタンスの作成を選択すると
f:id:acro-engineer:20180108161334p:plain

このようにインスタンスの設定が出てきます。
今回はすべてデフォルト設定で作成しました。
作成すると、ノートブックインスタンス一覧の画面に作成したインスタンスが追加されるので、
オープンを選択するとノートブックにアクセスすることができます。
f:id:acro-engineer:20180116071932p:plain
これで、tensorflowやMXNetが用意されているデータ分析用の環境が整いました。
面倒なインストール作業が全くなかったのでとても楽に始められます。

作成したインスタンスの中には、あらかじめサンプルのnotebookがいくつか用意されています。
f:id:acro-engineer:20180105175411p:plain

今回はtensorflowのMNISTのサンプルであるtensorflow_distributed_mnistという
notebookを使って、モデルを作成していきます。

まずはこのnotebookを順番に実行していくと、
f:id:acro-engineer:20180115063426p:plain
データセットがダウンロードされ、S3バケットが作成されてデータセットがアップロードされます。

実際に作成されたS3バケットの中を見てみると、
このようにデータセットがアップロードされていることが確認できます。
f:id:acro-engineer:20180116072848p:plain

その次に実際に学習していきます。
f:id:acro-engineer:20180115063833p:plain

このセルでは、あらかじめ用意された学習用のスクリプトを読み込んで、
SageMaker上で学習しています。
スクリプトの形式などの詳細は以下のWebページで解説されています。
docs.aws.amazon.com
また、学習用の環境はインスタンスの個数と種類が選べるので、自分の好きなようにスケールできます。

ここまでで、学習済みモデルの構築は完了しました。
SageMakerのダッシュボードからもモデルの構築が終わったことを確認できます。
f:id:acro-engineer:20180115064457p:plain

これをエンドポイントにデプロイします。
python-sdkにdeployメソッドが用意されているので、このセルを実行するとデプロイが完了します。
このデプロイの際にも、推論に使用するインスタンスの個数と種類を選ぶことができます。
f:id:acro-engineer:20180115064640p:plain

モデルのデプロイはジョブの画面からボタン操作でも行うことができるので、ノートブックを使用していなくても、
ジョブさえ登録してあればエンドポイントの設定は簡単に行えます。
デプロイが完了すると、このようにSageMakerのエンドポイント一覧の画面からデプロイしたエンドポイントが確認できます。
f:id:acro-engineer:20180108161330p:plain

以上がSageMakerのノートブックインスタンス上で行える、
データの準備、学習、エンドポイントの作成の流れです。
ほとんどノートブック上で完結していたので、
簡単に行えました。

エンドポイントにアクセスする

それでは、次は作成したエンドポイントにアクセスしてみましょう。
AWSpython-sdkを使用します。

import sagemaker
from sagemaker import tensorflow
from sagemaker.tensorflow.predictor import _TFJsonDeserializer, _TFJsonSerializer
from boto3.session import Session
from tensorflow.examples.tutorials.mnist import input_data
import tensorflow as tf

session = Session()

predictor = tensorflow.model.TensorFlowPredictor("sagemaker-tensorflow-py2-cpu-xxxxxxxxxx",
                                                 sagemaker_session=sagemaker.Session(boto_session=session))
predictor.serializer = _TFJsonSerializer()
predictor.deserializer = _TFJsonDeserializer()
predictor.content_type = "application/json"
predictor.accept = "application/json"

mnist = input_data.read_data_sets("./tmp", one_hot=True)
data = mnist.test.images[0].tolist()
tensor_proto = tf.make_tensor_proto(values=np.asarray(data), shape=[1, len(data)], dtype=tf.float32)

predictor.predict(tensor_proto)

このスクリプトではMNISTのテストデータを./tmpにダウンロードして、そこから読み込み、
そのうち一枚の画像が分類されるクラスをエンドポイントを使って推論しています。

今回はこのコードはノートブックインスタンス上で実行していますが、
もしローカルで実行する場合は、Sessionインスタンスを作成する際に、
access_keyなどの設定が必要になります。

結果としてこのようなレスポンスが得られます。

{u'outputs': {u'classes': {u'dtype': u'DT_INT64',
   u'int64Val': [u'2'],
   u'tensorShape': {u'dim': [{u'size': u'1'}]}},
  u'probabilities': {u'dtype': u'DT_FLOAT',
   u'floatVal': [3.631196159403771e-05,
    1.6551141015952453e-05,
    0.9999462366104126,
    1.1570033819907621e-08,
    9.113807664107298e-08,
    9.864007527449203e-11,
    1.1561480306454541e-07,
    4.915287621365394e-10,
    6.602479629691516e-07,
    4.94243757032109e-10],
   u'tensorShape': {u'dim': [{u'size': u'1'}, {u'size': u'10'}]}}}}

このレスポンスのoutput.classes.int64Valの値が実際の推論結果となります。
今回の例では、floatValの値が各クラスに所属する確率を表しています。
このレスポンスでは、floatVal[2]の値が最も大きいので、この画像はクラス2に分類するべきだと判断できます。

まとめ

今回はAWS SageMakerを画像分類のモデルとエンドポイントを作成し、
実際にリクエストを投げて推論してみました。
このようにSageMakerを使うと、環境構築いらずで機械学習のモデルを作成できて、
さらにそれを簡単にエンドポイントとしてデプロイできます。
これによって、アルゴリズムの構築に集中できるようになるので、とてもいいサービスだと思います。
それではまた。

Acroquest Technologyでは、キャリア採用を行っています。


  • ビッグデータHadoop/Spark、NoSQL)、データ分析(Elasticsearch、Python関連)、Web開発(SpringCloud/SpringBoot、AngularJS)といった最新のOSSを利用する開発プロジェクトに関わりたい。
  • マイクロサービスDevOpsなどの技術を使ったり、データ分析機械学習などのスキルを活かしたい。
  • 社会貢献性の高いプロジェクトや、顧客の価値を創造するようなプロジェクトで、提案からリリースまで携わりたい。
  • 書籍・雑誌等の執筆や、対外的な勉強会の開催・参加を通した技術の発信、社内勉強会での技術情報共有により、エンジニアとして成長したい。

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。

データ分析案件で時系列データの異常検知に挑戦したいエンジニアWanted! - Acroquest Technology株式会社のエンジニア中途・インターンシップ・契約・委託の求人 - Wantedlywww.wantedly.com