Amazon Web Services ブログ

Model Server for Apache MXNet を使って、独自の深層学習フレームワークを Amazon SageMaker で使用する

深層学習 (DL) フレームワークを使用すれば、機械学習 (ML) モデルを構築し、トレーニングできます。しかし ML モデルを本番環境でデプロイし、予測 (推論ともいう) をリアルタイムで処理するプロセスは複雑です。そのため ML の実践者は、これらのモデルをホストし推論リクエストを大規模に処理できる、スケーラブルかつパフォーマンスの高いモデルサーバーを構築する必要があります。

この問題に対処しようと、Model Server for Apache MXNet (MMS) が開発されました。MMS は極めてスケーラブルなだけでなく、すぐに使える推論サーバーです。MMS は ML/DL フレームワークに依存しないように設計されているため、どんな ML/DLフレームワークでトレーニングしたモデルでもホストできます。

この記事では MMS を利用して、運用中の ML/DL フレームワークまたはツールキットを使ってトレーニングしたモデルをホストする方法をご紹介します。本番用ホスティングには、Amazon SageMaker を使います。この PaaS ソリューションはインフラストラクチャを構築する数多くの作業を行ってくれるため、自身のユースケースに集中できます。

今回のソリューションでは、「Amazon SageMaker ホスティングサービスでの独自の推論コードの使用」で概説したアプローチを使用します。この記事では、必要とされるすべての依存関係、ライブラリ、フレームワークとその他のコンポーネントとともにモデルを使用する方法について説明します。それらを 1 つのカスタム Docker コンテナにコンパイルしてから、Amazon SageMaker でホストします。

MMS が ML/DL フレームワークに依存しないアーキテクチャーであることをお見せするため、PaddlePaddle フレームワークでトレーニングしたモデルを本番で投入することにしました。MMS 持ち込み (BYO) コンテナを使って、ML/DL フレームワークでトレーニングしたモデルを Amazon SageMaker で使用する手順を次の図に示しました。

この図が示すように、MMS BYO コンテナを使って ML/DLフレームワークを Amazon SageMaker で使用するには、2 つの主要コンポーネントが必要です。

  1. モデルアーティファクト/モデルアーカイブ: 特定のホストでモデルを実行するために必要なアーティファクトすべてです。
    • モデルファイル: 通常はシンボルと重みです。モデルをトレーニングするアーティファクトです。
    • カスタムサービスファイル: 推論リクエストを MMS が受信および処理するたびに呼び出されるエントリポイントを含んでいます。このファイルには、特定の ML/DL フレームワークでモデルを初期化するためのロジックを含んでおり、着信リクエストを前処理し、推論を実行します。フレームワークの推論メソッドから出力されたデータを取得し、それをエンドユーザーが使いやすいデータに変換するロジックも後処理します。
    • マニフェスト: カスタムサービスファイルと MMS の間のインターフェイス。このファイルは、MMS ディストリビューションの一部として提供される model-archiver というツールを実行することで生成されます。
  1. コンテナアーティファクト: カスタム DL フレームワークで記述したモデルを Amazon SageMaker に取り込んで実行するには、Amazon SageMaker で実行するコンテナを用意してください。この記事では、MMS ベースコンテナを使って、それをカスタム DL フレームワークや他のモデル依存関係をサポートするように拡張する方法を説明します。MMS ベースコンテナは、Amazon SageMaker で即時に起動可能で、さらに高いスケーラビリティを持つ高性能なモデルサーバーを付属する Docker コンテナです。

次のセクションでは、各コンポーネントについて詳しく説明します。

モデルの準備

MMS コンテナは ML/DL フレームワークに依存していません。お好みの ML/DL フレームワークでモデルを作成し、MMS BYO コンテナを使ってそれを Amazon SageMaker で使用すると、スケーラブルで高パフォーマンスのモデルになります。次のセクションでは、PaddlePaddle モデルの作成方法を説明します。

モデルアーティファクトの準備

PaddlePaddle リポジトリの例を示すセクションで公開されており、入手できる Understand Sentiment の例を使用します。

まず、PaddlePaddle/book リポジトリにある指示に従って、モデルを作成します。コンテナをダウンロードし、例の一部として提供されているノートブックを使用して、トレーニングを実行します。トレーニングには Stacked Bidirectional LSTM ネットワークを使用し、100 エポックでモデルをトレーニングしました。このトレーニングの実行後、以下のトレーニング済みモデルアーティファクトのリストを入手しました。

