Solving 7×7 Killall-Go Opening JA on a Single RTX 5090
A Reproduction and Cross-Generation Benchmark of the NeurIPS 2023 Online Fine-Tuning Solver — Technical Report v0.1
Date: 2026-07-17 / Status: v0.1 public technical report(英訳版は準備中)
Abstract (EN)
We reproduce the distributed Killall-Go solver of Wu et al. (NeurIPS 2023, Game Solving with Online Fine-Tuning) natively on WSL2 without Docker, on a single consumer machine (RTX 5090 / Blackwell sm_120, Core Ultra 9 285K), and solve the 7×7 Killall-Go opening JA, proving the same verdict (loss — White cannot secure life; Black captures all of White’s stones) as the authors’ recorded run on 12× GTX 1080Ti with 384 worker slots. Because the code, problem, model, and configuration family are held fixed, the two runs form a clean cross-generation systems benchmark: per-slot node throughput improved 2.00× (284 vs 141.3 nodes/s/slot), and the total search effort required fell to 0.59× (1.011B vs 1.728B job nodes), which we attribute primarily to a 19× higher online model-update frequency (4,007 vs 208 broadcasts) enabled by colocating the trainer on the same GPU. Combined per-slot effective productivity is ≈3.4×. We additionally solve all 37 EASY-small problems, document a GHI-conditional proof case (EASY-44) and its resolution via PCN-threshold decomposition, and analyze a cudart symbol-interposition crash specific to CUDA-13 libtorch builds on multi-toolkit hosts. All patches (36 lines total), scripts, and result artifacts are included or archived.
要旨(JP)
NeurIPS 2023のオンライン微調整ソルバをDocker非使用でWSL2上にネイティブ再現し、単一のRTX 5090で7×7 killall-go開局JAを完全求解した(判定 loss = 白が活き(無条件活き/セキ)を作れず黒が全消し、原著実測と一致)。コード・問題・初期モデル・設定系を固定したまま計算基盤だけが2017年世代(1080Ti×12/384スロット)から2026年世代(5090×1/24スロット)に替わったため、世代間システムベンチマークとして読める: スロット当たりノード処理は2.00倍、必要探索量は0.59倍(モデル配信頻度19倍の寄与と考える)。EASY-small全37問の証明、GHI条件付き証明の事例分析、CUDA 13世代libtorch特有のcudartシンボル横取りクラッシュの解析を含む。
1. 背景
killall-go(全消し碁)とは: 囲碁の非対称ルール。黒が攻撃側で、白石を全て取り切れば(全消し)勝ち — 攻める方が難しいため黒は最初に2手連続で着手するハンデを持つ。白が防御側で、無条件活き(Benson)またはセキ(双活)を達成すれば勝ち。地は数えず「黒は白を全部取れるか?」という二値の生死問題で、盤が小さく本物の囲碁ルール(取り・コウ・セキ・生死)を保つため厳密求解のベンチマークに向く。本レポートの判定 loss は白から見た負け=白が活きを作れず黒が全消し(黒の勝ち)、を指す。
- 対象システム: rlglab/online-fine-tuning-solver(NeurIPS 2023)。manager–broker–worker分散構成のAND/OR証明探索を、PCN(Proof Cost Network)が誘導し、求解中にtrainerがPCNをオンライン微調整する
- 原著の実験環境はGTX 1080Ti世代のクラスタ。Blackwell(sm_120)世代での動作報告は本レポート時点で見当たらない
- 本走行の位置づけ: (a) 忠実な再現の確認、(b) 同一コード・同一問題での世代間実測、(c) 発展実験(セキDB等)のベースライン確立
2. 実験設定
| 項目 | 本走行 | 参照実測(上流docs記載) |
|---|---|---|
| GPU | RTX 5090 32GB(sm_120)×1 | GTX 1080Ti ×12(2〜3ホスト) |
| CPU | Core Ultra 9 285K(24C) | Xeon世代(詳細は原典参照) |
| ワーカスロット | 24(1プロセス) | 384(7g384w+1sp1op) |
| トレーナ | 同一GPUに同居(zero_server+sp+op) | 専用GPU |
| manager木上限(SIM) | 2.5e6 | 1e7 |
| PCN閾値 | 16.5(同一) | 16.5 |
| worker設定 | sim=1e5, situational superko, RZone+block TT+GHI check(同一) | 同一 |
| 初期モデル | gpcn_n32_m16_empty_op:100000(リポジトリ同梱、同一) | 同一 |
| ソフトウェア | libtorch 2.11.0+cu130 / CUDA 13.2 toolkit / gcc 13.3 / WSL2 | 当時のコンテナ環境 |
| コード | neurips2023 @ df2d80c + 3パッチ(計36行、patches/) |
同一ベース |
RAM 53GB(WSL上限)に対する配分実測: manager 26GB(木2.5e6設定時)+ worker(24並列)16.8GB + trainer系2GB。スワップ退避はコールドページに限られ探索速度への影響は観測されなかった(swap-in ≈ 0)。
3. 再現性の検証
- 参照問題2問(上流docs記載): status/rzone一致を3つのlibtorch世代(2.8.0+cu128 / 2.9.1+cu130 / 2.11.0+cu130)で確認。
1 40c1cffff 1114±2/-1 21c3fff 214— 上流docsの.jobs例に現れる値(40c1cffff 1114)とも一致 - EASY-small 37問: 全問証明。36問はデフォルト設定でwin(計1,901秒)。EASY-44のみルートPCN値(16.245)が閾値以下で丸ごと1ジョブ投入され、GHI(コウ経路依存)注釈付き証明が返り、managerは誠実に「?」(virtual solved)を報告。PCN閾値を16に下げ木分解を強制すると局所解決されwin確定(644ノード/146ジョブ/24.8秒)— 求解器がコウ経路条件付き証明を無条件winと混同しない設計の実証
- JA本走行: 判定lossが原著実測と一致
4. JA本走行の結果
| 指標 | 本走行 | 参照実測 | 比 |
|---|---|---|---|
| 判定 | loss(白が活き作れず=黒の全消し) | loss | 一致 |
| 壁時計 | 148,879 s(41.4 h) | 32,105 s | 4.64倍遅 |
| managerツリー | 1,194,363 | 1,413,138 | 0.85× |
| 総ジョブ | 241,415 | 281,648 | 0.86× |
| ジョブ総ノード | 1,011,351,341 | 1,728,286,526 | 0.585× |
| ジョブ総時間 | 3,560,612 s | 12,227,753 s | 0.29× |
| 平均ジョブ時間 | 14.75 s | 43.42 s | 0.34× |
| nodes/s/slot | 284.0 | 141.3 | 2.01× |
| モデル配信(load_model) | 4,007 | 208 | 19.3× |
| 微調整世代(200step毎) | 4,013(最終step 902,400) | — | — |
| unsolvedジョブ率 | 0.2%前後 | — | — |
5. 性能分解
壁時計比 4.64× は次のように分解できる:
(参照スロット数/本スロット数) ÷ (スロット当たり実効生産性比)
= (384/24) ÷ (2.01 × 1.71)
= 16 ÷ 3.44 ≈ 4.65 ✓(実測4.64×と整合)
- 2.01× = スロット当たりノード処理速度(ハードウェア+ツールチェイン世代の寄与、ただしCPU探索とGPU推論の混合値)
- 1.71× = 必要ノード削減(1/0.585。探索の質の寄与)
6. 考察
6.1 更新頻度とノード削減。 本走行はトレーナを求解と同一GPUに同居させた結果、モデル配信が参照実測の19倍の頻度(約37秒に1回)となり、必要ノードが41%減った。これは「オンライン微調整の効果は更新頻度でスケールする」ことの観察証拠と考える。ただしワーカ数(24 vs 384)の違いによる投機ジョブ減と交絡しており、寄与の分離には制御実験(§8)が要る。総ジョブ数の減少(0.86×)よりノード減(0.585×)が大きいことは、ジョブ数だけでなく個々のジョブが浅く済んだ(平均4,189 vs 6,136ノード)ことを示し、更新頻度説と整合する。
6.2 managerツリーとRAM。 走行中のmanager RSS+swapからのツリー占有推定は最終実測(1.19M)を大きく過大評価した(TT・断片化の混入)。容量計画には.statの実測木サイズを使うべきである。参照実測の木(1.41M)も本走行の木(1.19M)もSIM=2.5e6以下であり、この開局はSIM=2.5e6で足りる(原著設定1e7は保守的)ことが分かった。
6.3 cudartシンボル横取り(工学的知見)。 CUDA 13系libtorch(cu130)のバイナリは、システムに別マイナー版のCUDAツールキットが存在すると、実行ファイル側がリンクするシステムlibcudart.so.13がlibtorch同梱cudartのシンボルを乗っ取り、WSLドライバのPTX JIT内でSIGSEGVする。cu128世代で顕在化しなかったのは要求soname(.so.12)がシステム側と偶然同版だったため。対策は同梱cudartのLD_PRELOAD(+libディレクトリへの正名symlink)。詳細はBuild Notes。
7. 妥当性への脅威(Threats to Validity)
- 単一走行: JAは1回のみ。探索は並列非決定であり、時間・ジョブ数には走行間分散があるはず(参照問題レベルではノード数±2程度の揺らぎを確認)
- CPU交絡: nodes/s/slotはCPU探索+GPU推論の混合値。さらにスロット当たりCPU配分が本走行は参照の約2倍(16スレッド/24games vs 16スレッド/48games)。「GPU世代比2.01×」ではなく「リグ世代比」と読むべき
- 参照値の出典: 比較主行は上流docsに記録された実測であり、論文本文Table(JA ONLINE-CP: 22,384s/1.29Bノード)とは条件(ワーカ数・top-k)が異なる。論文Tableとの直接比較はしていない
- 設定差: SIM(2.5e6 vs 1e7)とトレーナ同居/専用の差がある。判定の同一性には影響しない(証明は証明)が、性能数値の解釈には注意
- 測定系: ジョブ数・ノード数はソルバ自身の.stat/.jobsに依拠(独立検証はしていない)
8. 今後の実験計画
- セキ(双活)DB導入 → 同一JA再求解: 「5090+セキDB vs 1080Ti+セキなし」の二軸比較で、ハード寄与とアルゴリズム寄与を一つの開局上で分離する(本レポートのベースラインがその片翼)
- 更新頻度の制御実験: 同一ワーカ数で配信間隔だけ変えた走行により§6.1の交絡を解く
- RZコーパス: 本走行で得た241,415ジョブのRZone注釈はRZ縮小研究(arXiv 2510.00689)の検証素材となる
- CGTハイブリッド: workerプロトコル(
+ id sgf/id status rzone nodes ghi)は疎結合であり、Alberta系CGTソルバを異種ワーカとしてbroker混在登録できる
9. 成果物
| 場所 | 内容 |
|---|---|
| 本リポジトリ | パッチ、スクリプト、結果表、JA .stat、本レポート、BUILD_NOTES(全記録) |
| ローカルアーカイブ(E:\go\JA_results) | 証明木SGF(756MB)/7esgf(843MB)、全ジョブログ(78MB)、managerログ、微調整モデル全4,013世代(393GB)、自己対戦棋譜コーパス(13GB/4,013ファイル)、学習曲線(op.log) |
成果物の入手(Availability)
- 主要アーティファクト(証明木SGF/7esgf・統計・ジョブログ・微調整モデル・自己対戦棋譜コーパス・SHA-256マニフェスト)は Google Drive(公開リンク) から直接取得できます
- リポジトリ本体(パッチ・スクリプト・全記録)は現在非公開ですが、リクエストに応じて共有します — GitHub @soy-tuber のIssuesへどうぞ(セキDB後続研究の公開に合わせてリポジトリごとpublic化予定)
10. 再現手順(要約)
git clone --recursive --branch neurips2023 https://github.com/rlglab/online-fine-tuning-solver
cd online-fine-tuning-solver && git apply ../patches/*.patch
# libtorch 2.11.0+cu130 を配置し、シンボル横取り対策(BUILD_NOTES参照)を適用
cmake -B build/killallgo -DCMAKE_BUILD_TYPE=Release -DGAME_TYPE=KILLALLGO \
-DCMAKE_PREFIX_PATH=<libtorch> -DCUDAToolkit_ROOT=/usr/local/cuda-13.2
make -C build/killallgo -j
# 分散構成の起動・JA投入コマンドはBUILD_NOTES.mdの運用メモ参照
引用
- T.-R. Wu, H. Guei, T. H. Wei, C.-C. Shih, J.-T. Chin, I.-C. Wu. Game Solving with Online Fine-Tuning. NeurIPS 2023. arXiv:2311.07178
- rlglab/online-fine-tuning-solver(コードおよび参照実測値の出典)