TadaoYamaokaの日記

山岡忠夫Homeで公開しているプログラムの開発ネタを中心に書いていきます。

cuDNN/cuBLASのFP16対応

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対応

データ形式変換

FP32からFP16へのデータ形式の変換は、CUDAの__float2half関数で行える。
CUDA Math API :: CUDA Toolkit Documentation

演算の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の推論で比較してみる予定。