...

TensorRTをもっと高性能に使う

by user

on
Category: Documents
617

views

Report

Comments

Transcript

TensorRTをもっと高性能に使う
TOKYO | OCT. 5, 2016
TensorRTをもっと高性能に使う
森野慎也, シニアCUDAエンジニア, ディープラーニング部, エヌビディアジャパン
TensorRT
ディープラーニングにおける最高の推論パフォーマンス
高性能なフレームワークで、
GPU上の推論エンジンを、容易に開発する。
ディープラーニングによる推論を用いた、
製品展開のためのソリューション
トレーニング済みネットワーク、ターゲットGPUに対して、
推論エンジンの性能を最適化
32-bit、16-bit 演算を用いた推論エンジン
Hyperscale, ADAS, Embedded 向け
https://developer.nvidia.com/tensorrt
HTTP (~10ms)
データセンターにおける GPU Inference Engine
画像分類
オブジェクト
検知
音声認識
---
TensorRT
ニューラルネットワークの最適化
• ネットワークレイヤの融合
• Concatenationレイヤの除去
• カーネル特殊化
• ターゲットプラットフォームに対する
オートチューニング
トレーニング済みの
ニューラルネットワーク
https://developer.nvidia.com/tensorrt
• 最適なテンソルレイアウトの選択
• バッチサイズのチューニング
最適化された
推論
エンジン
TensorRT
ワークフロー
DIGITS
NEURAL
NETWORK
developer.nvidia.com/gpu-inference-engine
OPTIMIZATION
ENGINE
PLAN
EXECUTION
ENGINE
TensorRT @ Parallel ForAll
TensorRTそのものについては、
こちらをご参照ください。
簡潔ですが、情報量も多いです。
https://devblogs.nvidia.com/parallelforall/production-deep-learning-nvidia-gpu-inference-engine/
GPU REST ENGINE
https://github.com/NVIDIA/gpu-rest-engine
CaffeをTensorRTに
入れ替えてみよう!
推論サーバの実装。
Go言語を使用した、HTTPサーバ
Caffeを用いた推論
NVIDIA Dockerを使用したコンテナ化
TensorRTとCaffeの推論性能比較
CaffeとTensorRTの比較
実行例 : 画像から対象を認識
[{"confidence":0.9255,"label":"n02328150 Angora,
Angora rabbit"},
{"confidence":0.0466,"label":"n02326432 hare"},
{"confidence":0.0272,"label":"n02325366 wood rabbit,
cottontail, cottontail rabbit"},
{"confidence":0.0001,"label":"n02097298 Scotch
terrier, Scottish terrier, Scottie"},
{"confidence":0.0001,"label":"n02364673 guinea pig,
Cavia cobaya"}]
CaffeとTensorRTの比較
評価条件
使用したモデル、ファイル
-
Caffeに含まれる、GoogleNetモデル。
https://github.com/BVLC/caffe/tree/master/models/bvlc_googlenet
-
ILSVRC12の学習に用いられた、平均値イメージ。
https://github.com/BVLC/caffe/tree/master/data/ilsvrc12
フレームワーク・ライブラリ
-
Caffe : NVIDIA github上のフォークを使用 (v0.15.9)
-
TensorRT RC1 (CUDA 8.0)
基本となる実装
https://github.com/NVIDIA/caffe/tree/caffe-0.15/examples/cpp_classification
推論(INFERENCE)の処理
処理内容の説明
Caffe版
TensorRT版
画像のデコード
cv::decode
cv::decode
前処理:
Float化・リサイズ・平均値を引く
メモリレイアウト変換
cv::cuda モジュール
CUDA
カスタム実装
推論
Caffe
TensorRT
推論結果から
画像のラベルを取得
CPU処理
CPU処理
少しだけ、実装を、見てみる
本日使用したGPU
Quadro M5000
Compute Capability : 5.2 (GM204)
CUDA Cores : 2048
Memory : 8 GB GDDR5 (256 bit)
TensorRTのご利用時には、
Teslaでの運用をお願いいたします。
評価結果
Caffe版
TensorRT版
速度向上率
前処理
3.0 ms
0.8 ms
x 3.7
推論
7.4 ms
2.4 ms
x 3.1
全体
10.4 ms
3.2 ms
x 3.2
前処理も、最低限の処理に整理し、CUDA化することで、3.7倍 高速化。
TensorRTの使用により、推論速度は、3.1倍、向上
TensorRTから、もっと性能を引き出す!
高効率化の指針
コンカレントな実行
- 複数の推論処理を、並行に実行することで、GPUの使用率をあげる。
バッチサイズの効果
バッチサイズを大きくとる
- 一般に、バッチサイズが大きい方が、演算効率が高い。
コンカレントに実行
cudaStreamを利用する
Thread 1
Thread 2
Thread 3
CUDA Stream 1
CUDA Stream 2
output1
decode1
decode4
output2
decode2
decode5
output3
decode3
infer1
infer3
infer2
スレッドの数と、CUDA Streamの数が、一致しなくとも構わない。
dec…
Infer…
Infer..
ストリームの設定
nvinfer1::IExecutionContext *ctx = …;
cudaStream_t stream;
cudaStreamCreate(&stream);
/* 略 */
ctx->enqueue (batchSize, d_inputs, stream, NULL);
cudaStreamSynchronize(stream);
コンカレントに実行
性能計測結果
5.00
700
同じスレッド数、ストリーム数で実行。
600
8スレッド:8ストリームで飽和。
推論時間 [ms]
500
3.00
400
300
2.00
200
1.00
100
0.00
0
1:1
2:2
4:4
8:8
16:16
スレッド数 : ストリーム数
32:32
スループット [1/s]
4.00
約2倍の性能改善
プロファイラ
シリアル実行時
コンカレント実行時には、複数のカーネルが、
オーバーラップして動作している。
コンカレント実行時
拡大図
カーネルが、オーバーラップして
いる。
推論用のカーネルの並列度は、
低いものがある。
カーネルのオーバーラップ実行が
可能。
複数の推論をコンカレントに実
行することで、効率向上。
WEBサーバと結合して評価
シーケンシャル・コンカレントな推論 スループット比較
推論サーバの
「推論処理スループット」
「処理レイテンシ」
を計測。
推論サーバ
GOの net/http パッケージを使用して実装
推論Server
http:
…
「同時リクエスト数」を変えて、計測。
GOのboomを使用
Localhost経由での計測
(イーサネット通信の影響なし)
Client : boom
同時リクエスト数
1 ~ 32
推論のリクエストに対して、並行実行
推論リクエスト
推論リクエスト
推論リクエスト
推論リクエスト
推論リクエスト
実行待ち
実行待ち
GPU
推論実行
Stream1
推論実行
Stream2
推論実行
Stream3
推論サーバの性能評価
スループット・レイテンシ
シリアルな推論に比べ…
スループット [リクエスト数 / s]
700
シリアル
コンカレント
600
コンカレントに推論を実施することで
約 “650 リクエスト / 秒” を実現。
約 2倍のスループットを達成
500
400
同時リクエスト数 8 で、性能は飽和。
300
レイテンシ(同時リクエスト数8)
200
シリアル
コンカレント
100
0
1
2
4
8
同時(並行)リクエスト数
16
32
22.1 ms
14.2 ms
バッチサイズの効果
一般に、バッチサイズを大きくすることで、
処理性能は向上。
バッチ数が小さい :
メモリアクセス量に対して、
演算量が少ない。効率低い。
TensorRT
(バッチサイズ=1)
TensorRT
(バッチサイズ=4)
バッチ数を増やす :
メモリアクセス量に比して
多くの演算を効率的に実行
rabbit
Rabbit
Dog
Cat
Mouse
高効率
バッチ数の増加による性能改善
Chart Title
3.50
1000
3.00
TensorRTの
推論処理時間のみを計測。
800
2.00
600
1.50
400
1.00
200
0.50
0.00
0
1
2
4
8
16
バッチサイズ
32
64
128
スループット / s
実行時間 [ms]
2.50
バッチサイズごとに、
ネットワークの最適化行う。
バッチサイズの増加により
スループットは、「2.5倍」改善
推論のリクエストに対して、並行実行
複数バッチ数で実行
推論リクエスト
推論リクエスト
実行待ち
推論リクエスト
推論リクエスト
推論リクエスト
推論リクエスト
推論リクエスト
推論リクエスト
推論リクエスト
推論実行
Stream2
推論リクエスト
推論リクエスト
推論リクエスト
推論リクエスト
推論実行
Stream1
推論リクエスト
推論実行
Stream3
推論(バッチ数4)を適用する
推論サーバのスループット
900
シリアル
800
コンカレント
700
バッチ
同時リクエスト数 32にて、
バッチ数4の推論サーバが
高速になる。
スループット [1/s]
600
一方、レイテンシは同程度。
500
400
コンカレント
バッチ(N=4)
300
53.5 ms
49 ms
200
100
0
1
2
4
8
同時リクエスト数
16
32
64
シリアル実行に比して、
2.4倍の性能向上
TensorRTから、もっと性能を引き出す!
まとめ
前処理も最適化する
コンカレントな実行
-
バッチサイズの効果
複数の推論処理を、並行に実行することで、GPUの使用率をあげる。
バッチサイズを大きくとる
- 一般に、GPUでは、バッチサイズが大きい方が、演算効率が高い。
TOKYO | OCT. 5, 2016
THANK YOU SO MUCH !!
JOIN THE CONVERSATION
#GTCJapan
Fly UP