今回の研究用に開発したコードの動かし方と、改良のアイデアを掲載します。私が所持していない、より強力なハードウェアで検証・強化したいという方がもしいらっしゃれば参考にしてください。
記事一覧
- DNNの方策に従来型エンジンのbestmoveをブレンドする【コンピュータ将棋】 - select766’s diary
- DNNの読み抜け例を観察する【コンピュータ将棋】 - select766’s diary
- DNNの方策に従来型エンジンのbestmoveをブレンドする 実装編 part01【コンピュータ将棋】 - select766’s diary
- DNNの方策に従来型エンジンのbestmoveをブレンドする 実装編 part02【コンピュータ将棋】 - select766’s diary
- DNNの方策に従来型エンジンのbestmoveをブレンドする 実装編 part03(終)【コンピュータ将棋】 - select766’s diary
- この記事
コード・環境構築
コード・バイナリ(Windows)はこちらです。python製のツールもあるため、バイナリだけでなくコードも必要になります。 Release DNNの方策に従来型エンジンのbestmoveをブレンドする実験コード · select766/DeepLearningShogi · GitHub
環境構築
- CUDA, TensorRT。Release 世界将棋AI 電竜戦バージョン(「GCT電竜」同梱) · TadaoYamaoka/DeepLearningShogi · GitHubが動作する環境と同じですので、まずこれが動作するようにしてください。
- python 3.5以上
- cshogi 0.0.9以上
- GCT評価関数をRelease 世界将棋AI 電竜戦バージョン(「GCT電竜」同梱) · TadaoYamaoka/DeepLearningShogi · GitHubから入手し、実行バイナリと同じディレクトリに配置。(
model-0000167.onnx
をmodel.onnx
にリネーム) - elmo 【公式】コンピュータ将棋ソフト「elmo」導入方法
- elmoである必然性はなく、USI対応の将棋エンジンであれば他のものも使用可能です。
- 互角局面集(自動対局で強さを測定する場合のみ)
- 自己対局用に互角の局面集を公開しました | やねうら王 公式サイトから
records2016_10818.sfen
を入手してください。
- 自己対局用に互角の局面集を公開しました | やねうら王 公式サイトから
実行方法
コマンドプロンプトを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への影響を調整することが考えられます。
- ノード数を変えず、一部の局面をランダムに無視するというようなやり方もありえます。