Amazon Web Services ブログ

Model Server for Apache MXNet v1.0 がリリース

AWS が最近リリースした Model Server for Apache MXNet (MMS) v1.0 はサービス使用状態を管理するための新しい API を特徴としており、ランタイム中のモデルの動的ロード、レイテンシーの低減、高いスループットを可能にします。本記事では、新機能を詳しくご紹介するとともに、MMS v1.0 のパフォーマンス向上についてご覧いただきます。

Model Server for Apache MXNet (MMS) とは?

MMS はモデルサーバーを提供するオープンソースのフレームワークで、スケーラブルなトレーニングおよび推論のための深層学習モデルのタスクを簡略化を目的に設計されました。下図に、MMS のスケーラブルにデプロイしたアーキテクチャの例を示します。

以下は、MMS v1.0 の主要な機能です。

  • MXNetGluonONNX ニューラルネットワークモデル対応用途に設計。
  • モデルアーカイブにパッケージされたカスタムコードを使用して、推論実行パイプラインの各ステップをカスタマイズ。
  • REST API エンドポイントを含む、軽量かつスケーラブルなサービススタックの事前設定。
  • ランタイム中のモデルのロード、アンロード、スケーリングを可能にする管理 API の公開。
  • 大規模な推論のためのビルドおよび最適化済みのコンテナイメージ。
  • リアルタイムのオペレーションメトリクスを使用して、システムおよび API の健全性、パフォーマンス、ロードをモニタリング。

MMS のクイックスタート

MMS 1.0 では、Java 8 以上の環境が必須です。サポート対象のプラットフォームごとにインストール方法を以下に示します。

# Ubuntu/Debian ベースのディストリビューション
sudo apt-get install openjdk-8-jre
# Fedora、Redhat ベースのディストリビューション
sudo yum install java-1.8.0-openjdk
# Mac デバイス
brew tap caskroom/versions
brew cask install java8

現時点では、MMS は Windows でサポートされていません。

MMS v1.0 パッケージのインストール方法:

pip install mxnet-model-server==1.0

MMS v1.0 は特定の深層学習エンジンに依存することはありませんが、本ブログ記事では、MXNet エンジンを使用した推論の実行に絞り込みます。

# mxnet のインストール
pip install mxnet

インストールの検証方法:

mxnet-model-server

これで、出力が作成されます。

[INFO ] main com.amazonaws.ml.mms.ModelServer -
MMS Home: pip_directory/mxnet-model-server
Current directory: <your-current-directory>
Temp directory: /temp/directory
Log dir: cur_dir/logs
Metrics dir: cur_dir/logs
[INFO ] main com.amazonaws.ml.mms.ModelServer — Initialize servers with: KQueueServerSocketChannel.
[INFO ] main com.amazonaws.ml.mms.ModelServer — Inference API listening on port: 8080
[INFO ] main com.amazonaws.ml.mms.ModelServer — Management API listening on port: 8081
Model server started.

Java ランタイムが見つからない場合、または MMS が pip によって正しくインストールされていない場合は、これまでのステップは失敗します。

サーバーを停止するには、以下を実行します。

mxnet-model-server --stop

これで、MMS のインストールの検証が終わりました。それでは、猫の品種について推論しましょう。

推論の実行

速やかに開始していただくために、MMS の起動、事前トレーニング済みの推論モデルのロード、ランタイム中のモデルのスケーリングをご覧いただきます。

まず、軽量のイメージ分類モデルである SqueezeNet 対応のモデルサーバーを実行します。

# Squeezenet の起動と同時ロード
mxnet-model-server --models squeezenet=https://s3.amazonaws.com/model-server/model_archive_1.0/squeezenet_v1.1.mar

猫のイメージをダウンロードし、MMS に送信して、猫の品種を識別する推論結果を取得します。

# 猫のイメージのダウンロード
curl -O https://s3.amazonaws.com/model-server/inputs/kitten.jpg

予測 API にリクエストを送信するには、ポート 8080 を使用します。

# SqueezeNet で予測
$ curl -X POST http://127.0.0.1:8080/predictions/squeezenet_v1.1 -T kitten.jpg

