Amazon Web Services ブログ

Apache MXNet 用モデルサーバーが Gluon モデル対応サポートを追加

今日、AWS は Apache MXNet (MMS) v0.4 用 モデルサーバーをリリースし、Gluon モデルのサポートを追加しました。Gluon は、MXNet の不可欠かつダイナミックなインターフェースであり、MXNet の性能を維持しながら、短時間でのモデル開発が可能です。今回のリリースにより、MMS は Gluon モデルのパッケージ化とサービスをこれまでにない規模でサポートします。このブログ記事では、v0.4 リリースについて詳しく説明し、Gluon モデルを提供する例を紹介します。

Apache MXNet モデルサーバー (MMS) とは

MMS は、オープンソースのモデルサービングフレームワークで、規模に応じて深層学習モデルの機能を果たすタスクを単純化するように設計されています。以下は MMS の主な利点の一部です。

  • MXNet、Gluon、および ONNX ニューラルネットワークモデルに対応するために必要なニューラルネットワークモデルアーティファクトを含むモデルアーカイブを生成するためのパッケージツールを提供します。
  • モデルアーカイブにパッケージ化されたカスタムコードを使用して、推論実行パイプラインの各ステップをカスタマイズする機能は、初期化、前処理、および後処理の上書きを可能にします。
  • REST API エンドポイントと推論エンジンを含む、事前設定されたサービススタック。
  • スケーラブルなモデルサービングのために事前構築および最適化されたコンテナイメージ。
  • サーバーとそのエンドポイントを監視するためのリアルタイム運用メトリクスを含みます。

Gluon とは何か

Gluon は、MXNet に対する明確、簡潔、かつシンプルな Python インターフェイスです。エンジニアは、記号処理の性能上の利点を失うことなく、ニューラルネットワークを構築するための命令型コードを書くことができます。Gluon は、命令的な実装に基づいて最適化された記号コードを自動的に生成することができます。

MMS で Gluon モデルに対応

MMS で Gluon モデルを提供する例を見てみましょう。この例では、Xiang Zhang の文字レベル畳み込みニューラルネットワーク (char-CNN) に基づくモデルを実装するため Gluon を使用します。モデルをパッケージ化し、MMS で提供します。char-CNN は、語彙を理解しテキストを分類するために、リカレントニューラルネットワーク (RNN) の代わりに CNN の使用を含みます。これにより、言語のセマンティクスやシンタックスを理解しなくても、分類が可能になります。このメソドロジー (方法論) を使用するなら、スペルミスなどのデータエラーは予測パフォーマンスにあまり影響しません。

図 1. char-CNN モデル (ソース) の図解

この画像は、基本的な char-CNN モデルの構造を示しています。言葉は語彙テンソルに変換され、次に畳み込みレイヤーに送り込まれます。そのモデルは、Crepe モデルと呼ばれます。次の GluonCrepe コードでは、Crepe モデルを使用して、商品レビューのテキストに基づいて商品カテゴリを予測します。モデルがトレーニングされたデータセットは、Amazon 製品データセットです。(モデルのトレーニング方法の詳細については、Thomas Delteil が提供する詳細チュートリアルを参照してください。)

モデルの定義は以下の通りです。

