TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

TensorRTのパフォーマンス測定

先日試したTensorRTをdlshogiのネットワークの推論で試せるようにしたので、パフォーマンスを測定してみた。

バッチサイズを可変にして、プロファイル最適化も行った。

測定条件

floodgateの棋譜からサンプリングした10万局面の推論時間を測定する。
バッチサイズは128とする。
3回測定して平均をとる。
Windows 10 64bit、GeForce 2080Tiで測定した。環境の詳細は先日の記事を参照。

測定に使用したコード:
DeepLearningShogi/tensorrt_benchmark.cpp at feature/tensorrt · TadaoYamaoka/DeepLearningShogi · GitHub

比較対象

  • TensorRT(FP32) : TensorRTを使い32bit浮動小数点モードで推論
  • TensorRT(FP16) : TensorRTを使い16bit浮動小数点モードで推論
  • cuDNN(FP32) : cuDNNを使い32bit浮動小数点モードで推論
  • cuDNN(FP16) : cuDNNを使い16bit浮動小数点モードで推論

測定結果

条件 時間
TensorRT(FP32) 9695 ms
TensorRT(FP16) 2760 ms
cuDNN(FP32) 9215 ms
cuDNN(FP16) 4355 ms

考察

TensorRT(FP16)が、cuDNN(FP16)よりも約58%速く、最速という結果になった。
TensorRTによる最適化の効果が大きいことがわかった。
数%程度速くなればよいと考えていたので、想定したよりずっと速い。

逆にFP32では、cuDNN(FP32)の方が少し速く、最適化の効果がでていない。
FP16だとTensorコアが使用されるので、TensorRTはTensorコアに最適化されているのかもしれない。

モデルのビルド時間について

TensorRTでは最適化プロファイルを使用してモデルをビルドすると、ビルドに時間がかかる。
ビルド時間は、setMaxWorkspaceSizeで設定するワークスペースサイズによって異なった。

浮動小数点モード ワークスペースサイズ ビルド時間
FP32 64MB 5478 ms
FP16 64MB 22905 ms
FP32 256MB 6380 ms
FP16 256MB 32154 ms
FP32 1024MB 8276 ms
FP16 1024MB 59058 ms

ワークスペースサイズを増やすほど、ビルドに時間がかかる。
特にFP16の場合に時間がかかる。
ワークスペースサイズを増やすことで推論時間は変わらなかった。

適切なサイズをどのように決めればよいか不明だが、ビルド時間を考慮すると大きくしすぎない方が良さそうだ。

事前のレイヤー融合の効果

TensorRTは最適化のプロセスでレイヤー融合を行うが、モデルをONNXにする前にレイヤー融合を行った場合どうなるか測定してみた。

条件 時間
TensorRT(FP16、レイヤー融合) 2826 ms

事前にレイヤー融合を行っても効果はなかった。

実装時にハマったこと

FP16モードにした場合も、バインドする入出力のメモリはFP32にする必要があった。
cuDNNの実装ではホスト側でFP32とFP16の変換を行っていたが、TensorRTではGPU側で暗黙に変換を行うようである。

まとめ

TensorRTをFP16モードで使用すると推論がcuDNNを使用するよりも大幅に速くなる。
効果があることが分かったので、dlshogiに組み込む予定である。

2020/4/15追記

Linux(Ubuntu18.04)上で、Tesla V100でも測定を行った。

条件 時間
TensorRT(FP32,V100) 10622 ms
TensorRT(FP16,V100) 2324 ms

FP16では、Windows上で2080Tiで実行した場合よりも19%高速という結果になった。
V100のTensorコアは 640個で、2080Tiは544個のため、その差(18%)が表れている。