とりあえず、やねうら王のGitHubのほうにプルリクとissueを頂戴していた件をすべて処理した。ざっと内容を書いておく。
C++11でコンパイルしていたものをC++17でコンパイルするように変更した。
Visual C++ 2019やGCC/Clangが普通にC++17をサポートしているようだったので、C++17用にコードを少し変更した。
alignasをつけている構造体をnewしたときにalignasが無視される(考慮されない)ために、やねうら王ではcustom allocatorを作成して対処していたのだが、C++17ではこれが改善されたらしい。(というか、alignasが導入された時点でそうなっているべきだろとは思うが…)
C++17で導入されたfilesystemを使うようにした
した…のだが、Visual C++ 2019でしか動かないようだ。GCCは9.3でfixされたbugがあるようで、MSYS2でまだGCC 9.3が使えないようなので検証できない。
※ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91786#c2
フォルダに存在するファイルを列挙したいだけなのに、C++ではこの程度のことが何故いまだに満足に出来ないのか理解に苦しむ。(Turbo Pascalとか30年以上前にできてたけどな…。)
nodestimeオプション削除
nodestimeオプションという機能がStockfishにあって、例えばこの値を500と設定すると500knpsのPCと同じ強さになる。(例:1MnpsのPCでこのように設定すると与えられた時間の半分しか使わなくなる)
強さを固定化したくて、かつ、depth制限やnode制限ではなく、一局を通じて自然な持ち時間の使い方をして欲しいときに便利なような気はする。
しかし、将棋では(やねうら王では)、秒読みという機能があったり、NetworkDelayオプションがあったり、MinimumThinkingTimeオプションがあったり、秒のぎりぎりまで思考する(0.3秒で思考が終わっても0.99秒まで思考する)機能があったりで、このへんがとてもややこしい。
例えば、500knpsのPCと同じ強さにするためには、NetworkDelayオプションで指定した時間も同様にnodestimeの影響を受けるべきなのだが、そうするとfloodgateなどに参戦させたときにタイムアップになりかねない。だから、NetworkDelayオプションの値はnodestimeの影響を受けるようにすべきではないのだが、しかしそうすると、500knpsのPCと同じ強さになって欲しくて500と指定しているのに、500knpsのPCの場合より早くに思考を打ち切っていることになったりして、このオプション本来の意義が失われてしまうように思う。
また、将棋ソフトでは(チェスのソフトと異なり)、終盤にnpsが顕著に下がるので、nodestimeのようにnps固定の状態をシミュレートできても…みたいな気持ちもある。
とりあえず、このオプションを将棋ソフトで導入すると時間制御まわりがとても複雑になって余計なバグを生みそうなので無効化しておく。
BookOnTheFlyで定跡にhitしないことがあった件
issueで報告をいただいていたのだが、対応が遅くなった。普通にバグっていたので修正した。
isreadyのあと、keepalive代わりに改行を5秒ごとに送信していたのをやめる
先日、こちらの記事で書いた通り。
新しく追加されたperftコマンドが香の不成など生成していなかった
perftというのは指定した局面から全合法手でN手進めたときに局面数がどれだけあるかを計測するためのテストコマンドである。やねうら王のほうにも初期のころから存在していたのだが、昨年Stockfishのほうで実装されたので、そのコードに倣って書き直した。このときに、香の不成を生成するほうの指し手生成を呼び出していなかった。たぶん、ほとんどの人はこのコマンドが実装されていたこと自体知らないと思うので、特に影響はないと思うが…。
まとめ
とりあえず、既知のバグ関連はこれで全部なおったと思うので、しばらくやねうら王本体の更新はお休みである。次はMyShogi(将棋神やねうら王)のupdate作業を行う。
何か他にバグがあれば、この記事のコメント欄か、やねうら王のGitHubのissueにでも報告いただければ、なる早で対応します(`・ω・´)b
ヨビノリの将棋の局間計算の動画みられましたか?
コラボ行けそうじゃないですか〜笑
期待してます
この動画のことですかね。
https://www.youtube.com/watch?v=7QcpShRfqGA
まあ、コラボは、機会があれば(`・ω・´)v
ラズベリーパイでクラスタをしてLinux上で
YaneuraOu2018NNUE_learn
を使いたいのですが可能でしょうか。
クラスタをするのは、並列処理をさせるためです。
クラスタ化したいのは
1. 教師生成
2. 教師局面からの学習部
3. 通常探索
のいずれでしょうか?それによって話が変わってくるような…。
通常探索と定跡生成です
振り飛車の定跡ファイルを個人で作っているのですが、
depthを30以上にするとかなり時間がかかってしまって…
AWSが良いのは分かっているのですが、そこまで使えるお金がないのでクラスタを組もうと考えました
定跡生成のほうは、やねうら王の”makebook think”コマンドでは、分割数を指定できるので、それぞれのPCでそれを適切に指定してやればいいような…。
通常探索のほうのクラスター化は、やねうら王のほうが対応してないので、Ayaneとか使って、MultiPonder対応とかにするのがよろしいような…。
質問に答えてくださりありがとうございます
ラズベリーパイだとAyaneが使えるというのは初耳でした
クラスタかpcの増産か改めて考えてみます
ラズパイ×256個とかで教師生成するのは面白い試みだと思うのですけど、コスパで言うと、いまでしたらRyzen Threadripper 3990Xを採用したほうがいい気がします。しかしラズパイのほうは、前の世代の性能の200%増しみたいな感じで1世代ごとに急激に進化するので、次の世代ですと関係が逆転してもおかしくはないと思います。