テストフレームワーク概説

前提知識:統計的検定とチューニング の全体像を把握していること

OpenBench、Fishtest、Cutechess は、チェスエンジンの対局、統計的検定、チューニングを支えるツールです。 それぞれの機能と、ShogiArena の OpenBench サーバ連携や将棋への対応を紹介します。

OpenBench

分散テストと統計的検定の統合

OpenBench は、Andrew Grant が開発したオープンソースのエンジンテストフレームワークです。 分散テストと統計的検定を一つの Web プラットフォームで扱います。 複数のマシン(ワーカー)でテストを並列実行し、中央サーバで結果を集約して判定します。

アーキテクチャ

┌──────────────────────────────────────────┐
│            OpenBench サーバ               │
│        (Django Web アプリケーション)       │
│                                          │
│  ┌─────────┐  ┌─────────┐  ┌─────────┐  │
│  │  Test   │  │ Result  │  │ Machine │  │
│  │ モデル  │  │ モデル  │  │ モデル  │  │
│  └─────────┘  └─────────┘  └─────────┘  │
│                    ▲                     │
└────────────────────┼─────────────────────┘
                     │ REST API
        ┌────────────┼────────────┐
        │            │            │
   ┌────▼────┐  ┌────▼────┐  ┌────▼────┐
   │Worker A │  │Worker B │  │Worker C │
   │(対局実行)│  │(対局実行)│  │(対局実行)│
   └─────────┘  └─────────┘  └─────────┘
  • サーバ:Django ベースの Web アプリケーション。テストの作成、管理、結果集約を担う
  • ワーカー:各マシンで対局を実行し、結果を定期的にサーバに報告する
  • REST API:ワーカーの登録、ワークロード取得、結果提出、ハートビートを処理

サポートするテストの種類

OpenBench は以下の 4 種類のテストをサポートしています。

テストタイプ目的統計手法
SPRTパッチの強さを検証逐次確率比検定
SPSAパラメータの自動チューニング同時摂動確率近似法
GAMES固定局数での評価Elo 推定 + 信頼区間
DATAGEN学習データの生成なし

集計と実行の面では、次の機能を備えています。

  • 五項分布スコアリング:ペアゲームの結果を 5 カテゴリで追跡し、高精度な分析を提供
  • 三項分布スコアリング:従来の勝ち、引き分け、負けの 3 カテゴリも並行して追跡
  • ワーカー管理:CPU コア数やスレッド数に基づくワークロード割り当て

ShogiArena との連携

ShogiArena は OpenBenchClient クラスで OpenBench 互換の API クライアントを実装しています。 これにより、ShogiArena で実行した対局結果を OpenBench サーバ(または ShogiBench サーバ)に直接提出できます。

主な連携機能は次のとおりです。

  • 既存テストへの参加:サーバ上のテストにワーカーとして参加し、結果を提出
  • テスト作成:ShogiArena から新規テストを作成し、他のワーカーと分散テストを実施
  • ペアリング検出:ゲーム名のパターン(g{round}-...)から先後ペアを検出し、五項分布カウンタを更新
  • ハートビート:定期的な接続確認で、サーバとのセッションを維持
設定例(arena 設定 YAML):

openbench:
  enabled: true
  server: "https://example.com"
  mode: "existing_test"       # 既存テストに参加
  target_test_id: 12345
  submit_interval_games: 100  # 100 局ごとに結果を提出

Fishtest

ボランティア分散によるテストインフラ

Fishtest は、チェスエンジン「Stockfish」の開発チームが運営する公式テストインフラです。 世界中のボランティアが提供する数百台のマシンで、提出されたパッチを 24 時間体制でテストしています。

Fishtest では、STC と LTC の検定を開発手順に組み込んでいます。 「パッチを投稿 → STC で高速検証 → LTC で最終確認 → マージ」というフローによって、 Stockfish は統計的に裏付けられた改善を積み重ねています。

テスト結果の読み方

Fishtest の Web インターフェースでは、各テストの結果が以下のような形式で表示されます。

SPRT: elo0: -1.75 alpha: 0.05 elo1: 0.25 beta: 0.05 (normalized)
Pentanomial: [55, 11390, 30659, 11490, 70]
LLR: 2.94 [-2.94, 2.94] (accepted)
項目意味
SPRTテストパラメータ。elo0/elo1 は仮説の Elo 差、alpha/beta は誤り率
(normalized)nElo(正規化 Elo)で閾値を設定していることを示す
Pentanomial五項分布のカウント \([n_{0.0}, n_{0.5}, n_{1.0}, n_{1.5}, n_{2.0}]\)
LLR現在の LLR 値と判定範囲 \([\text{lower}, \text{upper}]\)
(accepted)H1 を採択(改善あり)。(rejected) なら H0 を採択(改善なし)

五項分布の合計 × 2 が総対局数です。 上の例では (55+11390+30659+11490+70)×2 = 107,328 局でテストが完了しています。

elo0/elo1 の設定は、変更の種類によって使い分けます。

  • コードの削除や簡略化:[-1.75, 0.25](劣化がないことの確認)
  • アルゴリズム改善:[0, 2] や [0.5, 2.5](改善効果の実証)

参考:テスト結果の背景にある統計理論の詳細は SPRT と 五項分布モデル を参照してください。

SPRT Calculator

Fishtest は、必要な対局数を事前に見積もるための SPRT Calculator を提供しています。 elo0、elo1、引き分け率、実際の Elo 差を入力すると、テスト完了までの期待対局数を計算できます。 テストの計画段階で、そのパラメータ設定に何局必要かを把握できます。