$ ls
embedding_0.w_0    fc_2.w_0    fc_5.w_0    learning_rate_0    lstm_3.b_0    moment_10    moment_18    moment_25    moment_32    moment_8
embedding_1.w_0    fc_2.w_1    fc_5.w_1    learning_rate_1    lstm_3.w_0    moment_11    moment_19    moment_26    moment_33    moment_9
fc_0.b_0    fc_3.b_0    fc_6.b_0    lstm_0.b_0    lstm_4.b_0    moment_12    moment_2    moment_27    moment_34
fc_0.w_0    fc_3.w_0    fc_6.w_0    lstm_0.w_0    lstm_4.w_0    moment_13    moment_20    moment_28    moment_35
fc_1.b_0    fc_3.w_1    fc_6.w_1    lstm_1.b_0    lstm_5.b_0    moment_14    moment_21    moment_29    moment_4
fc_1.w_0    fc_4.b_0    fc_7.b_0    lstm_1.w_0    lstm_5.w_0    moment_15    moment_22    moment_3    moment_5
fc_1.w_1    fc_4.w_0    fc_7.w_0    lstm_2.b_0    moment_0    moment_16    moment_23    moment_30    moment_6
fc_2.b_0    fc_5.b_0    fc_7.w_1    lstm_2.w_0    moment_1    moment_17    moment_24    moment_31    moment_7

これらのアーティファクトが PaddlePaddle モデルを構成しています。

カスタムサービスコードの記述

これで、本番環境でモデルをホストするために必要なモデルファイルが完成しました。このモデルを MMS で稼働するには、これらのファイルの使い方を理解しているカスタムサービススクリプトを用意します。このスクリプトは、サーバーに入ってくる未加工のリクエストを前処理する方法と、PaddlePaddle フレームワークの推論メソッドからの応答を後処理する方法も理解している必要があります。

Paddle_sentiment_analysis.py というカスタムサービスファイルを作成します。ここでは、モデルを初期化するメソッドを含む PaddleSentimentAnalysis というクラスを定義し、前処理、後処理、推論メソッドも定義します。このファイルの骨格は次のようになります。

$ cat paddle_sentiment_analysis.py

import ...
  
class PaddleSentimentAnalysis(object):
    def __init__(self):
    ...

    def initialize(self, context):
    """
    This method is used to initialize the network and read other artifacts.
    """
    ...
    
    def preprocess(self, data):
    """
    This method is used to convert the string requests coming from client 
    into tensors.
    """
    ...

    def inference(self, input):
    """
    This method runs the tensors created in preprocess method through the 
    DL framework's infer method.
    """
    ...

    def postprocess(self, output, data):
    """
    Here the values returned from the inference method is converted to a 
    human understandable response.
    """
    ...
    

_service = PaddleSentimentAnalysis()


def handle(data, context):
"""
This method is the entrypoint "handler" method that is used by MMS.
Any request coming in for this model will be sent to this method.
"""
    if not _service.initialized:
        _service.initialize(context)

    if data is None:
        return None

    pre = _service.preprocess(data)
    inf = _service.inference(pre)
    ret = _service.postprocess(inf, data)
    return ret

このカスタムサービスファイルの詳細を理解するには、paddle_sentiment_analysis.py をご参照ください。このカスタムサービスコードファイルを使用すると、各推論リクエストのライフサイクルがどのようにするかを MMS に指示できます。トレーニングしたモデルアーティファクトが PaddlePaddle フレームワークを初期化する方法も定義します。

トレーニング済みモデルアーティファクトとカスタムサービスファイルが完成したので、Amazon SageMaker のエンドポイントを作成するのに使用する model-archive を作成します。

Amazon SageMaker でホストされるモデルアーティファクトファイルの作成

MMS BYO コンテナを使ってこのモデルを Amazon SageMaker に取り込むには、以下の手順を実行してください。

  1. ANIFEST ファイルを作成します。これはモデルを読み込んで実行するために、MMS がモデルのメタデータとして使用します。
  2. 以前に作成したカスタムサービススクリプトとトレーニング済みのモデルアーティファクトを、MANIFEST ファイルとともに .tar.gz ファイルに追加します。

これを行うには model-archiver ツールを使用します。このツールを使用して .tar.gz アーティファクトを作成する前に、前述のカスタムサービススクリプトを含め、すべてのモデルアーティファクトを別のフォルダーに配置します。このプロセスを簡単にするために、すべてのアーティファクトを利用できるようにしてあります。次のコマンドを実行します。

