48先生から頂いたautomatic mixed precision対応のプルリクに対応しました。
Pytorch 1.6 の Automatic Mixed Precision対応 by bleu48 · Pull Request #18 · TadaoYamaoka/DeepLearningShogi · GitHub
automatic mixed precisionは、PyTorch 1.6で追加されたTensorCoreを使用して学習を高速化する機能です。
詳細は↓こちらを参照。
Introducing native PyTorch automatic mixed precision for faster training on NVIDIA GPUs | PyTorch
学習時間
dlshogiの学習で測定した結果は以下の通り。
条件:
- 27,051,941局面の学習
- バッチサイズ 1024
- SWA使用
条件 | 学習時間 | SWAのbn_update | 合計 |
---|---|---|---|
ampなし | 2:33:57 | 0:43:58 | 3:17:55 |
ampあり | 1:15:53 | 0:31:52 | 1:47:45 |
学習時間とSWAのbn_updateの合計で、54%に短縮されている。
精度
テストデータにはfloodgateの棋譜からサンプリングした856,923局面を使用
条件 | 訓練損失平均 | テスト損失 | policy一致率 | value一致率 |
---|---|---|---|---|
ampなし | 1.1555423 | 1.6557858 | 0.40078359 | 0.69063551 |
ampあり | 1.15769344 | 1.65721888 | 0.40040172 | 0.68830110 |
精度が大幅に落ちるということは起きていない。
わずかに下がっているが、初期値の違いでも起きる差なのでampの影響は小さいと思われる。
補足
ampは、FP16への変換を自動で行い、精度が落ちないように計算中の値を自動でスケーリングする。
勾配がInfやNanになる場合は、そのstepはスキップされ、更新が連続で成功した場合に、自動でスケーリングパラメータを調整している。
dlshogiの初期モデルの学習は、初期値によってはモデルの出力がnanになることが良く起きていたが、上記の仕組みによりそれが発生しなくなった。
今の自己対局の仕組みでは起きていないが、以前は学習が進むと突然nanになるようなこともあったので、それも自動で防げるという効果もありそうだ。
まとめ
automatic mixed precisionを使用することで、精度を落とさずに学習を(上記の測定条件の場合)約1.8倍に高速化できる。
48先生、ありがとうございました。