Skip to the content.

Build Notes(全記録)

囲碁ソルバー Phase 1「動く版」スナップショット

作成: 2026-07-15(Claude Code) 参照: E:\go\go_solver_build_handover.txt(引き継ぎ書)

結論

online-fine-tuning-solver(NeurIPS 2023)の killallgo ソルバを Docker不使用・WSL2ネイティブでビルドし、 リポジトリ同梱の学習済みPCNモデルで、ドキュメント記載の参照問題2問の判定再現に成功。 RTX 5090(sm_120)上でlibtorch推論が動作。

スナップショット(動く版の固定点)

項目
OFTS df2d80c(branch neurips2023)
minizero submodule 06e6811(2023-02-07)
chat submodule 96014ac
libtorch 2.8.0+cu128(shared-with-deps, ~/Projects/go/libtorch)
CUDA toolkit 12.8(V12.8.61, /usr/local/cuda-12.8)
GPU / driver RTX 5090(sm_120)/ 595.79(CUDA 13.2対応)
gcc / cmake 13.3.0 / 3.28.3
boost / pybind11 1.83.0 / 2.11.1(apt)
ビルドコマンド cmake -DCMAKE_BUILD_TYPE=Release -DGAME_TYPE=KILLALLGO -DCMAKE_PREFIX_PATH=~/Projects/go/libtorch -DCUDAToolkit_ROOT=/usr/local/cuda-12.8
成果物 build/killallgo/killallgo_solver(65MB), chat/chat

※ minizero master の Dockerfile ピン(参考): CUDA 12.9.1 + torch 2.9.0+cu128 + libtorch 2.8.0+cu128。 ※ 推論バックエンドは libtorchのみ。TensorRTは不使用(リポジトリ全体にTRT参照なし)→ 引き継ぎ書§2の懸念どおり「TRT11でビルド」の前提は消滅。

適用パッチ(2箇所のみ)

  1. CMakeLists.txt(OFTSルート): find_package(Torch) の直後に find_package(Python COMPONENTS Interpreter Development.Module REQUIRED) を追加。 理由: libtorchのCMakeが先にPythonをInterpreterのみでfindするため、pybind11の python_add_library が未定義になる(find_packageはディレクトリスコープなのでトップレベルに置く)。
  2. minizero/minizero/environment/chess/bitboard.h: #include <cstdint> を追加。 理由: gcc 13で暗黙の推移的includeが削除された。

動作検証(docs/Launch-the-Standalone-Solver.md の参照問題)

設定: 学習済みモデル training/gpcn_n32_m16_empty_op/model/weight_iter_100000.pt(リポジトリ同梱、35MB TorchScript)

問題 本環境の出力 docs期待値 判定
1(証明) 1 1 40c1cffff 1112 "" 1 1 2060c1cffff 1513 "" status一致(1=証明)
2(反証) 2 -1 21c3fff 214 "20c1e7c:0:20c1654;0" 2 -1 a1c3e7c 245 "" status一致(-1=反証)

環境の罠と回避策(この機体固有)


Phase 2「CUDA 13.2へ登る」完了記録(2026-07-15)

方針: ユーザー指定により CUDA 13.2 + TRT 11.0(=既存環境そのまま、ドライバ更新なし) をターゲットに変更。 TRT 11.0.0.114は+cuda13.2パッケージでこの機体のドライバ上限(13.2)と一致。ソルバ本体はTRT不使用。

到達点

構成 ビルド 回帰(参照問題1/2)
libtorch 2.8.0+cu128 + CUDA 12.8(動く版) 1 40c1cffff 1112 / -1 21c3fff 214
libtorch 2.9.1+cu130 + CUDA 13.2 toolkit ✓ 追加パッチ0 status/rzone/GHI完全一致(1114ノード±2)
libtorch 2.11.0+cu130 + CUDA 13.2 toolkit(最新) ✓ 追加パッチ0 完全一致

遭遇した山: cudartシンボル横取りSIGSEGV(今回の最重要知見)

症状: cu130系バイナリが起動直後にSIGSEGV。バックトレースはWSLドライバの libnvidia-ptxjitcompiler.so.1__strlen_avx2、呼出元はシステムの/usr/local/cuda-13.1/lib64/libcudart.so.13

原因: TorchConfig経由で実行ファイルがシステムのlibcudart.so.13をリンクする。 動的リンクのシンボル解決優先順(実行ファイルの依存が先)により、libtorch同梱のcudart 13.0 (libcudart-<hash>.so.13)ではなくシステムcudart 13.1が全cudart呼び出しを乗っ取る。 13.0でビルドされたlibtorchのfatbin登録と13.1 cudartが混線しPTX JIT経路でクラッシュ。

対策(regress.sh実装済み):

  1. 実行時: env -u LD_LIBRARY_PATH LD_PRELOAD=<libtorch>/lib/libcudart-<hash>.so.13 <solver>
  2. 恒久: 各libtorchのlibに ln -s libcudart-<hash>.so.13 libcudart.so.13(RUNPATH解決用)
  3. 検証: LD_PRELOAD適用でスモークテスト全項目PASS、ソルバ回帰完全一致

もう一つの罠: workerのstdin EOF挙動

