SSブログ

gpsfishをstockfish 2.2ベースにしてみた [将棋]

<注意> ろくに検証もしないで書いているので間違ってる可能性のほうが高いです
githubで公開したので少し追記しました
githubにwiki作れるのでそっちにも書いておきます。
早速対局できないバグが見つかりました。検証は検討だけでやっていたので(言い訳)

gpsfishのベースとなったstockfishは2.1であるようだが
stockfishは2.1 -> 2.2 -> 2.3 -> 3.0 -> 4.0とバージョンアップしている

その中で結構バグフィックスも多いので、gpsfishの長時間動作時のクラッシュバグも直るのではないかと思いたち、がんばってマージしてみた。

■用意するもの
stockfish
https://github.com/mcostalba/Stockfish
リポジトリ
https://github.com/mcostalba/Stockfish.git

gpsfish
http://gps.tanaka.ecc.u-tokyo.ac.jp/cgi-bin/viewvc.cgi/branches/gpsfish_dev/?root=gpsfish
tar ball
http://gps.tanaka.ecc.u-tokyo.ac.jp/cgi-bin/viewvc.cgi/branches/gpsfish_dev/?root=gpsfish&view=tar

osl
http://gps.tanaka.ecc.u-tokyo.ac.jp/cgi-bin/viewvc.cgi/trunk/osl/

