TadaoYamaokaの日記

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

PythonでAlphaZero Shogiを実装する その2

前回の日記の時点で、自己対局と学習を実装したが、学習したモデルを使って対局できる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倍くらいにできると思われる。
ただし、マルチスレッドにするとデバッグが難しくなるので、技術書典に向けては実装しない予定。