echo 問題 | killallgo_solver -mode workerのようにstdinを即EOFにすると、探索完了前に シャットダウンして結果が出ないことがある(分散運用前提の2023年コードの仕様。レース依存)。 → regress.shはFIFOでstdin write端を保持し、結果行を検出したら閉じる方式。

残メモ


Phase 3「分散ソルバによる求解再現」記録(2026-07-15)

到達点: EASY-smallセット37/37問を分散求解で証明

単一マシン(1×RTX 5090 + 285K)上に論文の分散構成を再現し、EASY-small全37問を証明。

構成(tmuxセッションsolver)

内容
chat scripts/chat/start-service.sh 8888(モニタ: nc localhost 8888)
broker CHAT=localhost:8888 scripts/chat/broker.sh b1
worker CHAT=localhost:8888 CUDA_VISIBLE_DEVICES=0 LD_PRELOAD=<2.11のcudart> scripts/chat/worker.sh W1-0 b1
manager CHAT=localhost:8888 LD_PRELOAD=... scripts/run-manager.sh killallgo <ID> BROKER=b1 CVD=0 ONLINE=false SIM=1000000

RAMプロファイル(memory=55GB WSLでの実測)

EASY-44の教訓: GHI条件付き証明とPCN閾値の相互作用

オンライン微調整(online-cp/sp)セットアップ完了(2026-07-15)

論文の本体機構「解きながらPCNを微調整する」を単一GPU構成で稼働させた。

構成(tmuxセッションsolverに3窓追加)

ノード 実体 環境注入
LL1 trainer game-solver-trainer.sh → killallgo_solver -mode zero_server(port 9999) LD_PRELOAD(2.11 cudart)
LL1-sp 自己対戦 zero-worker.sh sp → killallgo_solver -mode sp(GPU 0, batch 256) LD_PRELOAD(2.11 cudart)
LL1-op 最適化 zero-worker.sh op → python game_solver/trainer/learner/train.py PATHに既存torch venv(LD_PRELOADは厳禁)

実行コマンド(managerウィンドウ)

CHAT=localhost:8888 TRAINER_HOST=localhost TRAINER_GPU=0 LD_PRELOAD=<2.11のcudart> \
  scripts/run-manager.sh killallgo <ID> BROKER=b1 CVD=0 ONLINE=true SIM=1000000

検証結果: EASY-08(最重量問題)でbaseline比8.2倍

モード 時間 マネージャ木 ジョブ数 備考
baseline(48w) 284.3s 19302 1196  
online(32w+trainer同居) 34.5s 4793 460 load_model配信1回、weight_iter_100200生成、sp棋譜2イテレーション

JA本番運転(2026-07-15 19:13開始)

運用メモ(この構成で覚えておくこと)

(参考)当初の判断メモ: JA開局(論文メイン実験)

ベンチマーク設計(2026-07-16 未明、ユーザー発案)

「同一ソルバ・同一問題・同一開局でGPU世代だけが違う」クリーンな実測比較として本JA走行を位置づける。 論文リファレンス行はOFTS docs掲載のJA online(SIM=1e7, 7g384w+1sp1op): loss / 32,105s / 木1,413,138 / ジョブ281,648 / ノード1,728,286,526 / 6,136n/job / load_model 208

リファレンス出典の注記(2026-07-16、ユーザー指摘反映)

研究ロードマップ(2026-07-16、ユーザー調査による周辺状況整理)

台湾(CGI/RLG Lab)系列: ①セキDB(2024-11、1日→482秒の事例) ②RZ縮小(arXiv 2510.00689、 平均85.95%に圧縮、再利用可能知識化→大盤への道) ③L&D RZ研究(arXiv 2512.21365、IEEE ToG、 稀パターン誤判定・即生き優先の癖・趙治勲事典2問の修正)。8路/9路の次世代はまだ→フロンティア未移動。

Alberta(Müller研)系列: CGT+αβ/df-pn路線。6×6 Go完全解プロジェクト進行中(5×5/5×6はvan der Werf済)。 MCGS(minimax型組合せゲームソルバ、GitHub: ualberta-mueller-group/MCGS)、SEGClobber、 KataGo完全解析(Husna MSc 2024)。Ting Han Weiが両陣営の共著=協働体制、ただしコード統合は未着手

ハイブリッド構想(未開拓地): NNソルバが「難しい」と判定した部分木をCGT手法で厳密求解。 本環境での実装距離は近い:

優先順位(ユーザー方針): JA完走→ベンチ表 → ①セキDB → 同一JA再求解で2軸分離(ハード/アルゴ寄与) → ②RZ縮小 or ハイブリッド試作。


🏆 JA完全求解達成(2026-07-17 13:30頃 JA_DONE)

結果: loss(黒の生きを厳密証明)— docs環境と判定一致、再現成功。

指標 本機 docs(1080Ti×12/384slot)
壁時計 148,879s (41.4h) 32,105s 4.6倍遅(slot 1/16)
nodes/s/slot 284.0 141.3 2.00×
必要ノード 1.011B 1.728B 0.59×
総ジョブ 241,415 281,648 0.86×
モデル配信 4,007回 208回 19×
最終木 1,194,363 1,413,138