# レスポンス
[
   {
      "probability":0.8515270352363586,
      "class":"n02124075 Egyptian cat"
   },
   {
      "probability":0.09674196690320969,
      "class":"n02123045 tabby, tabby cat"
   },
   {
      "probability":0.03909175843000412,
      "class":"n02123159 tiger cat"
   },
   {
      "probability":0.006105952896177769,
      "class":"n02128385 leopard, Panthera pardus"
   },
   {
      "probability":0.003104336792603135,
      "class":"n02127052 lynx, catamount"
   }
]

ご覧のとおり、当該モデルは正しく小さな「Egyptian cat」を割り出し、MMS がその結果を引き渡しました。 これで、SqueezeNet は設定、実行、予測が可能な状態になりました。

モデル管理 API

MMS v1.0 は、実行時にモデルの登録、ロード、アンロードを可能にする新しい管理 API を備えています。これは、深層学習 (DL)/機械学習 (ML) モデルが外部モデル構築パイプラインから頻繁に実行される生産環境で特に役立ちます。MMS モデル管理 AP Iは、便利な REST インターフェイスを提供します。これにより、新しいモデルを実行中のモデルサーバーに取り込むのに通常必要なダウンタイムなしで推論が行われます。この API は、新しいモデルを登録して実行中の MMS インスタンスにロードし (モデルをスケールアップする)、不要になれば MMS インスタンスからアンロードする (モデルをスケールダウンする) ためのリソースで構成されます。これらのすべてのリソースは実行時に利用可能であり、MMS インスタンスのバウンスを実行しないため、MMS のダウンタイムは発生しません。

セキュリティ上の理由から、ローカルホストからのみ、管理 API にアクセスできる別のポートがあります。デフォルトで、ポート 8081 は管理 API 用、ポート 8080 は予測 API 用となっています。実行時に Network in Network(NIN) 画像分類モデルを登録してロードしましょう。

# モデル NiN を登録してロードする
$ curl -X POST "http://127.0.0.1:8081/models?url=https://s3.amazonaws.com/model-server/model_archive_1.0/nin.mar&initial_workers=1&synchronous=true"
# レスポンス
{
    "status": "Workers scaled"
}

これで、MMS はモデルとそれをロードする場所を認識します。次に、単一のワーカー処理を同期的な方法で開始します。登録されたモデルに対してより多くのワーカーを生成するには:

# より多くのワーカーを生成する
$ curl -X PUT "http://127.0.0.1:8081/models/nin?min_workers=2&synchronous=true"
# レスポンス
{
    "status": "Workers scaled"
}

NIN モデルに 2 つのワーカーができました。min_workers パラメータは、モデルに必要なワーカーの最小数を定義します。これを 0 に設定すると、既存のワーカーは抹消されます。通常、これが ‘N'(N> = 0 とする) に設定されている場合、’N – current_workers’ は、追加のワーカーが生成される (または結果が負の数であれば削除される) ことを示します。synchronous パラメータは、リクエスト-レスポンスのサイクルが同期していることを保証します。パラメータの詳細については、MMS REST API 仕様書を参照してください。

これで、MMS は NIN モデルの推論リクエストを受け取る準備ができました。トラ猫の画像をダウンロードします。

# トラ猫の画像をダウンロード
curl -O https://s3.amazonaws.com/model-server/inputs/tabby.jpg

# トラ猫の予測
curl -X POST http://127.0.0.1:8080/predictions/nin -T tabby.jpg
# レスポンス
[
  {
    "probability": 0.8571610450744629,
    "class": "n02123045 tabby, tabby cat"
  },
  {
    "probability": 0.1162034347653389,
    "class": "n02123159 tiger cat"
  },
  {
    "probability": 0.025708956643939018,
    "class": "n02124075 Egyptian cat"
  },
  {
    "probability": 0.0009223946835845709,
    "class": "n02127052 lynx, catamount"
  },
  {
    "probability": 3.3365624858561205e-06,
    "class": "n03958227 plastic bag"
  }
]

NIN は 85% の確立でトラ猫を識別しました。

管理と予測のための利用可能な API の詳細については、API ドキュメントを参照してください。

