やねうら王 V4.89の実行ファイル一式を公開しました。
KPPT/KPP_KKPT/NNUE/KOMA(駒得評価関数)/tanuki-詰将棋エンジンの各CPU版の詰め合わせです。
https://github.com/yaneurao/YaneuraOu/releases/tag/V4.89
一つ前のバージョンである V4.88の公開が昨年の6月26日なので、久々の更新です。
直前でかなり大きなリファクタリングを行ったので、何か盛大にバグっているかもです。
何かありましたらこの記事のコメント欄にでもコメントください。
V4.89で定跡の読み込みが4倍速なら、次のV4.9ではさぞトンデモナイ魔改造をしてくれる事でしょう(笑)
そろそろ強くなる改造もしたいんですけどね..(´ω`)
質問なのですが、指し手の時間配分はどのようにして決められているのですか?
残り時間と残り手数から、適当に割り振ってます..(´ω`) ソースコードで言うとtimeman.cppですね。
そこ調整しても、相手との相性があったり、ponderがどれくらい決まるのかという問題があったり、戦型で終局までの平均手数が違ったりで、勝率に影響するほどでもないようで…。
WCSC29での白ビール戦のように、こちらに全くponderさせてもらえないと時間足りなくなります。
そうですか、、、
あと、評価値が○○よりも下がった場合にエンジンのパラメーターを変更するのはどうすれば良いですか?
MainThread::search()の先頭あたりで、前回の評価値を見て、
Options[“xxx”] = XXX
みたいにして直に代入したほうが早いような…。
それでMainThread::search()の末尾あたりで、評価値と手番を保存しておくという..。
last_eval_value[us] = bestThread->rootMoves[0].score; // 次回のために評価値を保存
みたいな感じ。
Android版も公開してほしいです(強欲)
Android版、私が動作確認できないので何とも…(T_T)
Mizarさんがやってくれるような、くれないような…。
将棋神やねうら王2の発売がここまでずれ込んでしまったのなら
WCSC29版のやねうら王のEVALを公開するか将棋神やねうら王の
グレードアップ版に搭載してもいいのでは?
いまの状況ですとWCSC30が開催されないパターンもありえまして、その場合、WCSC29優勝という謳い文句がパッケージ版のセールス的に有効かなと…。
すみません、last_eval_value[us] = bestThread->rootMoves[0].score; // 次回のために評価値を保存
の[us]の所には何を入れればよいのでしょうか?
未熟者ですみません、、、
usはそこで変数としてすでにありませんか?
> auto us = rootPos.side_to_move();
です。現局面の手番側が入っています。
検討モードでは、同じ手番側で連続して思考するとは限らないので、先手用と後手用とで評価値の格納する場所を変えるためにlast_eval_value[2]という配列があると想定しました。そのへんの事情を気にしないなら、配列にする必要はなく、単にlast_eval_value = …のようにすればよろしいかと..。
すみません、ファイルを間違えていたようです。
MainThreadのあるファイルは何処でしょうか?
githubを駆使して見つけました。
先頭あたりで
if (last_eval_value[us] >= -1000){
Options[“xxx”] = XXX
} else if (last_eval_value[us] >= 500) {
Options[“xxx”] = XXX
} else {
Options[“xxx”] = XXX
}
として、末尾に
last_eval_value[us] = bestThread->rootMoves[0].score;
とすればよいでしょうか?
はい、そんな感じで良いのでは..。
やねうら王のクロスコンパイルって出来ますか?
(windowsでコンパイルするとhashが設定できない)
なぜhashが設定できないのでしょうか?はてはて。
クロスコンパイルというのは、WindowsでLinux用にコンパイルするということですよね。ググれば記事がたくさん出てきますが、私は専門外なのでよくわかりません
ソースコード見てみますか。
hash無効化するようにしてしまっているかもしれませんし。
これだったのか!!!
http://yaneuraou.yaneu.com/2020/03/09/
苦労するコンパイル
大喜利会場と化したコメント欄
古参のユーザーほど地雷踏みそうですね
時代の流れのついて行けんわい、、、
バグ(今回は私のやり方が悪いのかもしれません)の報告です。
makebook extend_tree book/standard_book.db book/read_sfen.txt book/write_sfen.sfen black_eval_limit -9999 white_eval_limit -9999
というコマンドで、book/standard_book.dbに登録されている全ての手を延長しようとしたのですが、所々、
write_sfen.sfenに出力されていない手があります。
分かりづらい例しかないのですが、
sfen lnsgkgsnl/5r1b1/pppppp1pp/6p2/9/2P6/PP1PPPPPP/1BG4R1/LNS1KGSNL b – 5
2g2f 6a7b 175 24 488
9g9f 6a7b 175 24 488
3i4h 6a7b 169 24 488
この局面では上記のように、2g2f,9g9f,3i4hの3つの候補手があるのですが、
write_sfen.sfen内には、
startpos moves 7g7f 3c3d 6i7h 8b4b 9g9f 4c4d
startpos moves 7g7f 3c3d 6i7h 8b4b 9g9f 2b8h+
startpos moves 7g7f 3c3d 6i7h 8b4b 9g9f 5a6b
startpos moves 7g7f 3c3d 6i7h 8b4b 9g9f 6a7b
startpos moves 7g7f 3c3d 6i7h 8b4b 3i4h 9c9d
startpos moves 7g7f 3c3d 6i7h 8b4b 3i4h 4a5b
startpos moves 7g7f 3c3d 6i7h 8b4b 3i4h 5a6b
startpos moves 7g7f 3c3d 6i7h 8b4b 3i4h 6a6b
9g9f,3i4hの2つの候補手しか出力されていませんでした。
後ほど調べてみます..1,2日お待ちを..
了解です。お待ちしてます(≧▽≦)
こちらに書き忘れてました。先日、ファイル読み込み周りを修正してcommitしたんですけど、それでなおってますか?
なおってなければ、現象が再現できるファイルと手順を書いて、メールくださいです…。
やねうら王の定跡の読み込み時に行われている
parseって、どのような情報取得しているのですか?
Book::read_book()のほうはファイルから普通に読み込んで、連想配列(map)に、sfen文字列をkeyとして、その局面の定跡の指し手を格納してるだけですよ?
なるほどです。
因みに、makebook mergeでどのようにして、あれほど速くsame nodes,different nodesの判別、カウントをしているのですか?
一局面ずつ愚直に判定していく方法だと相当な時間がかかるので、不思議で不思議でたまりません…
sfen文字列をmapに突っ込んで判定しているだけです…。mapはO(log N)…あ。格納に、unordered_map使ってましたっけ…。であればO(1)です。あれくらいの速度で当然というか、何というか。
なるほど。私はc++初心者で、連想配列というとてもとても便利そうなもの
(一つ前のやねさんの回答にありましたが、今試しにググってみると処理速度が千倍とか書いてあってびっくりしてます…)を全く知らなかったです。
お陰で助かりました( ・ω・) ㌧
はい(`・ω・´)b
【訂正】処理速度、「1000倍」ではなく、「場合によっては100倍」でした。
ごめんなさい、私の開発環境が、
VScode + MinGWのgcc++で、(私がgcc++をマスターしていないのもあり、)やねうら王のような大規模プロジェクトのビルドを簡単に一発で出来るような環境でないので、ビルドしてreleaseしていただくか、
もしくは、メアド教えて頂ければ、ファイル等送ります。
大会当日なのに申し訳ありません…。
おお、承知しました。yaneurao@gmail.comまで送ってくだされ。
申し訳ありませんが、もう2,3日お待ち頂ければ幸いです。
(ファイルの準備やらなんやらが大変面倒で、中々やる気が起こらないものでして….)
(`・ω・´)ゞ はい
遅れて申し訳ありません。
Mizarさんが20200505版をビルドされていたので、そちらをダウンロードして試してみましたが、結果は、依然として、sfenに反映されていない候補手が多数あり、前回のやねうら王から変化はありませんでした。
状況が再現できるファイル添付して、再現手順を書いて、私にメール(yaneurao@gmail.com)くだされ。
私のやり方がまずかったかもしれないので、意識はっきりとしている明日の午前中にもう一度試してみます。
送信しました。もしファイル等に異常があればお知らせください。
いただいたファイル、root(平手の初期局面)から辿れないのでその局面が無視されてるだけのようです..。(´ω`)
すみません、やねうら王ってmulti ponder対応していますでしょうか?
やねうら王、本体では対応していないです。やねうら王が用いているUSIプロトコル自体にそういう仕様はなくて…。皆さん(Qhapaqとか、たぬきチーム、白ビールチームとか)は、やねうら王とGUI側との間に仲介するソフト(デザパタで言うところのproxy)を開発して、対応されているようです。
やねうら王(最新のソースコード)を、mingw32-makeでビルドしようと、
>>cd C:\YaneuraOu-master\YaneuraOu-master\source
>>mingw32-make normal
とすると、
E:/MinGW/bin/mingw32-make CFLAGS=’-std=c++17 -fno-exceptions -fno-rtti -Wextra -Ofast -MMD -MP -fpermissive -DNDEBUG -stdlib=libstdc++ -Wno-unused-parameter -fno-threadsafe-statics -DUNICODE -DNO_EXCEPTIONS -DUSE_SSE42 -msse4.2 -march=corei7 -DUSE_MAKEFILE -DYANEURAOU_ENGINE_NNUE’ LDFLAGS=’ -static -Wl,–stack,25000000 -Wl,-s -lpthread -v -flto’ YaneuraOu-by-gcc.exe
mingw32-make[1]: Entering directory ‘C:/YaneuraOu-master/YaneuraOu-master/source’
‘[‘ は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
コマンドの構文が誤っています。
Makefile:319: recipe for target ‘../obj/main.o’ failed
mingw32-make[1]: *** [../obj/main.o] Error 1
mingw32-make[1]: Leaving directory ‘C:/YaneuraOu-master/YaneuraOu-master/source’
Makefile:331: recipe for target ‘normal’ failed
mingw32-make: *** [normal] Error 2
コマンドの構文が誤っています。
Makefile:319: recipe for target ‘../obj/main.o’ failed
mingw32-make[1]: *** [../obj/main.o] Error 1
mingw32-make[1]: Leaving directory ‘C:/YaneuraOu-master/YaneuraOu-master/source’
Makefile:331: recipe for target ‘normal’ failed
mingw32-make: *** [normal] Error 2
というエラーが発生します。理由はなんでしょうか?またどうすればビルドが通りますでしょうか?
ビルド手順は解説.txtのをコピペしてくだされ…。
「平手の初期局面からたどれない」とはどういう事でしょうか???
テラショック手法で定跡ファイルを書き出したり延長したりするときに、入力となる定跡ファイルに、例えば、76歩34歩26歩とした局面があるならば、
1. 初期局面
2. 初期局面から76歩とした局面
3. 初期局面から76歩34歩とした局面
の3つの局面が入力となる定跡ファイル上に存在しないといけないということです。
お渡ししたファイルにそのような局面ありましたかね?
初期局面のみを登録してある定跡ファイルを作る。
↓
extend_treeでsfenに書き出す
↓
書き出したsfenをもとに2手目を掘る
↓
extend_treeでsfenに書き出す
↓
書き出したsfenをもとに3手目を掘る
を繰り返して作成した定跡なので、そんな事は起こらないはずなのですが….
(ごめんさい、やね師匠が間違ってるのだ!みたいな文章になってしまいました…)
いただいたファイル、初期局面が存在しないかと思ったら、確かに存在してました。(私の勘違いでした。申し訳ありません。)
このいただいたファイルのうち、
1. extend_treeで書き出されない局面
について教えていただけますでしょうか。ついでに可能であれば、
2. その局面へ至る手順の局面がそれぞれ書き出されているか確認していただけますでしょうか。
たぶん、何かの条件により枝刈りされている気はしなくもないです。
バグってるなら自分でやっちゃえって事で、2,3回手動でsfen書いて延長しているので、オリジナルでバグってた局面を探すのは少々厳しいかもしれませんが、手動でやった感じだと、2g2f,7g7f,9g9f,1c1d,9c9d,3c3d系の手が多いという印象はありました。
この現象は、おそらく、先手を居飛車のソフト、後手を振り飛車のソフト、にして、先ほどの方法で約5,6手程作っていけば、再現可能だと思います。
協力しきれず申し訳ありません…。
それたぶん、”makebook extend_tree”で延長するときにオプション指定か何かが抜けてる気がしますね…。
1. 延長する前の定跡dbファイル
2. 延長するときに用いたコマンド
3. 延長後に列挙されていない局面のsfen
を教えていただければ調べてみますけども。
初心者です。やねうら王489の探索部は一番下のNNUE_tournamentとNNUE_avx2どちらが強いですか?
NNUE_tournamentのほうがトーナメント出場用で、少し速く、それゆえ少し強いです。
遅れました。
〇延長時に使用したコマンドは、
YaneuraOu_NNUE_learn_sse42.exe hash 1024 , Threads 4 , bookfile no_book , makebook extend_tree user_book2.db book/read_sfen.txt book/write_sfen.sfen black_eval_limit -99999 white_eval_limit -99999 , quit
で、
〇延長されず、1,2回手動で延長した上で、延長されてなかった局面(本来はこの局面の1,2手前ですでに延長されてないと思われる局面)ですが、
7g7f 3a4b 2g2f 4a3b 6i7h 9c9d
7g7f 3a4b 2g2f 4a3b 6i7h 3c3d
の局面が延長されてませんでした。(手動で延長する前はもっとたくさんありました。)
逆に延長されていたのは、
7g7f 3a4b 2g2f 4a3b 6i7h 8c8d
7g7f 3a4b 2g2f 4a3b 6i7h 5c5d
7g7f 3a4b 2g2f 4a3b 6i7h 8b5b
です。
sfen形式での「局面」は書きません。(手動ですると間違える可能性が高いので。)
メールで送っていただいた定跡ファイルに対して、そのコマンドを発行して、一部の局面が延長されないということで合ってますかね?
はい。合ってます。
承知しました。いま取り込み中なので、週末までに調査しますです(`・ω・´)b
分かりました。
お待ちしております。( ´艸`)
バグ自体の再現は出来ましたでしょうか?
(音沙汰がなくて不安なのでこちらから聞かせて頂きます。もしかしたらgamilに送ってくださってるかもですが、gamilあまり使わないので念の為…..)
ちょっと時間とれてないので、もう少しお待ちを…(´ω`)人
TextFileReaderクラスがバグっていたので修正しました。定跡の読み込みに影響しますが、これが原因の可能性はありますか?GitHubから最新のソースコードをダウンロードしてビルドして試してみていただけますでしょうか。(これでうまくいくなら、V4.90にバージョンナンバーを上げる予定です)
わかりましたです( ´艸`)
突然なのですが、ニューラルネットワークの行列計算の高速化って、具体的にどうやってますか?
ex>
OpenMP使ってる!、連想配列(私あまり連想配列分かってないので、連想配列なんて使えねぇーよ!なんて言わないで下さい…。)使ってる!、実はこんな裏技があって!、
等々、出来るだけたくさん書いて頂ければ幸いです。
NNUEは学習時の行列計算はOpenBlasで並列化してたような…。普通の対局時は、普通にAVX256の命令で計算してるだけですよ。重みが1バイトなので1命令で32箇所ずつ計算できて、わりと速いような…。あとは、1層目だけ差分計算してますね。これは、NNUEの論文のほうをご確認を。
わかりました。ありがとうございます!
ごめんなさい、色々試してみたのですが、何故かmingw32-makeがやねうら王に上手く通らないので、ビルド済み実行ファイルを添付して頂ければこちらで試せますがどうでしょうか?
Visual Studioで一発ビルドできますけども。それでは駄目ですか?
身分明かすのは腰が引けるのであまり言いたくないですが、私は高校生で、管理者権限のあるPCが親に没収されてはや3年となり、今は学校が支給した管理者権限の無いPCを使っています。なので、Visual Studio Code + MinGW32という環境以外でc/c++の開発を行えない状況です。
そして、mingw32-makeがやねうら王に通らないので、私にはやねうら王をビルドする手立てがないのです….。
申し訳ありません…。
失礼します。
スペックがあるなら仮想環境をどうにか作って、回避してみてはどうでしょうか?
Hyper-V的な奴ですよね?それも管理者権限が必要で無理でした…..。
他に何か方法をご存じであれば教えて頂けると幸いです。
おお、そうですか。NNUEの最新バイナリ一式、用意しました。(なお、このリンクは48時間で手動的に消滅するです..)
https://drive.google.com/open?id=1JQKSO0VlSWccHCl9LqWLBUJXKA1eq9dv
ごめんさい、これ恐らくまだバグってます。バグが直れば、やね師匠にもお渡しした定跡では、makebook thinkをすると、7手目で思考が始まるはずですが、最新版でも7手目で思考は始まりませんでした…..。
了解しました(`・ω・´)ゞ もうちょい、調査します。
定跡読み込み部のバグについて詳しい事が分かったので再度報告させて頂きます。
①
YaneuraOu_NNUE_learn_sse42.exe USI_hash 1536 , Threads 4 , bookfile no_book , MultiPv 5 , makebook think G0.sfen standard_book.db startmoves 11 moves 11 depth 24 , quit
と書いてある.batを実行し、最後まで定跡を掘ります。
②
再度同じ.batファイルを実行すると私の定跡の場合、total nodes 4(本来0で無ければならない)と出力される。
③
その登録されていないことになっている4ノードは
下記の通りである。(一部ログを抜粋)
parse………………………done.
total 4 nodes
info string Hash Clear begin , Hash size = 1536[MB]
info string Hash Clear done.
[1/4:1] Wed Jun 17 08:30:02 2020 : lnsgk1snl/1r4g2/p2ppp1pp/1pp3p2/9/2P4P1/PP+bPPPP1P/2S2S1R1/LN1GKG1NL b b 11
[2/4:3] Wed Jun 17 08:30:05 2020 : lnsgk1snl/1r4g2/p1pppp1pp/6p2/1p7/2P4P1/PP+bPPPP1P/2S2S1R1/LN1GKG1NL b b 11
[3/4:0] Wed Jun 17 08:30:05 2020 : lnsgk1snl/1r4g2/p1pppp1pp/6p2/1p7/2P4P1/PP+bPPPP1P/1S3S1R1/LN1GKG1NL b b 11
[4/4:2] Wed Jun 17 08:31:13 2020 : lnsgk2nl/1r3sg2/p1pppp1pp/1p4p2/9/2P3P2/PP+bPPP1PP/2S2S1R1/LN1GKG1NL b b 11
だが①の時点で出来た定跡ファイルを見てみるとこの4つの局面は既に登録が済んでいる。
というバグです。前回の報告時より原因に近い場所でのバグだと思います。調査して頂ければ幸いです。
もし仰っていただければ定跡ファイルはお渡しします。確実に再現できると思われます。どうか宜しくお願い致します。
(※これはV4.91でも発生しているバグです。)
ご報告、ありがとうございます。そのファイル、いただけますでしょうか。私のほうで同じ条件でやってみますので。
了解です。
今の進捗状況を伺いたいのですが宜しいでしょうか?
遅くなっていてすみません。このあと調べる予定でございます。
今どんな感じでしょうか?