前回、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倍にできることがわかった。