将棋AIの強化学習にTitan Vを使用しているが、今までTitan Vに搭載されているTensorCoreを使えていなかった。
cuDNN 7.1以前では、TensorCoreを有効にするにはプログラムをFP16に対応させる必要があった。
cuDNN 7.2で、FP32でもTensorCoreが使えるようになったので、どれくらい速くなるか試してみた。
TensorCoreを有効にする
畳み込み演算(Convolution)で、TensorCoreを有効にするには、ディスクリプタに対して、
cudnnSetConvolutionMathType(convDesc, CUDNN_TENSOR_OP_MATH_ALLOW_CONVERSION)
をコールすればよい。
GPUにTensorCoreがない場合も、TensorCoreが使われないだけなのでコールしても問題ない。
アルゴリズムの選択には、cuDNN v7のAPIを使う必要がある。
cudnnGetConvolutionForwardAlgorithm_v7(handle, xDesc, wDesc, convDesc, yDesc, 1, &returnedAlgoCount, &algo_perf)
自動的にTensorCoreが有効になるアルゴリズムが選択される。
速度比較
CUDNN_TENSOR_OP_MATH_ALLOW_CONVERSIONあり/なしで、推論の速度を比較した。
TensorCoreを搭載していないGeforce 1080 Tiでも測定した。
結果は以下の通り。
単位:ms
|
なし |
あり |
比率(なし/あり) |
Titan V |
17.697 |
6.888 |
2.57 |
1080 Ti |
16.218 |
16.201 |
1.00 |
精度比較
TensorCoreを有効にすると、内部的にFP16に変換が行われる。
そのため、計算の精度が低くなる。
指し手と勝率の予測の結果にどれだけ影響があるか確認した。
floodgateの棋譜との指し手の一致率、勝敗の一致率、評価値の誤差で確認した。
|
なし |
あり |
指し手一致率 |
0.43797 |
0.43799 |
勝敗一致率 |
0.708297 |
0.708287 |
評価値誤差(MSE) |
0.0199915 |
0.0199915 |
考察
TensorCoreを有効にすると、2.57倍高速になった。
TensorCoreを搭載していない1080 Tiでは、CUDNN_TENSOR_OP_MATH_ALLOW_CONVERSIONを設定しても処理時間が変わっていない。
TensorCoreを有効にすることで、CUDAコアで計算するよりも高速になることが確認できた。
TensorCoreを使わない場合は、1080 Tiの方がわずかに速い。
ベースクロックが1080 Tiの方が高いためと思われる。
TensorCoreを使わなければ、Titan Vの性能は活かせないと言える。
計算の精度について、畳み込み演算が内部的にFP16に変換されるが、最終結果にほとんど影響していない。
cuBlasでもTensorCoreを有効にできるので、全結合の速度が改善できるはずなので次に試す予定。
今月発売されるGeforce 2080 Tiでも、TensorCoreが544個搭載されるので、機械学習目的でも使えそうです。
Titan Vの640個よりは少ないですが、コストパフォーマンスはよさそうですね。