TitanVを使って、FP32からFP16にするとどれくらい推論が速くなるか試してみた。
また、Geforce 1080 Tiなどのゲーム用のGPUにはFP16のアクセラレータが搭載されていないが、FP16の演算は可能なため、FP32と速度が変わらなければメモリ転送の効率が上がる分だけ速くなると思われる。そのため、Geforce 1080 Tiでも測定してみた。
以前にMNISTデータセットを使ったResNetの推論をCUDA/cuDNN/cuBLASを使って実装した際のコードをFP16に対応させて比較した。
GitHub - TadaoYamaoka/mnistCUDNN at fp16
FP16対応
演算のFP16化
cuDNNのAPIにはデータ形式を指定する引数があるので、CUDNN_DATA_HALFを指定する。
cuBLASでは、CUDA_R_16Fを指定する。
測定結果
MNISTデータセットで、1ブロックのResNetの推論の時間を、FP32とFP16で比較した。
結果は以下の通り。
20エポックの推論の合計時間
バッチサイズ:100
単位:秒
精度 |
GPU |
時間 |
FP16/FP32 |
FP32 |
Titan V |
1.257 |
0.997 |
FP16 |
Titan V |
1.253 |
FP32 |
1080 Ti |
1.484 |
32.223 |
FP16 |
1080 Ti |
47.847 |
考察
TitanVではFP16にすると、処理時間99.7%と、ほとんど変わらなかった。
チャンネル数が1のMNISTデータセットでは、演算の処理時間はほとんど変わらなかったと思われる。
GeForce 1080 Tiでは、FP16にすると処理時間が32.2倍かかるようになり、極端に遅くなった。
cuDNNでの畳み込み演算で特に時間がかかっていた。
FP16アクセラレータがないGPUでもFP32とFP16の演算時間は変わらないと予測していたが、遅くなるという結果だった。
TitanVでFP16化の効果が測定できなかったので、次はネットワークの規模の大きい将棋AIの推論で比較してみる予定。