class GluonCrepe(HybridBlock):
  """
  Hybrid Block gluon Crepe model
  """
  def __init__(self, classes=7, **kwargs):
      super(GluonCrepe, self).__init__(**kwargs)
      self.NUM_FILTERS = 256 # number of convolutional filters per convolutional layer
      self.NUM_OUTPUTS = classes # number of classes
      self.FULLY_CONNECTED = 1024 # number of unit in the fully connected dense layer
      self.features = nn.HybridSequential()
      with self.name_scope():
          self.features.add(
              nn.Conv1D(channels=self.NUM_FILTERS, kernel_size=7, activation='relu'),
              nn.MaxPool1D(pool_size=3, strides=3),
              nn.Conv1D(channels=self.NUM_FILTERS, kernel_size=7, activation='relu'),
              nn.MaxPool1D(pool_size=3, strides=3),
              nn.Conv1D(channels=self.NUM_FILTERS, kernel_size=3, activation='relu'),
              nn.Conv1D(channels=self.NUM_FILTERS, kernel_size=3, activation='relu'),
              nn.Conv1D(channels=self.NUM_FILTERS, kernel_size=3, activation='relu'),
              nn.Conv1D(channels=self.NUM_FILTERS, kernel_size=3, activation='relu'),
              nn.MaxPool1D(pool_size=3, strides=3),
              nn.Flatten(),
              nn.Dense(self.FULLY_CONNECTED, activation='relu'),
              nn.Dense(self.FULLY_CONNECTED, activation='relu'),
          )
          self.output = nn.Dense(self.NUM_OUTPUTS)

MMS 上のサービスとしてモデルを実行するには、次のファイルが必要です。

  1. カスタムサービス Python ファイル – 前処理、推論、および後処理の手順を定義します。また、事前にトレーニング済のウェイトを読む込むためにも使用します。
  2. 署名 JSON ファイル – モデルの予想される入力と出力の形を定義します。
  3. モデルファイル – これは、通常の MXNet モデルファイル向けの JSON ファイルです。しかし、Gluon モデルの場合、それらは Python サービスファイル内に定義したクラス定義です。
  4. パラメータファイル – モデルの事前にトレーニング済のウェイトを格納します。
  5. synset テキストファイル – 分類モデルに固有のこのファイルには、出力クラスのラベルが含まれています。

モデルの推論を実行するには、トレーニングされたモデルのウェイトが必要です。事前にトレーニング済のウェイトをダウンロードするMMS は、カスタムサービスクラスの派生クラスを使い、前処理、推論、および後処理を機能的に定義します。カスタムサービスは、そのモデル固有のものです。Crepe モデルでは、以下のようにサービスを定義します。

class CharacterCNNService(GluonImperativeBaseService):
  """
  Gluon Character-level Convolution Service
  """
  def __init__(self, model_name, model_dir, manifest, gpu=None):
      net = GluonCrepe()
      super(CharacterCNNService, self).__init__(model_name, model_dir, manifest,net, gpu)
      # The 69 characters as specified in the paper
      self.ALPHABET = list("abcdefghijklmnopqrstuvwxyz0123456789-,;.!?:'\"/\\|_@#$%^&*~`+ =<>()[]{}")
      # Map Alphabets to index
      self.ALPHABET_INDEX = {letter: index for index, letter in enumerate(self.ALPHABET)}
      # max-length in characters for one document
      self.FEATURE_LEN = 1014
      # Hybridize imperative model for best performance
      self.net.hybridize()
	
  def _preprocess(self, data):
      # build the text from the request
      text = '{}|{}'.format(data[0][0]['review_title'], data[0][0]['review'])
	
      encoded = np.zeros([len(self.ALPHABET), self.FEATURE_LEN], dtype='float32')
      review = text.lower()[:self.FEATURE_LEN-1:-1]
      i = 0
      for letter in text:
          if i >= self.FEATURE_LEN:
              break;
          if letter in self.ALPHABET_INDEX:
              encoded[self.ALPHABET_INDEX[letter]][i] = 1
          i += 1
      return nd.array([encoded], ctx=self.ctx)
	
  def _inference(self, data):
      # Call forward/hybrid_forward
      output = self.net(data)
      return output.softmax()
	
  def _postprocess(self, data):
      # Post process and output the most likely category
      predicted = self.labels[np.argmax(data[0].asnumpy())]
      return [{'category': predicted}]

前処理セクションでは、入力テキストは切り捨てられてエンコードされます。エンコーディングは、69 文字ベースで行います。

次に、署名 JSON ファイルを定義して、入出力の形状とそのデータ型について MMS に通知します。