以下のセクションでは、MMS v1.0 のパフォーマンスの向上について説明します。

パフォーマンスの向上

MMS 1.0 では、スケーラビリティとパフォーマンスが向上しています。これは新しく設計されたアーキテクチャの成果です。パフォーマンスの測定には、CPU マシン (EC2 c5.4xlarge インスタンス、mxnet-mkl 1.3.0 パッケージをインストール) を使用して CPU の推論を実行します。当社では、GPU マシン (EC2 p3.16xlarge, mxnet-cu90mkl 1.3.0 パッケージをインストール) を使用して GPU の推論を実行します。

推論にかかる時間を考慮するとともに、リクエスト処理で発生するオーバーヘッドも認識する必要があります。このオーバーヘッドは、同時リクエストの数が増えるとともにレイテンシーに影響します。2 つの加数は推論のレイテンシーを含みます。モデルにフォワードパスを実行するレイテンシーと、インフラステップのレイテンシーがあります。インフラステップのレイテンシーは、データの準備とフォワードパスの結果の処理、メトリクスの収集、フロントエンドとバックエンド間のデータの受け渡し、より多くの同時ユーザーを処理しながらのコンテキスト間の切り替えで構成されます。インフラステップのレイテンシーを測定するために、特別に考案されたノーオペレーション (no-op) モデルを使用して CPU マシンでテストを行います。このモデルはフォワードパスの実行を含みませんが、それはキャプチャされた推論のレイテンシーがインフラステップのコストのみを含むことを意味します。このテストにより、MMS v1.0 は 100 件の同時リクエストに対して 4倍、200 件の同時リクエストに対して 7 倍、レイテンシーのオーバーヘッドが改善されていることが立証されました。Resnet-18 のようなより大きなモデル (エンジンにおける実際の推論がホットスポットであるモデル) のレイテンシーも同様に改善を見せました。resnet-18を GPU マシンで 128 × 128 の画像に対して実行したところ、単独の同時リクエストに対する推論のレイテンシーは 1.15 倍に改善していました。 同時リクエストを 100 件に増やした GPU テストでは、MMS v1.0 のパフォーマンスに最大 2.2 倍の改善が見られました。

スループットについては、CPU マシンでは 1.11 倍の増大、GPU マシンでは 1.35 倍の増大という結果です。

もうひとつの重要なパフォーマンスメトリックスは同時リクエスト数が増加した時の成功率です。ロードが増してハードウェアの限界に近づくと、サービスはリクエストに対しエラーを起こし始めます。以下のグラフでは MMS v1.0 のリクエスト処理の成功率を表しています。

GPU マシンでは、ロードは CPU と共有されます。MMS v0.4 は最大 200 の同時リクエストまでは持ちこたえていますが、同時リクエストがそれ以上に増えるとエラーが発生しはじめます。CPU マシンでは、同時リクエスト数が少ない段階からMMS v0.4 の成功率が下落しています。

リクエスト成功率のテストは、単一ノードにおけるロードのハンドリングキャパシティーが大きく改善したことを示しています。

詳細およびコミュニティへのご参加

本記事は、MMS v1.0 で導入された改善および更新された機能のプレビューです。MMS v1.0 の詳細については、まずレポジトリ内の model zoo および documentation フォルダの事例やドキュメントをご覧ください。

ご質問、ご要望、感想などで当コミュニティへの積極的なご参加をお待ちしております。それらが、MMS の改善に大きく貢献します。MMS をすでにお使いの場合は、レポジトリの GitHub issues からフィードバックをお寄せください。さっそく、awslabs/mxnet-model-server から始めましょう。

 


著者について

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

 

 

 

Frank Liu は、AWS Deep Learning のソフトウェアエンジニアです。ソフトウェア開発者や科学者のための革新的な深層学習ツールの構築に注力しています。余暇には、家族や友人とハイキングを楽しんでいます。

 

 

 

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

 

 

 

Rakesh Vasudevan は、AWS Deep Learningのソフトウェア開発エンジニアです。 スケーラブルな深層学習システムの構築に注力しています。余暇には、ゲーム、クリケット、家族や友人との外出を楽しんでいます。