機械学習周りのプログラミング中心。 イベント情報
ポケモンバトルAI本電子書籍通販中

DNNの方策に従来型エンジンのbestmoveをブレンドする コードの動かし方【コンピュータ将棋】

今回の研究用に開発したコードの動かし方と、改良のアイデアを掲載します。私が所持していない、より強力なハードウェアで検証・強化したいという方がもしいらっしゃれば参考にしてください。

記事一覧

コード・環境構築

コード・バイナリ(Windows)はこちらです。python製のツールもあるため、バイナリだけでなくコードも必要になります。 Release DNNの方策に従来型エンジンのbestmoveをブレンドする実験コード · select766/DeepLearningShogi · GitHub

環境構築

実行方法

コマンドプロンプトを2つ立ち上げる。1つはelmoを評価関数として用いるためのサーバで、もう1つは自動対局用。サーバはTCP port8765で通信します。

elmoを評価関数として用いるためのサーバ

ソースコードのトップレベルのディレクトリで以下のコマンドを実行。

python -m searchblend.searchblend_pool path\to\YaneuraOu_NNUE_tournament.exe --options Threads:1,EvalHash:16,NodesLimit:1000 --pool 4

optionsはUSIエンジンにsetoptionで渡される設定です。NodesLimitは、実際にエンジンを動かしつつdlshogi側のnps低下が大きくないように設定する必要があります(PC性能により大きく変わると思います)。poolは立ち上げるエンジンのプロセス数で、CPUのコア数程度に設定するとよいと思われます。

自動対局

改造前後のdlshogiを1手1秒で対局させる場合。

python -m cshogi.cli path\to\blend\dlshogi_tensorrt.exe path\to\original\dlshogi_tensorrt.exe --byoyomi 1000 --options1 DNN_Batch_Size:16,Blend_Ratio_Policy:5,Blend_Ratio_Value:2 --options2 DNN_Batch_Size:16 --games 100 --opening path\to\records2016_10818.sfen
  • Blend_Ratio_Policyが方策関数にelmoのbestmoveを加える割合。0(elmoの出力を無視)~100の範囲。
  • Blend_Ratio_Valueが方策関数にelmoの評価値を加える割合。0(elmoの出力を無視)~100の範囲。

dlshogiから呼び出すelmoの評価関数としてKPPT,NNUEを比較する場合

サーバを2つ立ち上げる必要がある。--portによりポートを変更する設定を加える。エンジン側ではExternal_Eval_Portを設定。

python -m searchblend.searchblend_pool path\to\nnue\YaneuraOu_NNUE_tournament.exe --options Threads:1,EvalHash:16,NodesLimit:1000 --pool 4 --port 10000
python -m searchblend.searchblend_pool path\to\kppt\YaneuraOu_KPPT_tournament.exe --options Threads:1,EvalHash:16,NodesLimit:1000 --pool 4 --port 10001
python -m cshogi.cli path\to\dlshogi_tensorrt.exe path\to\dlshogi_tensorrt.exe --byoyomi 1000 --options1 DNN_Batch_Size:16,Blend_Ratio_Policy:5,External_Eval_Port:10001 --options2 DNN_Batch_Size:16,Blend_Ratio_Policy:5,External_Eval_Port:10000 --games 100 --opening path\to\records2016_10818.sfen

デフォルトではTCP通信はlocalhost内で行われるが、マシンを分けたいときのためにsearchblend_pool側に--hostオプション、dlshogi_tensorrt.ext側にExternal_Eval_Hostオプションあり。ソースコード参照。 AWSの強力なGPUインスタンスだと、CPU側がボトルネックになるという話も聞きます。レイテンシが低いネットワークでCPUのみの別インスタンスに処理を投げればこのコードのままでも使えるかもしれません。

改良アイデア

実装面での改良アイデアを載せておきます。

  • elmoのプロセスを1つにまとめ、置換表を共有する
    • 特にCPUコア数が多い場合、過去の探索結果を再利用してより良い指し手を見つけられる確率が上がると思われます。
  • elmoの探索ノード数の自動調整
    • 現在は1000ノード固定としていますが、CPUの負荷に応じて動的に変動させ、dlshogi側のnpsへの影響を調整することが考えられます。
    • ノード数を変えず、一部の局面をランダムに無視するというようなやり方もありえます。