"inputs": [{  
    "data_name": "data",  
    "data_shape": [1, 1014]  
}], "input_type": "application/json", "outputs": [{  
    "data_name": "softmax",  
    "data_shape": [0, 7]  
}], "output_type": "application/json"  
}  

入力と出力の両方がテキストで、JSON 形式で渡されます。[1,1014] の入力サイズが推奨されており、Amazon の製品データセットは 7 つの出力クラスを持っています。Synset テキストファイルは、Amazon 製品データセットの 7 つの出力クラスを格納します。

これらのファイルはすべて、MMS エクスポートツールを使用して 1 つのアーカイブにパッケージ化できます。アーカイブを構築するには、完全なカスタムサービスファイルのアーティファクトが必要です。MMS をインストールし、モデルのアーティファクトを同じフォルダにインストールします。

$ mxnet-model-export --model-name="character_cnn" --model-path="/path/to/model/folder" --service-file-path="/path/to/model/folder/service_file.py" 

プリパッケージモデルはダウンロード可能です。

次のコマンドを使用してモデルを提供できるようになりました。

$ pip install mxnet-model-server
$ mxnet-model-server --models crepe=character_cnn.model

これらのコマンドは、http://127.0.0.1:8080 でモデルの提供を開始します。MMS サーバーとエクスポートコマンドラインオプションの詳細については、MMS ドキュメントを参照してください。

サーバーから予測を得るには、新しいターミナルウィンドウを開き、次のコマンドを実行します。

$ curl -X POST http://127.0.0.1:8080/crepe/predict -F "data=[{'review_title':'Inception is the best','review': 'great direction and story'}]"

サーバーからの出力は次のようになります。

{"prediction":[{"category":"Movies_and_TV"}]}

別の例を見てみましょう。

$ curl -X POST http://127.0.0.1:8080/crepe/predict -F "data=[{'review_title':'fantastic quality','review': 'quality sound playback'}]"

この要求に対する応答は次のとおりです。

{"prediction":[{"category":"CDs_and_Vinyl"}]}

スケーラブルなプロダクションユースケースでは、コンテナの使用を推奨します。ソースから MMS コンテナを構築することができ、MMS DockerHub リポジトリから必要なイメージを引き出すことができます。

詳細と貢献

MMS の詳細については、SSD モデルのエクスポートとサービスを通じて順を追って説明する Single Shot Multi Object Detection (SSD) チュートリアルを参照してください。リポジトリの Model Zooドキュメントフォルダーで、多くのサンプルと資料を参照できます。

MMS の開発を継続してますが、質問、要望、寄稿などでコミュニティへ参加いただくことを歓迎しています。MMS をすでに使用されている場合は、ぜひリポジトリの GitHub issues でご意見をお聞かせください。では、使用を開始するために awslabs/mxnet-model-server に移動しましょう!

引用

はやりすたり:ワンクラス協調フィルタリングによるファッショントレンドの視覚的進化のモデリング
R. He、J. McAuley
WWW、2016
pdf


今回のブログ投稿者について

Rakesh Vasudevan は、AWS 深層ラーニングのソフトウェア開発エンジニアです。 彼はスケーラブルな深層ラーニングシステムを構築することに情熱を持っています。暇なときには、彼はゲームやクリケットを楽しみ、友人や家族と遊んでいます。

 

 

 

Vamshidhar Dantu は AWS 深層学習のソフトウェア開発者です。スケーラブルで簡単にデプロイできる深層学習システムの構築に焦点を当てており、そのかたわらで、家族との時間とバドミントンを楽しんでいます。

 

 

 

Hagay Lupesko は AWS 深層学習のエンジニアリングリーダーです。開発者やサイエンティストがインテリジェントアプリケーションを構築できるようにする深層学習システムを担当しています。そのかたわらで、読書、ハイキング、家族との時間を楽しんでいます。