先日試したTensorRTをdlshogiのネットワークの推論で試せるようにしたので、パフォーマンスを測定してみた。
測定条件
floodgateの棋譜からサンプリングした10万局面の推論時間を測定する。
バッチサイズは128とする。
3回測定して平均をとる。
Windows 10 64bit、GeForce 2080Tiで測定した。環境の詳細は先日の記事を参照。
測定に使用したコード:
DeepLearningShogi/tensorrt_benchmark.cpp at feature/tensorrt · TadaoYamaoka/DeepLearningShogi · GitHub
比較対象
測定結果
条件 | 時間 |
---|---|
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に組み込む予定である。