棋桜 (KIOU) で使われている NNUE 評価関数と、それを読み込めるやねうら王エンジンを配布するリポジトリ。
このリポジトリは、
- 棋桜 (KIOU) のアプリ内で使われている NNUE 評価関数を取り出すブラウザツールと、
- その評価関数を読み込める、対応ビルドのやねうら王将棋エンジンへの案内
を提供します。将棋所 / ShogiGUI / ShogiHome などの USI 対応 GUI から、棋桜と同じ評価関数で検討できるようになります。
棋桜 (KIOU) は株式会社ネコノメによるオンライン将棋対戦アプリです (App Store)。 アプリには rshogi-nnue (Rust 実装のやねうら王系 NNUE エンジン) が内蔵されています。
その評価関数はやねうら王と同じ NNUE シリアライズ形式ですが、ネットワーク構成が本家標準の halfkp_256x2-32-32 ではなく
halfkp_128x2-32-32 のため、一般に配布されているやねうら王ではそのまま読み込めません。
Important
評価関数 (nn.bin) そのものはこのリポジトリでは配布しません。
学習済み重みの権利は株式会社ネコノメに帰属します。利用者は公式の配信 CDN から .bundle を直接ダウンロードし、
手元のブラウザ内で変換してください。変換ツールは完全にクライアントサイドで動作し、ファイルはどこにも送信されません。
取り出した評価関数の再配布はしないでください。
Note
この評価関数が使われるのは、対局後に解析ボタンを押したときの検討処理です。 対局中に表示される形勢グラフはサーバー側で計算されており、そちらが同じ評価関数を使っているとは限りません。 端末内の評価関数で再現できるのは解析結果の側であって、グラフの数値や対局相手の思考ではありません。 詳しくはエンジンについてを参照してください。
評価関数は棋桜の公式アセット配信 CDN から誰でも取得できます。以下を直接ダウンロードしてください (約 19.4 MiB)。
https://t4-asset.neconome-storage.uk/production/asset-3.0/iOS/1cef6109d3ae10e89f6a7c210e2413d5.bundle
curl -O https://t4-asset.neconome-storage.uk/production/asset-3.0/iOS/1cef6109d3ae10e89f6a7c210e2413d5.bundleこれは YooAsset の remote_assets__project__game_aiparam_rshogi_nn.bundle に対応するファイルです。
URL が 404 になった場合はアセット URL の調べ方を参照してください。
https://ipa-patch.github.io/KiouAI/ を開き、ページの手順に従ってください。
ダウンロードした .bundle をドラッグ&ドロップするだけで nn.bin が保存されます。
インストールするものはなく、コマンド操作も必要ありません。
処理はすべてブラウザ内で完結します (サーバーへのアップロードはありません)。
docs/ 以下のページを file:// で開いてもそのまま動作します。
Note
配信 CDN は CORS ヘッダ (Access-Control-Allow-Origin) を返さないため、
ツール側から URL を直接 fetch することはできません。ダウンロードは手動でお願いします。
コマンドラインで済ませたい場合は同等の Node スクリプトも用意しています (依存パッケージなし / Node 18 以降)。
node scripts/extract-nn.mjs 1cef6109d3ae10e89f6a7c210e2413d5.bundle -o nn.binhalfkp_128x2-32-32 に対応したやねうら王のビルドが
shielune/YaneuraOu v9.60.0 で配布されています。
このリポジトリではエンジンをビルドしていません。上記リリースの halfkp128 系アセットを使ってください。
| アセット | 対象 |
|---|---|
yaneuraou-windows-halfkp128-v9.60.0.tar.gz |
Windows x64 のネイティブ実行ファイル。AVX512VNNI / AVX512 / AVX2 / SSE42 / ZEN2 / ZEN3 の 6 種類が入っているので、CPU に合うものを選ぶ |
yaneuraou-wasm-pthread-halfkp128-v9.60.0.tar.gz |
ブラウザ向け WASM。SharedArrayBuffer が必要なため、ページを cross-origin isolated で配信する必要がある |
yaneuraou-wasm-node-halfkp128-v9.60.0.tar.gz |
Node.js 18 以降向け WASM |
CPU ターゲットは AVX2 が Haswell 以降の Intel と大半の AMD をカバーします。
古いマシンでは SSE42、Ryzen では ZEN2 / ZEN3 を選んでください。
AVX512* は AVX-512 を実際に備えた CPU でのみ起動します。
いずれも halfkp_128x2-32-32 専用ビルドです。水匠 / elmo など他の評価関数とは互換性がありません。
やねうら王は既定で EvalDir = eval、EvalFile = nn.bin を読みに行きます。
実行ファイルと同じ階層に eval/ を作り、nn.bin を置いてください。
yaneuraou-windows-halfkp128-AVX2.exe
eval/
└── nn.bin
別の場所に置く場合は USI オプションで指定します。
setoption name EvalDir value /path/to/dir
setoption name EvalFile value nn.bin
./yaneuraou-windows-halfkp128-AVX2.exe
usi
isready
position startpos
go depth 12isready に対して readyok が返れば評価関数の読み込みに成功しています。
ハッシュ値や次元数が一致しない場合はここでエラーになって終了します。
参考として、抽出した nn.bin を yaneuraou-wasm-node-halfkp128 v9.60.0 に読ませ、
初期局面を Threads 1 / USI_Hash 64 で探索した結果は以下のとおりです。
info depth 20 seldepth 25 multipv 1 score cp 14 upperbound nodes 429794 nps 859588 hashfull 38 time 500 pv 6i7h 4a3b
bestmove 6i7h ponder 4a3b
将棋所 / ShogiGUI / ShogiHome などにエンジンとして登録します。
eval/nn.bin は実行ファイルからの相対パスで解決されるため、
作業ディレクトリを実行ファイルの場所に設定するか、EvalDir に絶対パスを設定してください。
| 項目 | 値 |
|---|---|
| フォーマット版 | 0x7AF32F16 (やねうら王 / Stockfish 系 NNUE と共通) |
| 入力特徴量 | HalfKP(Friend) - 125,388 次元 |
| 特徴変換後の次元 | 128 × 2 (本家標準は 256 × 2) |
| 隠れ層 | AffineTransform[32<-256] → ClippedReLU[32] → AffineTransform[32<-32] → ClippedReLU[32] → AffineTransform[1<-32] |
| アーキテクチャ名 | halfkp_128x2-32-32 |
| ファイルサイズ | 32,109,309 バイト (約 30.6 MiB) |
| SHA-256 | a81a86090c0604e5f991f0e66df9b7d80469769c7c5214767e0d449daebadfb9 |
FV_SCALE |
16 (やねうら王の既定値と同じ。変更不要) |
先頭 12 バイトがマジック 16 2F F3 7A / ハッシュ / アーキテクチャ文字列長で、その直後に以下が続きます。
ModelType=Standard;Features=HalfKP(Friend)[125388->128x2],Network=AffineTransform[1<-32](ClippedReLU[32](AffineTransform[32<-32](ClippedReLU[32](AffineTransform[32<-256](InputSlice[256(0:256)])))))
変換結果が正しいかはサイズと SHA-256 で確認できます (asset-3.0 時点の値)。
shasum -a 256 nn.bin.bundle は Unity の UnityFS コンテナ (LZ4HC 圧縮) で、中に nn という名前の TextAsset が 1 つだけ入っています。
暗号化はされていません (YooAsset カタログ上も Encrypted: False)。
変換ツールは以下の手順で nn.bin を取り出します。LZ4 ブロック展開以外に依存はありません。
- UnityFS ヘッダを読む -
UnityFS\0、フォーマット版、Unity バージョン、リビジョン (NUL 終端文字列) に続いてsize:i64/compressedBlocksInfoSize:u32/uncompressedBlocksInfoSize:u32/flags:u32(すべてビッグエンディアン) - フォーマット版が 7 以上なら 16 バイト境界にアライン
- blocksInfo を LZ4 展開する
- 先頭 16 バイトのハッシュを飛ばし、
blockCount:u32に続く(uncompressedSize:u32, compressedSize:u32, flags:u16)をブロック数ぶん読む flags & 0x200(blockInfoNeedPaddingAtStart) なら ここでもう一度 16 バイト境界にアラインする- この 2 段階のアラインが要注意で、片方でも飛ばすと LZ4 展開が壊れます
- 各ブロックを LZ4 展開して連結する (
flags & 0x3fが 2 = LZ4 / 3 = LZ4HC。どちらも同じデコーダで展開できる) - 連結結果から NNUE マジック
16 2F F3 7Aを探し、その 4 バイト手前のリトルエンディアン int32 を長さとして読み、 マジック位置からその長さぶんを切り出す (TextAsset.m_Scriptの長さ前置)
asset-3.0 の実データでは 245 ブロック / 展開後 32,112,192 バイトで、マジックはオフセット 2620、長さ前置は 32,109,309 になります。
棋桜のアップデートでアセットが差し替わると、上記の URL は 404 になります。 配信カタログも公開されているので、そこから現在の URL を引けます。
BASE=https://t4-asset.neconome-storage.uk/production
VER=$(curl -s $BASE/asset-3.0/iOS/Remote.version) # 現在のパッケージバージョン
curl -s $BASE/$VER/iOS/Remote_$VER.json \
| jq -r '.BundleList[] | select(.BundleName|test("rshogi_nn")) | "\(.FileHash).bundle \(.FileSize)"'得られた <FileHash>.bundle を $BASE/$VER/iOS/ の下から取得してください。
カタログには他の思考系アセットも含まれています。NNUE 評価関数は rshogi_nn です (名前が紛らわしいので注意)。
| バンドル名 | 中身 | サイズ |
|---|---|---|
..._aiparam_rshogi_nn |
rshogi-nnue の NNUE 評価関数 (本リポジトリの対象) | 19.4 MiB |
..._aiparam_policy_policy |
量子化済み ONNX のポリシーネットワーク | 10.0 MiB |
..._aiparam_sunfish4_eval |
Sunfish4 の評価関数 | 36.6 MiB |
..._aiparam_sunfish4_book |
Sunfish4 の定跡 | 506 KiB |
..._aiparam_strategies_* |
戦型別のパラメータ (数 KB) | - |
棋桜のアプリ内で nn.bin が使われるのは、対局後に解析ボタンを押したときの検討処理と、
対局中のヒント表示 (ビギナーサポート) です。
一方、対局中の形勢グラフや、CPU 対局 / ランクマッチにおける相手の思考は サーバー側で計算されています (gRPC 経由)。サーバー側が端末内と同じ評価関数を使っているという保証はなく、 別のネットワークやパラメータである可能性があります。
したがって、このリポジトリの手順で再現できるのは解析結果の側であって、 グラフに表示される評価値や対局相手の強さではありません。
やねうら王の探索部に棋桜の評価関数を載せたものであり、 棋桜アプリ内で動いている rshogi-nnue そのものではありません。
| 棋桜の内蔵エンジン (rshogi-nnue) | やねうら王 + この評価関数 | |
|---|---|---|
| 評価関数 | nn.bin (halfkp_128x2-32-32) |
同じファイル |
| 探索部 | Rust 実装の独自探索 | やねうら王 C++ 探索 |
既定 FV_SCALE |
16 | 16 |
評価関数が同じでも探索部が異なるため、同一局面で同じ手を返すとは限りません。 評価値の目安はおおむね揃いますが、読み筋 (PV) は一致しないと考えてください。
本家やねうら王には halfkp_128x2-32-32 のエディションが用意されていません。
shielune/YaneuraOu はこの構成を追加したフォークで、
配布されているバイナリはそこからビルドされたものです。手順は同リポジトリを参照してください。
| リポジトリ | 内容 |
|---|---|
| shielune/YaneuraOu | halfkp_128x2-32-32 に対応したやねうら王のフォーク。エンジンバイナリの配布元 |
| KiouForge | 棋桜の快適化拡張 (FPS / AFK 抑制 / 棋譜自動保存 / 解析パラメータ調整) |
| KiouEngineBridge | 棋桜を CSA サーバー化して LAN 上の思考エンジンと対局させる拡張 |
- このリポジトリの変換ツール / スクリプト / ドキュメントは GPLv3 です。やねうら王を前提とした派生的な内容を含むため、同じライセンスに揃えています。
- エンジンバイナリはやねうら王の派生物であり、GPLv3 に従います。配布元は shielune/YaneuraOu で、対応するソースも同リポジトリで公開されています。
- 評価関数はいずれのライセンスにも含まれません。 権利は株式会社ネコノメに帰属します。このリポジトリでは配布しておらず、利用者が公式 CDN から取得したものを私的な範囲で利用することを想定しています。再配布 / 商用利用はしないでください。
- 本リポジトリは株式会社ネコノメとは無関係の非公式プロジェクトです。利用によって生じたいかなる損害についても責任を負いません。