$ curl https://s3.amazonaws.com/model-server/blog_artifacts/PaddlePaddle_blog/artifacts.tgz | tar zxvf -
$ ls -R artifacts/sentiment
paddle_artifacts        paddle_sentiment_analysis.py    word_dict.pickle
artifacts/sentiment/paddle_artifacts:
embedding_0.w_0    fc_2.b_0    fc_4.w_0    fc_7.b_0    lstm_1.b_0    lstm_4.w_0    moment_12    moment_19    moment_25    moment_31    moment_6
embedding_1.w_0    fc_2.w_0    fc_5.b_0    fc_7.w_0    lstm_1.w_0    lstm_5.b_0    moment_13    moment_2    moment_26    moment_32    moment_7
fc_0.b_0    fc_2.w_1    fc_5.w_0    fc_7.w_1    lstm_2.b_0    lstm_5.w_0    moment_14    moment_20    moment_27    moment_33    moment_8
fc_0.w_0    fc_3.b_0    fc_5.w_1    learning_rate_0    lstm_2.w_0    moment_0    moment_15    moment_21    moment_28    moment_34    moment_9
fc_1.b_0    fc_3.w_0    fc_6.b_0    learning_rate_1    lstm_3.b_0    moment_1    moment_16    moment_22    moment_29    moment_35
fc_1.w_0    fc_3.w_1    fc_6.w_0    lstm_0.b_0    lstm_3.w_0    moment_10    moment_17    moment_23    moment_3    moment_4
fc_1.w_1    fc_4.b_0    fc_6.w_1    lstm_0.w_0    lstm_4.b_0    moment_11    moment_18    moment_24    moment_30    moment_5

これで、model-archiver ツールを使用して、Amazon SageMaker でホスティングに必要なアーティファクトを作成する準備が整いました。model-archiver ツールは MMS ツールキットの一部です。このツールを入手するには、Python の仮想環境でこれらのコマンドを実行してください。他の部分の作業環境から分離されるためです。

mxnet-model-server をインストールすると、model-archiver ツールがプリインストールされます。

# Create python virtual environment
$ virtualenv py
$ source py/bin/activate
# Lets install model-archiver tool in the python virtual environment
(py) $ pip install model-archiver
# Run the model-archiver tool to generate a model .tar.gz, which can be readily hosted
# on Sagemaker
(py) $ mkdir model-store
(py) $ model-archiver -f --model-name paddle_sentiment \
--handler paddle_sentiment_analysis:handle \
--model-path artifacts/sentiment --export-path model-store --archive-format tgz

これで、/model-store ディレクトリに sentiment.tar.gz というファイルが生成されます。このファイルには、すべてのモデルアーティファクトとマニフェストファイルが含まれています。

(py) $ ls model-store
paddle_sentiment.tar.gz

これで、Amazon SageMaker でホストできるすべてのモデルアーティファクトが手に入りました。次にコンテナを作成し、Amazon SageMaker に取り込む方法を見てみましょう。

MMSを使用して、独自の BYO コンテナを構築する

このセクションでは、Amazon SageMaker でホストできる独自の MMS ベースコンテナ (BYOコンテナとも呼ばれる) を構築します。

このプロセスを支援するために、リリース済みのすべてのバージョンの MMS には DockerHub でホストできる、対応する MMS ベース CPU と GPU コンテナが付属しています。これらは Amazon SageMaker でホスト可能です。

この例では、awsdeeplearningteam/mxnet-model-server:base-cpu-py3.6 というタグが付けられたコンテナを使用します。前のセクションで作成したモデルをホストするには、PaddlePaddle パッケージと numpy パッケージをコンテナにインストールします。ベース MMS イメージから拡張し、Python パッケージをインストールする Dockerfile を作成します。先ほどダウンロードしたアーティファクトには、必要なパッケージをインストールするのに必要なサンプルの Dockerfile が付属しています。

(py) $ cat artifacts/Dockerfile.paddle.mms
FROM awsdeeplearningteam/mxnet-model-server:base-cpu-py3.6

RUN pip install --user -U paddlepaddle \
    && pip install --user -U numpy

BYO コンテナを記述した Dockerfile が完成したので、次にビルドします。

(py) $ cd artifacts && docker build -t paddle-mms -f Dockerfile.paddle.mms .
# Verify that the image is built
(py) $ docker images
REPOSITORY      TAG        IMAGE ID            CREATED             SIZE
paddle-mms     latest     864796166b63        1 minute ago        1.62GB

すべてのモデルアーティファクトを含む BYO コンテナが完成し、Amazon SageMaker で起動する準備が整いました。

PaddlePaddle モデルを使用した Amazon SageMaker エンドポイントの作成

