TadaoYamaokaの開発日記

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

GeForce RTX 2080 TiでTensorCoreを使う

GeForce RTX 2080 Tiを使って、ニューラルネットワークの推論でTensorCoreが使えるかを試してみた。

TitanVでは、TensorCoreを使うことで、将棋AIの推論が2.57倍高速になった
2080 Tiにも、TensorCoreが544個搭載されており、TitanVの640個より少ないが、CUDAコアで計算するよりも速くなると思われる。

環境構築

まず、CUDAのバージョンを2080 Tiに対応したバージョンにする必要があるので、最新の10.0にバージョンアップした。
それに合わせて、cuDNNも最新の7.3.1にした。

ベンチマークプログラム

TitanVで測定したときと同じベンチマークプログラムを使用した。
将棋AIのResNet 10ブロックのニューラルネットワークの推論速度を測定する。
DeepLearningShogi/gpubenchmark.cpp at master · TadaoYamaoka/DeepLearningShogi · GitHub

測定結果

TitanVの速度も参考のため測定した。
また、1080 Tiの前回の測定結果も記載する。

結果は以下の通り。

  • 10万局面推論の平均時間
  • バッチサイズ128

単位:ms

GPU TensorCore無効 TensorCore有効 比率(無効/有効)
2080 Ti 13.955 11.966 1.17
Titan V 11.963 12.057 0.99
1080 Ti※ 16.218 16.201 1.00

※CUDA 9.2+cuDNN 7.2

考察

2080 Ti

2080TiでTensorCoreを有効にすると、1.17倍高速になっている。
前回、CUDA 9.2+cuDNN 7.2で、TitanVで測定した結果では、2.57倍だったのに対して高速化の幅は小さくなっている。

Titan V

一方、Titan Vでは、TensorCoreを有効にすると、速度が0.99倍と、前回の結果と大きく異なる結果になった。
原因を調べるため、プロファイラで使用されているアルゴリズムを確認したところ、前回は、volta_s884cudnn_fp16~がトップにあったが、volta_sgemm_128x64_nnになっていた。
f:id:TadaoYamaoka:20181001174513p:plain

cudnnGetConvolutionForwardAlgorithm_v7で、自動で選択されるアルゴリズムを調べたところ、前回は、すべての畳み込み層で、CUDNN_CONVOLUTION_FWD_ALGO_IMPLICIT_PRECOMP_GEMMが使用されていたが、今回は25層のうち21層でCUDNN_CONVOLUTION_FWD_ALGO_WINOGRAD_NONFUSEDが使用されていた。

そこで、前回と同じアルゴリズムにするため、明示的にCUDNN_CONVOLUTION_FWD_ALGO_IMPLICIT_PRECOMP_GEMMが使用されるようにして再測定した。

GPU TensorCore無効 TensorCore有効 比率(無効/有効)
Titan V 11.963 6.557 1.82

結果、TensorCoreが無効の場合より、1.82倍高速になった。
前回は、TensorCoreを使った場合は、6.888msだったので、ほぼ同じになっている。
プロファイラで使用されているアルゴリズムを確認したところ、前回と同じvolta_s884cudnn_fp16~がトップになった。
f:id:TadaoYamaoka:20181001180228p:plain

また、前回よりTensorCoreが無効の場合の速度が速くなっていた。
CUDA 10.0+cuDNN 7.3.1でTensorCoreが無効のアルゴリズムが改善されているようだ。

なお、2080 Tiでは、自動で選択されるアルゴリズムは、すべてCUDNN_CONVOLUTION_FWD_ALGO_IMPLICIT_PRECOMP_GEMMとなっていた。

まとめ

GeForce RTX 2080 Tiでも、TensorCoreを使うことで推論の速度が改善されることが確認できた。

CUDA、cuDNNのバージョンによっては、自動で選択されるアルゴリズムではTensorCoreが使われない場合があることがわかった。
その場合、明示的にアルゴリズムを指定する必要がある。