TadaoYamaokaの日記

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

ChainerでマルチGPUを試す

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対応を行いたいと思う。