GPUが2枚になったので、ChainerでマルチGPUによる学習を試してみた。
MNISTサンプルを使って、実行時間を測定した。
測定条件
- CUDA v9.0
- cuDNN 7.0.5
- ChainerのGitHubレポジトリのexamples/mnistを使用
- 単体の実行時間はtrain_mnist.pyの実行時間
- マルチGPUの実行時間はtrain_mnist_data_parallel.pyとtrain_mnist_model_parallel.pyの実行時間
- オプションはデフォルト
- GPUはTitan VとGeForce 1080 Tiの2枚
測定結果
条件 | 実行時間(sec) | validation/main/accuracy |
Titan V 単体 | 50.2274 | 0.9814 |
GeForce 1080 Ti 単体 | 50.0922 | 0.9801 |
マルチGPU(data_parallel) | 30.8084 | 0.9817 |
マルチGPU(model_parallel) | 140.529 | 0.9799 |
考察
単体の実行時間は、どちらも変わらない。
Titan Vの方がCUDAコアとメモリ性能が良いが、MNISTサンプルではGPUの能力を使い切っていないためと思われる。
別途、差が出る条件で測ってみたい。
マルチGPUにすると、data_parallelでは実行時間が61%になっている。
テストデータの一致率は低下していないので、マルチGPUによって効率が上がっている。
ソースを見ると、TrainerのParallelUpdaterを使っているので、data_parallelがChainerの標準的なマルチGPU対応方法と言える。
model_parallelでは、実行時間が単体の実行時間の2.8倍になっている。
テストデータの一致率も低下しており、マルチGPUにより効率が悪くなっている。
ソースを見ると各層で同期をとる処理を行っていたんで、それが遅い原因であると思われる。
作成している将棋AIもマルチGPU対応を行いたいと思う。