やねうら王 V4.89公開しました

やねうら王 V4.89の実行ファイル一式を公開しました。
KPPT/KPP_KKPT/NNUE/KOMA(駒得評価関数)/tanuki-詰将棋エンジンの各CPU版の詰め合わせです。

https://github.com/yaneurao/YaneuraOu/releases/tag/V4.89

一つ前のバージョンである V4.88の公開が昨年の6月26日なので、久々の更新です。

直前でかなり大きなリファクタリングを行ったので、何か盛大にバグっているかもです。

何かありましたらこの記事のコメント欄にでもコメントください。

81 thoughts on “やねうら王 V4.89公開しました

  1. 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; // 次回のために評価値を保存
            みたいな感じ。

  2. 将棋神やねうら王2の発売がここまでずれ込んでしまったのなら
    WCSC29版のやねうら王のEVALを公開するか将棋神やねうら王の
    グレードアップ版に搭載してもいいのでは?

    • いまの状況ですとWCSC30が開催されないパターンもありえまして、その場合、WCSC29優勝という謳い文句がパッケージ版のセールス的に有効かなと…。

  3. すみません、last_eval_value[us] = bestThread->rootMoves[0].score; // 次回のために評価値を保存
    の[us]の所には何を入れればよいのでしょうか?
    未熟者ですみません、、、

    • usはそこで変数としてすでにありませんか?
      > auto us = rootPos.side_to_move();
      です。現局面の手番側が入っています。

      検討モードでは、同じ手番側で連続して思考するとは限らないので、先手用と後手用とで評価値の格納する場所を変えるためにlast_eval_value[2]という配列があると想定しました。そのへんの事情を気にしないなら、配列にする必要はなく、単にlast_eval_value = …のようにすればよろしいかと..。

  4. バグ(今回は私のやり方が悪いのかもしれません)の報告です。
    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つの候補手しか出力されていませんでした。

  5. やねうら王の定跡の読み込み時に行われている
    parseって、どのような情報取得しているのですか?

    • Book::read_book()のほうはファイルから普通に読み込んで、連想配列(map)に、sfen文字列をkeyとして、その局面の定跡の指し手を格納してるだけですよ?

      • なるほどです。
        因みに、makebook mergeでどのようにして、あれほど速くsame nodes,different nodesの判別、カウントをしているのですか?
        一局面ずつ愚直に判定していく方法だと相当な時間がかかるので、不思議で不思議でたまりません…

        • sfen文字列をmapに突っ込んで判定しているだけです…。mapはO(log N)…あ。格納に、unordered_map使ってましたっけ…。であればO(1)です。あれくらいの速度で当然というか、何というか。

          • なるほど。私はc++初心者で、連想配列というとてもとても便利そうなもの
            (一つ前のやねさんの回答にありましたが、今試しにググってみると処理速度が千倍とか書いてあってびっくりしてます…)を全く知らなかったです。
            お陰で助かりました( ・ω・) ㌧

  6. ごめんなさい、私の開発環境が、
    VScode + MinGWのgcc++で、(私がgcc++をマスターしていないのもあり、)やねうら王のような大規模プロジェクトのビルドを簡単に一発で出来るような環境でないので、ビルドしてreleaseしていただくか、
    もしくは、メアド教えて頂ければ、ファイル等送ります。
    大会当日なのに申し訳ありません…。

      • 申し訳ありませんが、もう2,3日お待ち頂ければ幸いです。
        (ファイルの準備やらなんやらが大変面倒で、中々やる気が起こらないものでして….)

          • 遅れて申し訳ありません。
            Mizarさんが20200505版をビルドされていたので、そちらをダウンロードして試してみましたが、結果は、依然として、sfenに反映されていない候補手が多数あり、前回のやねうら王から変化はありませんでした。

          • 私のやり方がまずかったかもしれないので、意識はっきりとしている明日の午前中にもう一度試してみます。

          • 送信しました。もしファイル等に異常があればお知らせください。

          • いただいたファイル、root(平手の初期局面)から辿れないのでその局面が無視されてるだけのようです..。(´ω`)

    • やねうら王、本体では対応していないです。やねうら王が用いているUSIプロトコル自体にそういう仕様はなくて…。皆さん(Qhapaqとか、たぬきチーム、白ビールチームとか)は、やねうら王とGUI側との間に仲介するソフト(デザパタで言うところのproxy)を開発して、対応されているようです。

  7. やねうら王(最新のソースコード)を、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

    というエラーが発生します。理由はなんでしょうか?またどうすればビルドが通りますでしょうか?

    • テラショック手法で定跡ファイルを書き出したり延長したりするときに、入力となる定跡ファイルに、例えば、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

            を教えていただければ調べてみますけども。

  8. 初心者です。やねうら王489の探索部は一番下のNNUE_tournamentとNNUE_avx2どちらが強いですか?

  9. 遅れました。

    〇延長時に使用したコマンドは、
    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形式での「局面」は書きません。(手動ですると間違える可能性が高いので。)

    • メールで送っていただいた定跡ファイルに対して、そのコマンドを発行して、一部の局面が延長されないということで合ってますかね?

          • バグ自体の再現は出来ましたでしょうか?
            (音沙汰がなくて不安なのでこちらから聞かせて頂きます。もしかしたらgamilに送ってくださってるかもですが、gamilあまり使わないので念の為…..)

          • TextFileReaderクラスがバグっていたので修正しました。定跡の読み込みに影響しますが、これが原因の可能性はありますか?GitHubから最新のソースコードをダウンロードしてビルドして試してみていただけますでしょうか。(これでうまくいくなら、V4.90にバージョンナンバーを上げる予定です)

  10. 突然なのですが、ニューラルネットワークの行列計算の高速化って、具体的にどうやってますか?
    ex>
    OpenMP使ってる!、連想配列(私あまり連想配列分かってないので、連想配列なんて使えねぇーよ!なんて言わないで下さい…。)使ってる!、実はこんな裏技があって!、
    等々、出来るだけたくさん書いて頂ければ幸いです。

    • NNUEは学習時の行列計算はOpenBlasで並列化してたような…。普通の対局時は、普通にAVX256の命令で計算してるだけですよ。重みが1バイトなので1命令で32箇所ずつ計算できて、わりと速いような…。あとは、1層目だけ差分計算してますね。これは、NNUEの論文のほうをご確認を。

  11. ごめんなさい、色々試してみたのですが、何故かmingw32-makeがやねうら王に上手く通らないので、ビルド済み実行ファイルを添付して頂ければこちらで試せますがどうでしょうか?

      • 身分明かすのは腰が引けるのであまり言いたくないですが、私は高校生で、管理者権限のあるPCが親に没収されてはや3年となり、今は学校が支給した管理者権限の無いPCを使っています。なので、Visual Studio Code + MinGW32という環境以外でc/c++の開発を行えない状況です。
        そして、mingw32-makeがやねうら王に通らないので、私にはやねうら王をビルドする手立てがないのです….。
        申し訳ありません…。

  12. 定跡読み込み部のバグについて詳しい事が分かったので再度報告させて頂きます。


    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でも発生しているバグです。)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です