STC→LTC ワークフロー

Fishtest が確立した階層テスト戦略は、エンジン開発の標準的な手順として広く採用されています。

パッチ投稿
    │
    ▼
┌────────────────────────┐
│  STC テスト(短時間制御) │
│  例: 10+0.1秒          │
│  SPRT: elo0=0, elo1=5  │
│  α=0.05, β=0.05        │
└───────────┬────────────┘
            │ Pass
            ▼
┌────────────────────────┐
│  LTC テスト(長時間制御) │
│  例: 60+0.6秒          │
│  SPRT: elo0=0, elo1=5  │
│  α=0.05, β=0.05        │
└───────────┬────────────┘
            │ Pass
            ▼
    master にマージ

この戦略には次の利点があります。

  • STC で高速フィルタリング:弱いパッチを早期に棄却し、計算資源を節約
  • LTC で信頼性の確保:STC を通過したパッチだけを長時間で再検証
  • 二段階のゲートキーピング:偽陽性のリスクを低減

fishtest-spsa-lab

Fishtest コミュニティからは、SPSA アルゴリズムの最適化研究も生まれています。 fishtest-spsa-lab は、Fishtest で使用される SPSA の収束特性を改善するための実験プロジェクトで、 以下のアルゴリズムバリアントを比較検証しています。

アルゴリズム特徴
Classic SPSAFishtest の現行実装。固定ゲインスケジュール
Schedule-Free SGD学習率スケジュールが不要な最適化手法
Schedule-Free Adamパラメータごとに異なる感度に対応

ShogiArena の LTC 回帰テスト機能は、この研究から着想を得ています。

ShogiArena への影響

知見ShogiArena での実装
SPRT の設計sprt_service.py
五項分布モデルpentanomial.py
STC→LTC ワークフローLTC 回帰テスト(LtcRegressionConfig)
統計的方法論SPRT パラメータのデフォルト値設計

Cutechess

参照実装としてのトーナメントマネージャ

Cutechess は、チェス用のトーナメントマネージャです。 コマンドライン版(cutechess-cli)と GUI 版の両方を提供し、 エンジン間の対局実行、トーナメント管理、棋譜出力をまとめて扱えます。

SPRT や裁定ロジックの参照実装としても使われています。

補足:cutechess-cli の後継として、fastchess が開発されています。 より効率的な並列処理と改善された SPRT 実装を提供しています。

トーナメントフォーマット

フォーマット説明用途
Round-robin全エンジン同士の総当たり全体のランキング作成
Gauntlet1 エンジン vs 他の全エンジン特定エンジンの相対評価
Knockout勝ち抜きトーナメント最強エンジンの選出
Pyramidピラミッド型の対戦段階的な強さの比較

ShogiArena への影響

影響を受けた領域ShogiArena での実装
SPRT 実装の設計sprt_service.py(cutechess の sprt.cpp を参考)
裁定ロジックadjudication.py
持ち時間管理time_control.py
トーナメント形式Round-robin、スイス式をサポート

ShogiArena の位置付け

機能比較

特徴OpenBenchFishtestCutechessShogiArena
SPRT✓✓✓✓
SPSA✓✓✗✓
五項分布✓✓✓✓
分散テスト✓✓✗✓(OpenBench 連携)
トーナメント形式✗✗✓✓
Web ダッシュボード✓✓✗✓
LTC 回帰テスト△✓✗✓
USI プロトコル✗✗✗✓
将棋ルール対応✗✗✗✓

将棋固有の適応

ShogiArena は、将棋のプロトコル、棋譜形式、ルール、持ち時間に対応しています。

プロトコルとフォーマット

  • USI プロトコル:チェスの UCI に代わり、将棋標準の USI を完全実装
  • SFEN 記法:チェスの FEN/EPD に代わり、SFEN を局面表現に使用
  • KIF/CSA 形式:チェスの PGN に代わる棋譜フォーマットをサポート

将棋ルール

  • 千日手:同一局面が 4 回出現した場合の引き分け判定
  • 持将棋:入玉状態での点数計算による引き分けと勝敗の判定
  • 入玉宣言勝ち:入玉宣言法に基づく勝利判定
  • 反則検出:二歩、打ち歩詰め、行き所のない駒などの反則検出

持ち時間

  • 秒読み(Byoyomi):フィッシャー方式に加えて、日本将棋特有の時間制御をサポート

OpenBench API 互換性

ShogiArena の OpenBench クライアントは、以下の API エンドポイントと互換性があります。

エンドポイント機能
clientGetWorkloadワークロード(テスト割り当て)の取得
clientSubmitResults三項/五項分布の結果提出
clientHeartbeatワーカーの接続確認
scripts(action=CREATE_TEST)新規テストの作成

これらの API を通じて、既存の OpenBench サーバと分散テストを実行できます。

実装リファレンス

ファイルクラス/関数役割
openbenchOpenBenchClient ほかOpenBench API 連携
sprt_service.pySprtSPRT 実装(cutechess ベース)
adjudication.pyAdjudicationConfigゲーム裁定ロジック
time_control.pyTimeControlLimits, GameClock持ち時間管理
usi_engine_session.pyAsyncUsiEngineUSI プロトコル実装
schedule_generation.pyGameScheduler ほか対局スケジューリング

参考文献

次に読む

→ 用語集:本ページで登場した用語のリファレンス

→ 統計的検定とチューニング:ShogiArena の統計モジュールの理論的背景