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_plan, tensorflow_graphdef, tensorflow_savedmodel, caffe2_netdef, onnxruntime_onnx, pytorch_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"
}
]
簡単にサーバーの立ち上げから画像分類まで実行できたぞ
画像分類以外のケースはよく分からなかったです
それはまた今度やるぞ