Skip to content

棋力測定

速度や検証損失だけでは棋力は分かりません。openbench はローカル・クラスタのワーカーで対局を行い、SPRT(逐次確率比検定)で差を判定します。基盤本体は別リポジトリ rshogi/openbench にあります。

エンジンとワーカーの契約

usi-arena は stderr に機械可読な 1 行を出します。

text
[arena] metric games=4 wins=3 losses=1 draws=0 plies_mean=103.8 arena_score=0.7500 …

ワーカーは winslossesdraws を読みます。score だけでは 3 結果の統計に必要な情報が足りません。エンジンのコマンド、配置先、クラスタ割り当ては tideborn/tools/openbench/ 以下で管理します。

バイナリを更新したら、同時に remote.toml の配置先も更新してください。 古いバイナリを参照すると、全対局が即座に失敗しやすくなります。

基準ラダー

内部対局の Elo はプロジェクト全体と一緒にずれることがあります。そのため、外部基準として YaneuraOu の固定評価器を複数の探索ノード数で登録します。例: YaneuraOu KP256 @10k

隣接する段は、統計を取りやすい程度に近づけます。climb calibrate はノード数の幾何平均を使って不足段を追加します。

sh
climb calibrate remote "YaneuraOu KP256 @"
climb calibrate remote "YaneuraOu KP256 @" --dry-run
climb calibrate remote "YaneuraOu KP256 @" --climb 100 --floor 100000

--climb ELO は、基準側の探索を 2 倍にしても指定 Elo 差を超えなくなるまで上へ延長します。無人実行では有限の --ceiling を指定してください。

挑戦者を測る

弱い段から順に、各段で 1 回の SPRT を行います。

sh
climb start local  "DLManaka v0 @32" --min-nodes 1000 --games-per-job 32
climb start remote "YaneuraOu Material Lv1 @1m" --min-nodes 1000
  • accepted — 次の段へ進む。
  • rejected — その段を超えられなかったので終了。
  • inconclusive — この用途では終了。

弱い段から始めるのは意図的です。強すぎる相手に 500–0 で負けても「どこか下」としか分かりません。既に不要と分かっている段は --min-nodes で飛ばします。

フラグ既定値意味
--min-nodes0最初に試す段
--elo0 / --elo10 / 10SPRT の仮説
--max-games10241 段あたりの上限対局数
--games-per-job161 ワーカージョブあたりのペア数

監視と停止

sh
climb watch
climb list
climb stop --with-reap
climb reap

ダッシュボードにはノード容量、実行中テスト、ローカルの climb 実行が表示されます。 は対局中で未報告という意味で、停止ではありません。

テスト停止は新規ジョブ配布を止めるだけで、既に対局中のコンテナは止まりません--with-reap を使うか、その後に climb reap を実行してください。すべて明示的に止める場合:

sh
uv run python tideborn/tools/openbench/stop.py \
  --config tideborn/tools/openbench/config.toml

ジョブ規模

現在の想定値:

  • サーバー → ワーカー: 128 ペア/ジョブ、同時実行は最大 256 ペア。
  • ワーカー → ノード: 32 ペア単位、1 ノード最大 128 ペア。

1 ペアはエンジンスレッドを 2 本使います。大きくしすぎてもローカル待ちが増えるだけで、ジョブ全対局が終わるまで報告できないため結果が遅れます。

運用上の制約

  • ローカル用 climb とクラスタ用 climb を同時に動かさない。 サーバーのジョブキューが共有されており、現状は他側のジョブを取得して捨てる可能性があります。
  • 登録エンジン名は config.toml[engines] に完全一致するか、 @nodes を除いた名前で解決できる必要があります。
  • 手書き API 呼び出しを作る前に /openapi.json を取り直す。/api 接頭辞が必要です。
  • 内部直接対局だけでなく、外部基準と検証指標を優先する。信頼区間が 0 をまたぐ小さな Elo 差は根拠にしない。