TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

dlshogiのPyTorch Lightning対応 その4(8GPUで学習)

前回、dlshogiをPyTorch Lightningを使用した並列学習に対応させた、8GPUでどれくらい学習が速くなるか試した。

条件

  • 30ブロック384フィルタのモデル
  • 訓練データ: 35,289,182局面
  • エポック数: 2
  • バッチサイズ: 4096
  • オプティマイザ: AdamW
  • 学習率: 1e-4 (1epochごとに1/2)
  • WeightDecay: 1e-2

訓練時間


※version_0: 8GPU、version_1: 1GPU

8GPUで学習すると、1GPUに対して、学習時間は0.15倍になった。
約6.7倍速くなっている。

精度

訓練損失

8GPUの方が小さく変動しているが、ほぼ同じ傾向である。
変動する理由は、8GPUの方は、分割した1プロセスのログが出力されているため、バッチサイズが1/8になることで分散が増えたためと考えられる。

評価損失

8GPUの方が評価損失は下がっているが、微差である。

方策正解率


1GPUの方がわずかに高いが、微差である。

価値正解率


8GPUの方がわずかに高いが、微差である。

8GPUで学習しても精度は保たれており、学習時間が短縮できることが確認できた。

Sync Batch Normalization

PyTorch Lightningのデフォルトでは、Sync Batch Normalizationが無効になっている。

Sync Batch Normalizationは、Batch Normalizationの統計を複数プロセスで同期する機能である。
Batch Normalizationを使用していて、マルチGPUで学習する場合は有効にした方がよい。

PyTorch Lightningでは、Trainerのsync_batchnormをTrueにすることで有効にできる。

sync_batchnorm=Trueにして、Falseの場合と比較した結果は以下の通り。

訓練時間


※version_2がsync_batchnorm=True

sync_batchnorm=Trueにすると、学習時間が約1.12倍になる。
Batch Normalizationの統計を同期する分遅くなっている。

訓練損失

ほぼ同じである。

評価損失

sync_batchnormなしの方が、少し低い。

方策正解率

sync_batchnormありの方が若干高いが、微差である。

価値正解率

sync_batchnormなしの方が、少し高い。


sync_batchnormなしの方が、評価精度が高そうだが、エポックごとに差がありそうなので、追加で2エポック学習させてみた。

評価損失


※version_3がsync_batchnormなし、version_4がsync_batchnormあり

4エポック目でほぼ同じになった。

方策正解率

sync_batchnormなしの方が若干高いが、微差である。

価値正解率

sync_batchnormありの方が若干高いが、微差である。


エポックごとに差があるが、ほぼ違いはない。

学習時間が少し長くなることを考慮すると、sync_batchnormはなしでも測定結果からは問題なさそうである。
収束するまで学習した際にどうなるかはわからない。

まとめ

8GPUで学習した際の学習時間と精度を確認した。
結果、精度を保ったまま、学習時間を0.15倍にできることがわかった。