前回の日記の時点で、自己対局と学習を実装したが、学習したモデルを使って対局できるUSIエンジンを実装した。
dlshogi-zero/mcts_player.py at master · TadaoYamaoka/dlshogi-zero · GitHub
将棋ライブラリにcshogiを使用して、探索方法をdlshogiと同じ方式で並列化を行った。
書籍のために実装したpython-dlshogiは、python-shogiを使用して、スレッドで並列化をして実装していたが、スレッドを増やしてもnpsが120程度にしかならなかった。
モデルはResNet5ブロックだった。
今回は、入力特徴に履歴8局面を使用しており、ニューラルネットワークの規模も10ブロックと大きくなっている。
探索速度測定
1000プレイアウトを行った際の探索速度を測定した。並列探索数は192とした。GPUは1080Ti1枚。
python-dlshogi | 119 |
dlshogi-zero | 811 |
※dlshogi-zeroが今回の実装の測定結果
※1回目はキャッシュに載っていないため、1回目とは異なる局面での2回目の探索で測定
Pythonでシングルスレッドで処理しているにもかかわらずdlshogi-zeroが6.8高速になっている。
C++で実装したdlshogiはnpsが4500程度で、それと比較すると遅いが、Pythonでもそこそこの速度で探索できるようになったと思う。
コードはpython-dlshogiにできるだけ合わせているので、書籍のコードを高速化したい場合にも参考にできると思う。
シングルスレッドで実装したが、GPUで計算中はGILの影響を受けないので、2スレッドにすると2倍くらいにできると思われる。
ただし、マルチスレッドにするとデバッグが難しくなるので、技術書典に向けては実装しない予定。