このセクションでは、前に作成したアーティファクトを使用して、コンソールに Amazon SageMaker エンドポイントを作成します。Amazon SageMaker Python SDK と AWS SDK for Python を使用して、エンドポイント作成のためのインタラクティブな Jupyter Notebook の例も提供しています (Boto3)。このノートブックは mxnet-model-server GitHub リポジトリにあります。

モデル用の Amazon SageMaker エンドポイントを作成する前に、いくつか準備をします。

 

  1. 先ほど作成したモデルアーカイブ sentiment.tar.gz を Amazon S3 バケットにアップロードします。この投稿では、paddle_paddle という S3 バケットにアップロードしています。
  2. 前に作成したコンテナイメージ paddle-mms を Amazon ECR リポジトリにアップロードします。この投稿では、「paddle-mms」と呼ばれる ECR リポジトリを作成し、そこに画像をアップロードしました。

Amazon SageMaker エンドポイントの作成

モデルとコンテナのアーティファクトが S3 と ECR にアップロードされたので、Amazon SageMaker エンドポイントを作成できます。以下の手順を実行します。

  1. モデル設定を作成する。
  2. エンドポイント設定を作成する。
  3. ユーザーエンドポイントを作成する。
  4. エンドポイントをテストする。

モデル設定の作成

まず、モデル設定を作成します。

  1. Amazon SageMaker コンソールで、[Model]、[Create model] の順でクリックします。
  2. モデル名IAM ロール推論コードイメージの場所 (または ECR リポジトリ)、モデルアーティファクトの場所 (モデルアーティファクトがアップロードされた S3 バケット) の値を指定します。

  3. [Create Model] をクリックします。

エンドポイント設定を作成します。

モデル設定、次にエンドポイント設定を作成します。

  1. 左側のナビゲーションペインで、[Endpoint Configurations]、[Create endpoint configuration] をクリックします。
  2. エンドポイント設定名を入力し、[Add model] をクリックして、先ほど作成したモデルを追加します。次に、[Create endpoint configuration] をクリックします。

最後に、ユーザーが推論リクエストを送信するためのエンドポイントを作成します。

ユーザーエンドポイントの作成

  1. 左側のナビゲーションペインで、[ Endpoints]、[Create endpoint] の順でクリックします。
  2. [Endpoint name] には、センチメント などの値を入力し、前に作成したエンドポイント設定を選択します。
  3. [Select endpoint configuration]、[Create endpoint] の順でクリックします。

Amazon SageMaker に「センチメント」と呼ばれるエンドポイントを作成し、MMS BYO コンテナを使って PaddlePaddle DL フレームワークで構築したモデルをホストします。

このエンドポイントをテストし、これが実際に推論リクエストを処理できるかどうかを確認します。

エンドポイントのテスト

Boto3 ライブラリを使って簡単なテストクライアントを作成します。これは、ペイロードを Amazon SageMaker エンドポイントに送信し、その応答を取得する小さなテストスクリプトです。

$ cat paddle_test_client.py

import boto3

runtime = boto3.Session().client(service_name='sagemaker-runtime',region_name='us-east-1')
endpoint_name="sentiment"
content_type="application/text"

payload="This is an amazing movie."
response = runtime.invoke_endpoint(EndpointName=endpoint_name,
                                   ContentType=content_type,
                                   Body=payload)

print(response['Body'].read())

このスクリプトを実行した場合の、対応する出力は次のとおりです。

b'Prediction : This is a Positive review'

結論

この記事では、MMS BYO コンテナを使用して、Amazon SageMaker で PaddlePaddle モデルを構築しホストする方法を紹介しました。このフローは小さな修正をすれば、PaddlePaddle だけでなく、いろんな ML/DL フレームワークを使って構築したモデル用の MMS を使用した Amazon SageMaker エンドポイントの推論トラフィックを処理する BYO コンテナの構築に再利用できます。

MMS を使って上記の PaddlePaddle モデルを Amazon SageMaker にデプロイするインタラクティブな例については、「Amazon SageMaker Examples」をご参照ください。MMS プロジェクトの詳細については、mxnet-model-server GitHub リポジトリをご参照ください。


著者について

Vamshidhar Dantu は、AWS Deep Learning のソフトウェア開発者です。 スケーラブルかつデプロイの容易な深層学習システムの構築に注力しています。余暇には、家族との時間やバドミントンを楽しんでいます。

 

 

 

Denis Davydenko は、AWS Deep Learning のエンジニアリングマネージャーです。開発者や科学者がインテリジェントなアプリケーションを実現できるような深層学習ツールの構築に注力しています。余暇には、ポーカー、ビデオゲーム、家族との時間を楽しんでいます。