■準備
git clone https://github.com/mcostalba/Stockfish.git
cd Stockfish
git checkout sf_2.1
git branch gpsfish
cp ../gpsfish_dev/src/* src/
git add src/*
git commit -m "gpsfish"

■マージ

一気に試しにやって見る場合は、

git merge master

とかやってみるとわかるが、3年分のマージを一気にやろうとしてもイミフ過ぎてまったくマージできない。
特にファイルが消えていたするので今の実装とマッチするのかも不明。

ということで、1個ずつコミットの方針を確認しながらやった
「変更したけど意味がなかったので元に戻しました」みたいなコミットが少なからずあり切れそうになったが。

・2.1 -> 2.2の個数は300個程度
 途中、マラソンみたいな気分になり、マージミスしている可能性もある。実際評価値がめちゃくちゃになったときがあった。
・マージしやすくするためにコードをいろいろいじった
・2.2 -> 2.2.2は30個ぐらいだったのでマージした

■結果

GPLだから公開していいものかと思ってたが、まさかのmtmtさんからの本家にTweetが流れて森脇さんからリクエストが来たのでプッシュした。

https://github.com/woodyring/Stockfish/tree/gpsfish

github初fork/pushなので何か間違ってるかもしれず
パッチに直そうかと思ったが気力が続かないと思ったのでそのままあげた

■マージの方針とか

本当はgithubのほうに書きたいが、どうやって書いていいかわからないのでこっちに書く

・マージしにくいコードは消去した
 特にsearch.cppにあった関数オブジェクト(HAVE_LAMBDAじゃないほう)を消去
 逆にdo/undoはGPSFISHマクロで無効化しつつも、場所は変えなかった
・逆にマージしやすく成るコードは非効率なの前提で復活した
 CheckInfo構造体とかis_draw<bool>()とかis_chess960とか。O3最適化で消えてくれることを期待。
・ベタ書きしていたネットワークやメモリ取得はマージしやすくするため関数化
・USI engine名
 USI engineの部分を改変してあるが、これもマージのため。著作者のほうは変えていない。
・bookなどのまるごと乗っ取るようなコードは別ファイルに出した
 position.tccみたいな意味あい
・ignore_moveは更新していない
 変数が古いので有効化するとビルドが通らないと思うが、多分コピペ元のコードを持ってくれば動くとは思う
・ラムダ式の中のPVなどのconst定義
 正直よくわからないが、多分ラムダ式の中のラムダ式でテンプレート解決ができなかったと勝手に解釈して同じものを定義したらビルドできたのでそのまま。ちゃんと動いているようなので問題なさそう。
・マージできることを中心にやってたので、ビルドに必要なCMakelist.txtは入れ忘れた。
 なんかのタイミングで追加するかもしれないが、今はGPSFISHのものを使ってください
・GPSFISHに入っていた5秒でのinfoアウトプットはMultiPV時に不具合があった時期があったので、無効化
・意味もわからず大きくした数字
 MAX_MOVE 593 -> 1024
 CreateThreadのスタックサイズ 4MB -> 16MB

■感想

・NPSが50万ぐらいがMAXになってしまった。
 中身を理解しないでマージしているのでどっかミスってる気もする  GPS特有の王手確認処理の場所が怪しい。というか元々入ってる王手確認処理じゃだめなんだろうか。  あとはNPSのカウント方法が今までが間違っていた可能性もある。  15秒で17手ぐらいは読めてるので、速度的にはあまり変わってない気もする。
 多分静止探索のときにCore i7 4770 4スレッドで50万ぐらい。深くなって並列度が増すと65万ぐらいが普通のようだ。
 2.1ベースのオリジナルでも同じぐらいだった
 第3回電王戦第2局の後手6四歩のところで、45秒ぐらい読んだ段階だと
 配布バージョン    52万
 64bit/O3最適化/AVX 56万
 +2.2.2化       62万

・スレッドに起因するクラッシュが無くなった
 前は長時間読みやろうとしても数分で落ちていたが、落ちなくなった
 バグ修正の中にスレッド管理も入っていたのでそのせいだろう。
 2.1~2.1の終盤の修正から落ちなくなった気がする
 やった甲斐があった。
 と思ったが、mingwでビルドしてWindowsで動作確認しているので、クラッシュの原因が何かはちゃんと調べていない。リリースビルドで動かしているし。なので、本当にスレッドが原因で直ったかどうかは不明。CreateThreadの引数でスタックサイズを16MBぐらいにしたのも効いてるかもしれない。
 120分連続実行できたので、かなり安定度は増している気はする。

・王手表示で「-mate」とか出るようになった
 これも謎

・MultiPV時の出力がまともになった
 マージしている途中で指し手と評価値がめちゃくちゃになった時期があり投げ出したくなったが、本家も動きがおかしかった模様で、その後のパッチで修正が入り安定した
 またMultiPV時にどれか1つでも更新されると表示が更新されるので、数字がガンガン増えたり減ったり、最善手が入れ替わるところがわかって見てて楽しい
 その代わり15秒以下ぐらいでは表示が多すぎてそれで重くなるので少し出力は減らしたほうがよさそう。
 あと前にも書いたが、出力する順番が1->4の順番なので、将棋所で棋譜解析時にMultiPVが有効だと最後の悪い手で棋譜解析してしまう。出力を入れ替えるパッチも作ったりしたが、マージが面倒なので消した。

■マージしてて気になったところ

・指し手生成と探索が最適化されていない
 OSL由来のものとチェス用の部分の接合部分で準備が多いので、結構無駄な処理が多いのではないかと思うのだが。
 stockfishの場合、状況に応じた指し手を生成するが、gpsfishでは合法手以外も全部指し手生成してしまってから探索をやるので、stockfish本来の探索には遠いのではないか。
・将棋由来のReductionが無い
・pinによるReductionがない
 こういうのもそう

Bonanzaのほうが理論的なカットおよび将棋由来のカットも入っていた気がするので、stockfishのほうがより一般的な木における削減しか入っていないと思われる。
なので、理論的にNull Move PruningとFutirity PuruningがわかってればStockfish由来でなくてもいいのではと思ったりする。

それでも現状の将棋ソフトではstockfish使うとよいというのは
理論的にそれらの探索を実装するのが、思ったよりも難しいというのもあるんだろうか。
ちゃんと理解して実装するよりもパクったほうが時間がかからない。
あと木の話だけではなくzobrist hashによる評価の回数を減らすのがセットになって効いているのが一番大きいのではないか。

長時間読みができるようになってひとまず安心した
nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。