Triton Inference Serverを使って簡単に画像分類を行う

Triton Inference Serverを使ってGPUモデルを動作するサーバーを立てるぞ

わざわざサーバー立てる必要ありますか。

データを上手くまとめてくれたり、複数のフォーマットのモデルを扱ってくれたり、高速化できるなどメリットがあるぞ

Triton Inference Server

今回はTriton Inference Serverを使ってみます。推論用のサーバーを立ててHTTP/RESTもしくはGRPC経由で動作可能です。クライアント側から推論処理をしたいデータをサーバーに送って処理を行います。

下記のような特徴があります。

  • 複数のフレームワークをサポート:ONNXやSavedModelなど
  • 複数のモデルの同一GPUでの同時実行
  • バッチサポート:scheduling and batchingに基づいてデータをバッチにまとめて処理
  • Custom backend support.:Deep Learning以外のGPU処理を使用したい場合に使用します。
  • Ensemble support : 前処理->モデル推論->後処理。前処理結果を複数のモデルに連携などが可能
  • 複数のGPUでの動作をサポート
  • サーバーの再起動なしでモデルの入れ替えが可能
  • モデルをローカルだけでなく、クラウドやS3で管理可能
  • HTTP/REST、GRPCのプロトコルを使用可能
  • モデル、サーバーの動作状況をチェック可能
  • Prometheus経由でGPUの利用状況やスループットなどを監視可能

その他の機能や詳細は下記に記述されています。

https://docs.nvidia.com/deeplearning/triton-inference-server/user-guide/docs/#features

動作確認

動作環境は下記です。

ハードウェア

  • CPU: Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz
  • Memory: 64GB
  • GPU: Geforce 2080 Ti

ソフトウェア

  • OS: Ubuntu 18.04
  • cuda: バージョン11.0
  • Graphics Driver: バージョン450.51.06
  • docker: 19.03.12

下記のQuick Startに基づいて動作確認します。

https://docs.nvidia.com/deeplearning/triton-inference-server/user-guide/docs/quickstart.html

まず動作確認のためのサンプルモデルをダウンロードします。

git clone https://github.com/NVIDIA/triton-inference-server 
cd triton-inference-server
git checkout r20.08
cd docs/examples
./fetch_models.sh

環境構築済みdocker をNGC(NVIDIA GPU CLOUD)から取得します。NGCの導入方法については下記に記事を書きました。

下記のコマンドで環境構築済みコンテナを取得します。

docker pull nvcr.io/nvidia/tritonserver:20.08-py3

クライアントサイドのコンテナを取得します。

docker pull nvcr.io/nvidia/tritonserver:20.08-py3-clientsdk

サーバーサイドを実行します。

docker run --gpus=1 --rm --shm-size=1g --ulimit memlock=-1 --ulimit stack=67108864 -p8000:8000 -p8011:8011 -p8012:8012 -v `pwd`/model_repository/:/models  nvcr.io/nvidia/tritonserver:20.08-py3  tritonserver --model-repository=/models

クライアントサイドのコンテナに入ります。

docker run --rm --net=host -it nvcr.io/nvidia/tritonserver:20.08-py3-clientsdk

下記のコマンドでpythonクライアントを動作させます。-mの後にモデルディレクトリを指定しています。

python /workspace/install/python/image_client.py -m resnet50_netdef -s INCEPTION /workspace/images/mug.jpg

動作可能なモデルはtriton inference server でモデルをダウンロードする際に使用したコードの直下にあります。

cd ~/triton-inference-server/docs/examples
ls model_repository/
densenet_onnx  inception_graphdef  resnet50_netdef  simple  simple_string

下記のように”coffee mug”を認識しています。

Request 1, batch size 1
    0.777366 (504) = COFFEE MUG
PASS

認識された画像は下記です。

下記のようにクラス数候補を3つまでにするcオプションとバッチサイズを変えられるbオプションで簡単に変更できます。

python /workspace/install/python/image_client.py -c 3 -b 2 -m resnet50_netdef -s INCEPTION /workspace/images/mug.jpg

下記のように結果を取得できます。

Request 1, batch size 2
    0.777365 (504) = COFFEE MUG
    0.213909 (968) = CUP
    0.002944 (967) = ESPRESSO
    0.777365 (504) = COFFEE MUG
    0.213909 (968) = CUP
    0.002944 (967) = ESPRESSO
PASS

Triton Inference Serverが参照するモデルのパスは下記になります。

  • config.pbtxt : 各モデルのための設定ファイル
  • output-labels-file:モデルのラベルファイル
  • version:バージョンごとにモデルを管理できます。
  • model-definition-file:モデルファイルになります。使用できるモデルフォーマットはリンク先に記述されています。
<model-repository-path>/
  <model-name>/
    [config.pbtxt]
    [<output-labels-file> ...]
    <version>/
      <model-definition-file>
    <version>/
      <model-definition-file>
    ...
  <model-name>/
    [config.pbtxt]
    [<output-labels-file> ...]
    <version>/
      <model-definition-file>
    <version>/
      <model-definition-file>

Triton Inference Serverの設定確認

config.pbtxtの中身を確認します。

  • name : モデルを呼び出すときの名前を設定
  • platform:モデルのプラットフォームを選択tensorrt_plantensorflow_graphdeftensorflow_savedmodelcaffe2_netdefonnxruntime_onnxpytorch_libtorchが選択可能
  • max_batch_size:最大のバッチサイズを設定
  • name:モデルの入力名と出力名は決まっているので設定
  • data_type:入力データのデータタイプが決まっているので設定
  • format:画像データは入力次元の順序がデータによって異なるので明示的に設定
  • dims:入力、出力データの次元を設定
  • label_filename:出力の際のラベル名を決めるためのファイルを指定
name: "resnet50_netdef"
platform: "caffe2_netdef"
max_batch_size: 128
input [
  {
    name: "gpu_0/data"
    data_type: TYPE_FP32
    format: FORMAT_NCHW
    dims: [ 3, 224, 224 ]
  }
]
output [
  {
    name: "gpu_0/softmax"
    data_type: TYPE_FP32
    dims: [ 1000 ]
    label_filename: "resnet50_labels.txt"
  }
]

簡単にサーバーの立ち上げから画像分類まで実行できたぞ

画像分類以外のケースはよく分からなかったです

それはまた今度やるぞ

Close Bitnami banner
Bitnami