p3-final-stack.toml (M7、124.39s) 以降に S4b (ssim_reduce=gpu) が default flip されたため、Part 1 で同じ 12.5k n=3 手順を再実施した。<strong>as-measured mean は 130.657s (σ1.727%)</strong> だが、同日の paired control 2 本 (S4b gate on-arm 122.768s、p3-refine-nondrain off-arm 122.6467s、相互 0.13% 一致) と比べて +6.4〜6.5% 遅く、load sampler ログ・ms/iter trace の iter3000-9000 区間での一貫した elevation・<code>ps aux</code> で捕捉した実際の同時実行プロセス (Finder 147%CPU 等) という 3 系統の証拠が session 汚染を裏づけた。<strong>milestones.md の「現在地」はこの 130.657s では上書きせず、S4b paired 値 122.768s を維持する</strong> — 新事実は「今のスタックは前回 M7 より遅くなった」ではなく「単発の unpaired n=3 は無関係な同時プロセスに弱い」という計測論の知見。msplat 等価 gap は control 値ベースで <strong>0.745×</strong> (旧 0.755×)、throughput <strong>0.916×</strong> (旧 0.926×) にわずかに改善。Part 2 では 2026-08-30 に採用された 3 施策 (M4/A7/S4b、いずれも Lego 12.5k gate のみが根拠) を ficus (227k splats) / materials (355k splats) / drums (998k splats、Lego の 2.5 倍) で breakage screen し、<strong>3 scene とも ΔPSNR が a-10 の noise floor (σ±0.32dB) を大きく下回り退行なし</strong>を確認。drums は load がほぼクリーンで 5.72× の高速化を実測 (ficus/materials は load 汚染下のため方向感のみ)。
p3-final-stack.toml (M7、124.39s) の直後に S4b (ssim_reduce=gpu) が default flip されたため、milestones.md の「現在地」を最新化するには同じ独立 n=3 手順を再実施する必要があった。本 finding は Part 1 (その再実施) と Part 2 (2026-08-30 に採用された M4/A7/S4b の 3 施策を Lego 以外の scene で breakage screen) をまとめる。Part 1 は「速度がさらに改善した」という当初の想定に反し、「同じ session 内の無関係な CPU 負荷が計測を汚染しうる」という計測論の finding になった — 詳細な証拠の連鎖を §1/§2 に記す。
| run | config | train elapsed (s) | self-eval PSNR (dB) | brush cross-eval q8 (dB) | final splats | avg splats (trapz) |
|---|---|---|---|---|---|---|
| r1 | finalv2-12500-r1 | 132.37 | 36.282 | 36.317 | 406,773 | 320,936.5 |
| r2 | finalv2-12500-r2 | 131.50 | 36.274 | 36.306 | 406,990 | 321,320.6 |
| r3 | finalv2-12500-r3 | 128.10 | 36.214 | 36.244 | 405,946 | 320,776.5 |
| **mean (n=3)** | — | **130.657** (σ1.727%) | **36.257** (σ0.10%) | **36.289** (σ0.11%) | 406,570 | 321,011.2 |
sample σ = 2.257s (1.727% of mean)。個別偏差: r1 +1.71s (0.76σ)、r2 +0.84s (0.37σ)、r3 -2.56s (1.13σ) — いずれも `p3-tier1-bit-exact.toml` §5 の事前登録条件 (load 証拠 AND 自 arm内 3σ 超) の後半を満たさないため、**この規約に従う限り 3 run とも棄却/再試行の対象にならない**。しかし §2 で示すとおり、3 run すべてが同じ iter3000-9000 区間で一貫して減速しており (=相関した底上げ)、単一 run の外れ値を検出する設計のこの規約は「session 全体が相関して汚染される」パターンを検出できない構造的な穴を持つ。
| iter 区間 (1000-iter segment) | old (M7 r2-r4 mean, ms/iter) | new (finalv2 r1-r3 mean, ms/iter) | Δ |
|---|---|---|---|
| 0-1000 | 3.41 | 3.15 | -7.4% (S4b の効果と整合、速い) |
| 1000-2000 | 4.74 | 4.30 | -9.2% (同上) |
| 2000-3000 | 8.35 | 8.02 | -4.0% (同上) |
| 3000-4000 | 9.93 | 10.83 | **+9.0%** |
| 4000-5000 | 10.63 | 11.39 | **+7.1%** |
| 5000-6000 | 11.07 | 12.40 | **+12.0% (最大)** |
| 6000-7000 | 11.47 | 12.37 | **+7.8%** |
| 7000-8000 | 11.56 | 12.11 | +4.8% |
| 8000-9000 | 11.71 | 12.34 | +5.3% |
| 9000-10000 | 11.76 | 12.90 | **+9.7%** |
| 10000-11000 | 11.87 | 12.26 | +3.3% |
| 11000-12000 | 11.88 | 12.45 | +4.8% |
| 12000-12500 | 11.95 | 12.17 | +1.8% |
10s 間隔 load sampler (`runs-logs/finalv2-12500-loadsamples.log`) を r1/r2 window の epoch timestamp と突き合わせると: r1 window (pre 1788100979.56 → post 1788101115.01) 内で load1 が 1788101039.64 に **5.77** まで上昇 (window 開始から +59.4s、r1 の iter6000 (elapsed 51.36s) 〜 iter7000 (elapsed 64.71s) の区間に相当)。r2 window (pre 1788101165.15 → post 1788101299.60) 内でも 1788101239.96 に **4.22** まで上昇 (window 開始から +74.8s、r2 の iter7000 (61.00s) 〜 iter8000 (73.33s) 付近)。r3 window はサンプル値が終始 2.1〜3.0 で最も低く、実測 wallclock も 3 run 中最速 (128.10s) — load スパイクのタイミングと ms/iter の減速タイミング・run 間の速度順位がいずれも整合する。
Part 2 (ficus) 実行直後の `uptime` で load average が 9.96→16.88→32.58 まで跳ね上がったため `ps aux | sort -rk3` で原因を確認したところ、/System/Library/CoreServices/Finder.app が **147.3%CPU**、ユーザーの別プロジェクト (/Users/otkrickey/dev/otksynth/target/debug/deps/analyze_queue-*、matsudalab とは無関係な Rust バイナリ) が **35.7%CPU**、音声処理プロセス (dj-lab) が **24.8〜49.9%CPU** で稼働しているのを直接確認した。これらは本タスクの一部ではなく、ユーザー自身が同じ機体上で並行して行っていた無関係な作業であり、Part 1 series (23:42〜23:51) の後半・Part 2 の ficus/materials (23:54〜00:13) にかけて発生・持続していたと推定される (Part 1 の load スパイクのタイミングと符合)。GPU 権の取り決め (「他 agent は GPU を使わない」) は agent 間の話であり、ユーザー自身の CPU 作業は対象外だった — Apple Silicon の unified memory 帯域は CPU/GPU で共有されるため、CPU 側の重い並行負荷が GPU バウンドな学習の host-side critical path (host_schedule=forward_shadow 等) を遅らせうる。
advisor レビューでの指摘: r3 (128.10s) の window 内 load サンプルは終始 2.1〜3.0 (最大 3.00) で、M7 が『クリーン』と判定した r2-r4 の window (0.93〜3.46) と同水準であるにもかかわらず、control (122.768s) より **+4.3%**・M7 の r2 (123.34s) より **+3.9%** 遅い。segment 単位でも iter11000-12000 (12.51ms/iter、M7 3-run 平均 11.88ms/iter 比 **+5.3%**) に load スパイクの証拠なしに減速が見える。**したがって load スパイクは r1>r2>r3 という 3 run 間の『ばらつき』の順位は説明するが、3 run 全てに共通する ~4〜6% の『底上げ』の全量までは説明できていない**。念のため 2 点を確認した: (1) `git diff --stat 2cb044bde530a425b89c3e90d2532d0e37673021 9bb4ea5 -- splat/crates/` は rasterize.rs / ssim.rs / tile_bin.rs / config.rs / refine.rs の 5 file に diff を持つが、内容を確認すると**全て gate 完了後の verdict 追記という doc comment のみ** (raw struct 初期値・実行ロジックは無変更、`git diff` は `git log` と異なりマージの履歴簡約を経ないため、この空でない diff の中身が doc-only であることを確認できて初めて『事実上同一コード』の主張が成立する)。(2) `diff splat/configs/2026-08-30-rnd-12500-off-r1.toml splat/configs/2026-08-30-finalv2-12500-r1.toml` は `[backend] refine_gpu_snapshot = false` の明示 vs 無指定 (どちらも解決値は `false`) のみで、他の `[backend]` field 差は無い。**この 2 点はいずれもクリーンで、control が本 session の HEAD と機能的に同一コードであることを裏づける** — が、これは「なぜ r3 でも+4%遅いか」を説明しない。残る有力候補は thermal/DVFS drift (本機は series 開始時点で既に 11h+ 連続稼働、当日を通じて M0〜M8 の多数の GPU gate を実行済み) だが、`sudo powermetrics` が使えない環境のため確認できていない。結論を『130.657s は完全に session 汚染で説明される』から『load スパイクは run 間のばらつきを説明するが、3 run 共通の残差 ~4〜6% は未解明で thermal/DVFS drift が有力候補 (未検証)』に修正する — この修正は milestones.md の headline (paired control 122.77s を採用) には影響しない、unpaired series が paired control に劣後するという結論はどちらの読み方でも同じだからである。
同日 22:25 の S4b gate は on-arm (ssim_reduce=gpu、12.5k n=3 交互 A/B) で **122.768s (σ0.864%)** を記録済み。さらに 23:30 の `p3-refine-nondrain` gate は off-arm (refine_gpu_snapshot=false、すなわち現行 default と同一の経路) で **122.6467s (σ0.330%)** を記録しており、このコード状態は本 session の HEAD (9bb4ea5) と refine_gpu_snapshot という no-op field の追加のみが差 (default false で経路変更なし、finding: p3-refine-nondrain 参照) で事実上同一である。この 2 点は独立の A/B gate の一方の arm として alternating 実行 (session 内 drift を打ち消す設計) で得られており、相互に **0.13%** で一致する — 単発の unpaired n=3 である本 finding の 130.657s よりもはるかに信頼できる「現在の真値」の推定である。milestones.md の「現在地」表はこの 122.768s (S4b の paired 値) を維持し、130.657s では上書きしない。
`p3-tier1-bit-exact.toml` §5 が定めた事前登録条件 (load 証拠 AND 自 arm 内 3σ 超) は「1 run だけが外れる」パターン (M7 の r1 のように) を検出するために設計されており、本 finding のように session 全体が相関して底上げされ、3 run のいずれも自 arm 内で 3σ を超えない パターンには構造的に無力である。拡張案: 「unpaired series の mean が、同一コードでの同日 paired control (存在する場合) から 2% 以上乖離している場合、intra-arm σ に関わらず session 汚染を疑い、paired control 側を優先する」という規則を house convention に追加することを提案する。今回のケース (mean 130.657s vs control 122.65-122.77s、乖離 6.4-6.5%) はこの閾値を大きく超えており、拡張規則があれば ms/iter trace の詳細分析を待たずに一次判定できた。
| 段階 | 施策 | Lego 12.5k train elapsed (s) | PSNR (dB) | Δ (対前段) | msplat 比較値 |
|---|---|---|---|---|---|
| Phase 0 | baseline (規約 v2 適用後) | 766.07 | 36.216 | — | 4.51× |
| + C0 | resident binning arena + radix pass skip 16→11 | 395.59 | 36.183 | -48.4% | — |
| + LC | backward last_contributor range | 336.33 | 36.191 | -15.0% | — |
| + S1 | pipeline 全域 resident 化 (Tier A/B/C) | 261.55 | 36.148 | -22.2% | 1.56× |
| + W1 | warp sparse skip | 241.41 | 36.201 | -7.7% | 1.44× |
| + W2 | chained submission (adam+loss chain 統合) | 219.51 | 36.170 | -9.1% | 1.31× |
| + S2 | forward 1 CB 化 + hierarchical GPU scan | 187.65 | 36.167 | -9.9% | 1.105× |
| + S3 | iteration pipelining depth 2 | 151.70 | 36.202 | -18.1% | 0.907× (process wallclock 154.00s 基準、train elapsed 列とは分子が異なる点に注意) |
| + radix simd_ballot (M4) | radix scatter simdgroup ballot 2 段化 | 127.53 | 36.143 | -14.9% | — |
| + refine 3-pass 削減 (A7) | refine scratch 永続化 + compact 直書き | 124.81 | 36.241 | -2.15% | — |
| + 最終スタック独立再計測 (M7) | M4+A7 済みスタックの独立 n=3 gate | 124.39 | 36.219 | -0.33% (ノイズ帯) | 0.755× |
| **+ ssim_reduce=gpu (S4b)** | read_mean_ssim を GPU 1-dispatch reduction 化 | **122.77** (gate on-arm, paired) | 36.179 (gate self-eval) | **-1.4347%** (paired Δ、off 124.555→on 122.768) | **0.745×** (§4) |
| 最終スタック v2 独立再計測 (M7v2、参考値) | S4b 込みスタックの独立 n=3、**session 汚染あり** | 130.657 (as-measured、σ1.727%) | 36.257 (self-eval) / 36.289 (brush cross-eval) | — (§1/§2 の理由によりΔ算出せず、headlineに不採用) | 0.793× (as-measured、非公式値) |
| 断面 | M7 (2026-08-30、S4b前) | M7v2 headline (S4b paired control 122.768s) | M7v2 as-measured (session汚染、参考) |
|---|---|---|---|
| wallclock gap (block1 n=2 分母 164.69s) | 0.755× | **0.745×** | 0.793× (非公式値) |
| 同上、rnd off-arm 122.6467s でも算出 | — | 0.745× (独立 control で再現) | — |
| per-splat·iter throughput (本実装/msplat) | 0.926× (msplat比7.4%優位) | **0.916×** (msplat比8.4%優位) | 0.975× (非公式値) |
| brush convention PSNR (finalv2 final.ply 実測) | +2.006dB (旧final.ply) | brush cross-eval q8 mean **36.289dB** (msplat保守値34.243比 **+2.046dB**) | 同左 (load非依存のためload汚染の影響を受けない) |
2026-08-30 に採用された M4 (radix simd_ballot)・A7 (refine 3-pass 削減)・S4b (ssim_reduce=gpu) はいずれも Lego 12.5k gate のみを根拠にしている。`p1-axis1-phase-g-pareto-landscape.toml` §2 (G.3-alone 30k recipe、2026-05-25 実測、HEAD 5e222bd) の 8 scene 表から、baseline PSNR/wallclock/splats が全て記録済みかつ config の `[trainer]`/`[refine]`/`[adam]`/`[data]` 節が現行 (`2026-08-30-final-12500-r1.toml`) と (dataset_path/name/run_dir を除き) diff で完全一致することを確認した ficus (30k、227k splats)・materials (30k、355k splats)・drums (30k、998k splats) を選んだ。drums は Lego 12.5k (407k splats) の 2.5 倍規模で、3 施策がいずれも splat 数に non-uniform に依存する経路 (radix は pair 数、refine scratch は splat 数、SSIM 総和は image-size-bound で splat 数非依存) を持つ中で、初めて Lego gate のレンジ外の splat 数をテストする scene として選定した。config は元の `2026-05-25-2330-{scene}-phase-g3-sh-progressive-30k.toml` を複製し dataset_path/name/run_dir のみ変更、backend flag は無指定 (現行 default = M4/A7/S4b 込み全部が効く)。
| scene | splats規模 | baseline PSNR (2026-05-25) | new PSNR (2026-08-31) | ΔPSNR | baseline wallclock | new wallclock | wallclock系統性 | baseline splats | new splats | Δsplats |
|---|---|---|---|---|---|---|---|---|---|---|
| ficus | 227k (最小) | 34.281 | 34.261 | **-0.020dB** | 21m40s (1300s) | 349.63s | load 9.6-32.6 で終始汚染、方向感のみ | 226,749 | 227,481 | +0.32% |
| materials | 355k (中) | 30.025 | 29.998 | **-0.027dB** | 30m46s (1846s) | 421.90s | load 7-27 で終始汚染、方向感のみ | 349,784 | 355,033 | +1.50% |
| drums | 998k (Lego比2.5倍) | 27.217 | 27.207 | **-0.010dB** | 1h5m36s (3936s) | 687.85s | **iter27000まで load 0.8-5.5、ほぼクリーン** | 1,001,014 | 997,958 | -0.31% |
M4 (radix scatter の rank 計算方式変更、sort parity は bit-exact)・A7 (refine の allocation/copy 経路変更、書き込みロジック自体は不変)・S4b (`read_mean_ssim` を gradient に触れない loss scalar の集約経路のみ変更) はいずれも「計算結果 (gradient / param 更新) を変えない」ことが設計上保証された施策であり、PSNR trajectory が理論上動く理由がない。したがって本 §6 の ΔPSNR が小さいことは「3 施策が効いた証拠」ではなく「3 施策が Lego 以外の scene・splat 数レンジで壊れていないことの確認 (breakage screen)」である。仮に 1 scene で ±0.1dB を超える差が出た場合の正しい結論も「その scene で回帰が確定した」ではなく「その scene に絞った scoped A/B gate が必要」であり、本 finding はその条件 (>0.1dB の乖離) が発生しなかったため追加 gate は不要と判断した。ただし §14 の追加計測により、この ±0.1dB という閾値自体が ficus には無効であることが判明した — ficus は同一 config・3 run で range 1.443dB を示す scene であり、n=1 の ΔPSNR がこの閾値を下回っても「退行なし」を確度高く主張する根拠にはならない。M4/A7/S4b が PSNR-neutral な設計 (grad/param 更新を変えない) であるという結論自体は変わらないが、n=1 の ΔPSNR でそれを「確認」できるのは range がタイトな scene (materials: 0.028dB) に限られる、という限定を追記する。
§1/§2 で「r3 (load クリーン) でも control より +4.3%」が load スパイクだけでは説明できず、thermal/DVFS drift を未検証の有力候補として残した。本検証は同一 binary (sha256 `c804b349223ffc68e9e1101d79c5ea9f058dfa8d34620504b66aa0a3eb10aa13`、finalv2 と不変)・同一 git rev 系統 (5c731cf、finalv2 の 9bb4ea5 から docs-only commit 1 本のみ進んだ状態、`splat/` crate は無変更なことを確認済み) で、(1) AC 電源・`pgrep -f splat` 空・top CPU procs を記録、(2) GPU を 10 分 idle にして cooldown、(3) `configs/2026-08-31-finalv3-12500-r{1,2}.toml` (finalv2-r1/r2 の `[trainer]/[refine]/[adam]/[backend]` 節と `diff` で完全一致、`[experiment]`/`[output].run_dir` のみ変更) を `final-stack-n3.sh` で連続 2 本実行、load sampler (10s 間隔) で run 中の load を記録した。`pmset -g therm` はこの機体では cooldown 前後とも `No thermal warning level has been recorded` 等の空出力で、直接的な thermal telemetry は取得できなかった (`sudo powermetrics` 不使用の既知の制約)。
| 項目 | cooldown 前 | cooldown 後 (10分 idle) |
|---|---|---|
| pmset -g batt | AC Power, 100% charged | AC Power, 100% charged (不変) |
| pmset -g therm | No thermal/performance warning level / No CPU power status recorded | 同左 (不変、有効なシグナルなし) |
| pgrep -fl target/release/splat | (none) | (none) |
| top CPU procs (ps aux top5) | `bfs -S dfs ...` (find代替、gpui検索) 292.7%CPU が最上位、他は coreaudiod 8.4% / windowserver 6.3% / ghostty 3.7% など | bfs は終了済み。coreaudiod 10.7% / claude(本agent) 7.3% / ghostty 4.2% / corespeechd 4.1% / windowserver 3.6% — 重い競合プロセスなし |
| load averages (1/5/15min) | (cooldown 開始前は未記録、系列サンプラー開始直後で 2.57/4.06/4.79) | 2.71/4.11/4.81 (cooldown 直後) → r1 実行前 quiesce 時点で 2.21 |
| run | elapsed | PSNR (self-eval) | splats | run 中 load (min-max, 10s sampler) |
|---|---|---|---|---|
| finalv3-12500-r1 | 127.989s | 36.333 | 405,716 | 1.31-2.57 (系列全体) |
| finalv3-12500-r2 | 131.512s | 36.178 | 409,583 | 同上 (r1/r2 共通サンプラー) |
| **mean (n=2)** | **129.750s** | 36.256 (平均) | 407,650 (平均) | **max 2.57** — finalv2 r3 の 2.1-3.0 より更にクリーン |
| control 参考 (S4b on-arm / rnd off-arm) | 122.768s / 122.6467s (mean 122.707s) | 36.179 / — (gate self-eval) | — | paired alternating A/B (§3 参照) |
事前登録した 2 分岐判定のどちらにも単純には当てはまらない。(1) 「10分 cooldown で control ±1.5% に戻れば thermal drift 確定」は不成立 — finalv3 mean 129.75s は control から 5.7% 乖離したままで、cooldown 前 (finalv2) とほぼ同水準 (finalv2 as-measured 130.657s との差はわずか 0.7%)。load は同時に測った sampler 上で finalv2 r3 より更にクリーンなので、cooldown 実施・同時プロセス不在という 2 条件をどちらも満たしてなお速度が戻らなかった。(2) 「130s 圏のままなら binary/環境の恒久的変化を疑う」に従い `git log --oneline -8` と `git diff 4405bb4 HEAD --stat -- splat/` を確認したところ、S4b gate (4405bb4) 以降に `splat-metal`/`splat-train-v1` の複数ファイル (`refine.rs` +598 行など) に実コード変更 (`refine_gpu_snapshot` flag 新設、C2 施策#4) があった。しかし該当 flag の default は `false` (config.rs Default impl で確認)、かつこの機能一式が **finalv2/finalv3 と bit-identical な binary (sha256 c804b349...)** で既に組み込み済みの状態のまま `p3-refine-nondrain` gate の off-arm が同日 23:30 に **122.6467s** を記録している (§2 既存記載)。つまり『遅い』finalv2/finalv3 と『速い』refine-nondrain off-arm は **文字通り同一バイナリ** であり、コード差分では今回の +5.7% を説明できないことを再確認した。結論: cooldown 前後で速度は変化せず (thermal drift の単純な仮説は反証)、コード差分でも説明できない (binary/環境の恒久的変化の単純な仮説も反証) — 残る説明は『10 分では解消しない、より長い時定数を持つ電源/サーマル状態のヒステリシス』(`pmset -g therm` がこの機体で無効なため直接確認不能) であり、これは未解決のまま残す。 最終値としては引き続き **paired control 122.77s (S4b on-arm) を採用**する — この判断は §2/§3 の既存結論と変わらない (unpaired 単発測定は paired control に劣後する)。今後の追加検証をするなら、10 分ではなく数十分〜完全な reboot 後の cooldown で再試行するのが次の一手になる。
§8 は finalv2/finalv3 (backend flag 明示なし、default 経由で ssim_reduce=Gpu 等が効く) が paired control (backend flag に `ssim_reduce = "gpu"` を明示) より恒常的に +5.7% 遅い件を検証したが、cooldown では説明できず未解決のまま残した。本節はもう一段単純な切り分けを行う: control config (`2026-08-30-s4b-12500-on-r1.toml`) を一切変更せず (`[experiment].name`/`description`/`[output].run_dir` のみ変更、`diff` で `[data]`/`[trainer]`/`[refine]`/`[adam]`/`[backend]` が 1 バイトも変わっていないことを確認済み) 、run 名だけ `s4b-12500-on-rerun` にして今この瞬間に 1 本再実行する。結果が ~122s (元の control と同水準) に戻れば「explicit flag の有無で経路が変わっている bug」、~130s (finalv2/v3 と同水準) のままなら「環境の時間依存 drift」と判定する事前登録。binary sha256 (`c804b349...`)・git rev (`1565fcc0`) は §8 と不変。
| run | elapsed | PSNR (self-eval) | splats | pre load (1/5/15m) | post load (1/5/15m) | 同時実行プロセス |
|---|---|---|---|---|---|---|
| control 原本 (2026-08-30-s4b-12500-on-r1, 参考再掲) | 122.768s (paired) | 36.179 (gate self-eval) | — | — | — | §3 記載、A/B 交互で汚染なし |
| finalv2/finalv3 (§1/§8, 参考再掲) | 130.657s / 129.750s | 36.257 / 36.256 | 407,650 / 407,650 (平均) | — | — | finalv2: Finder 147%CPU 等。finalv3: **load はほぼクリーン (1.31-2.57) でも遅い** |
| **s4b-12500-on-rerun (本節、2026-08-31)** | **125.19s** | **36.218** | **409,606** | 1.78 / 2.05 / 3.06 | 5.29 / 2.79 / 3.17 | **`bfs -S dfs ...` (全ファイルシステム検索、他 agent の file search) が run 終盤に 500-600%CPU で実行中を `ps aux` で確認、load1 が pre 1.78 → run 中ピーク 3.87 → post 5.29 まで上昇** |
125.19s は ~122s 陣営 (+1.97%) の方に ~130s 陣営 (-3.85%) より 2 倍近く近い。加えて本 rerun は §8 の finalv3 (完全クリーンな load) より重い contamination (`bfs` 500-600%CPU) を run 終盤に受けながらも finalv3 より速く完走している。もし『今この機体は時刻に依存して一律 130s 圏まで遅くなっている』という単純な普遍的 drift が真であれば、contamination で下駄を履かされたはずの本 rerun がむしろ finalv3 を上回って速く終わる理由がない。したがって本結果は「explicit backend flag 明示の config は §8 以降も一貫して 122-125s 帯を保っており、backend flag 無指定 (default 依存) の config だけが 130s 圏に留まっている」という『flag 経路依存』説をわずかに支持する一方、rerun 自体が contamination を受けているため 122.77s ちょうどには戻っておらず、explicit flag 説を確定させるにも至らない。結論は「引き続き未確定」だが、§8 で立てた「10分では解消しない普遍的な電源/サーマルヒステリシス」という仮説の優先順位はやや後退し、次の一手としては『explicit flag config』と『default flag config』を同一 session・同時間帯・load クリーンな状態で back-to-back 実行する A/B が、cooldown 再試行より優先度が高いと判断する。milestones.md の現在地は引き続き §2/§8 の判断 (paired control 122.77s を採用) を変更しない。
2026-06 時点で卒論・戦略文書が引用してきた「本実装 11m48s(708s、Phase H 12,500 iter)/36.26dB vs msplat 3m40s(219.8s、30,000 iter)/35.48dB」(`p1-msplat-baseline-spike.toml`) は iter 数が非対称 (本実装 12,500 iter vs msplat 30,000 iter) な比較であることに加え、msplat 側の 219.8s/35.48dB 自体も init 点群・holdout・解像度スケジュールが不明な条件非対称の初期 spike 値であることが `p2-msplat-parity-lego.toml` (2026-08-16、同日・同一 init 点群・同一 evaluator の対称条件再計測) で判明している。同 finding は msplat 30K の対称値を 167.7s (n=2 mean) / native 36.53 dB / brush cross-eval (q8) 33.05-34.47 dB (非決定性 1.4dB) と確定し、219.8s/35.48dB は「条件非対称、参考」として脚注化する規約を定めた。本節は現行 HEAD (1565fcc、M4 radix_scatter=SimdBallot / A7 refine_scratch_persist,refine_direct_write=true / S4b ssim_reduce=Gpu 込みの最終スタック) で 本実装も 30,000 iter で 1 run 実行し、初めて msplat と同一 iter 数・かつ p2-msplat-parity-lego の対称値を基準にした headline 比較を作る。config は `2026-05-25-2030-lego-phase-g3-sh-progressive-30k.toml` (brush 規約: gt_convention=premultiplied、opacity_decay_rate=0.004、SH progressive init=0/max=3/unlock_interval=1000。`[trainer]`/`[refine]`/`[adam]`/`[data]` は現行 breakage screen で使用中の `2026-08-30-multiscene-drums-30k.toml` と diff で完全一致することを確認済み) を dataset_path/run_dir/name のみ変更して複製、`[backend]` は一切明示せず default に任せた。`splat check` で validate 後、pre-run に load1 9-33 (他 agent の `bfs` full-FS 検索 + 同一ユーザーの `otksynth_analyze` 別プロジェクトバイナリが同時実行中) を確認したため load1 < 6.0 が 60 秒継続するまで能動的に quiesce 待機してから起動 (pre load1 3.86 まで低下)。self-eval はトレーナー内蔵 (premultiplied 収束と同一 convention)、brush cross-eval は `splat eval --convention brush --quantize-8bit --split val` を final.ply に実行 (load 非依存の静的評価)。self-eval (premultiplied) と msplat の native/self-eval (white-bg) は convention が異なるため直接比較しない — 同一 convention での優劣判定は brush cross-eval 列のみで行う。
| 実装 / 断面 | iter | wallclock | self-eval PSNR | brush cross-eval (q8) PSNR | final splats |
|---|---|---|---|---|---|
| msplat 30K r1 (2026-08-16、p2-msplat-parity-lego) | 30,000 | 167.85s | 36.539 (native/white) | 33.049 | 190,674 |
| msplat 30K r2 (2026-08-16、p2-msplat-parity-lego) | 30,000 | 167.48s | 36.513 (native/white) | 34.470 | 194,986 |
| **msplat 30K mean (n=2、同日対称条件、比較基準)** | **30,000** | **167.7s** | **36.53 (native/white)** | **33.76 (best 34.47)** | **192,830** |
| msplat 30K 2026-06-26 spike (条件非対称、脚注 †) | 30,000 | 219.8s (3m40s) | 35.48 (native) | — | 208,215 |
| 本実装 6月時点 (Phase H 12.5k、p1-msplat-baseline-spike) | 12,500 | 708s (11m48s) | 36.26 | — | — |
| 本実装 現行最終スタック 30k r1 (2026-08-31) | 30,000 | 413.56s (6m53.6s) | 36.457 | 36.501 | 490,866 |
| 本実装 現行最終スタック 30k r2 (2026-08-31) | 30,000 | 482.96s (8m2.96s) | 36.443 | 36.486 | 488,491 |
| **本実装 現行最終スタック 30k mean (n=2)** | **30,000** | **448.26s** (σ10.95%) | **36.450** (σ0.03%) | **36.494** (σ0.03%) | **489,679** (σ0.34%) |
| 比較軸 | 旧 (非対称: 本実装12.5k vs msplat30k spike、参考・非推奨) | 新 (対称: 本実装30k vs msplat30k 同日対称条件) | 解釈 |
|---|---|---|---|
| wallclock gap (本実装/msplat) | **3.221×** (708s/219.8s、iter非対称+msplat条件非対称の二重非対称、参考) | **r1 2.466× (413.56s/167.7s) / n=2 mean 2.673× (448.26s/167.7s)** | msplat 側基準を spike (219.8s) から p2-msplat-parity-lego の同日対称値 (167.7s) に置き換え。r1 単体では 2.47×、r2 (482.96s、Spotlight 汚染疑い) を含む n=2 mean では 2.67× まで拡大する。旧 3.22× は iter 数非対称・msplat 条件非対称の二重の非対称を含むため参考値に降格、gap 算出には用いない |
| 本実装 6月12.5k → 現行30k のwallclock (本実装内の時系列比較、msplatとは無関係) | 708s (12,500 iter) | 448.26s (30,000 iter、n=2 mean) | **iter数2.4倍 (12,500→30,000) にもかかわらず wallclock は逆に-36.7% (1.58×高速、n=2 mean)** — per-iter throughput は概算 3.79倍改善 (6月17.7 iter/s → 現行 n=2 mean 66.9 iter/s)。r1単体では-41.6%/1.712×/72.5 iter/s。本行は msplat を含まない本実装内比較であり、上の wallclock gap 行 (msplat比較) とは別軸 |
| PSNR (本実装 vs msplat 30K、brush 同一convention cross-eval) | 実測なし (spike に brush ce 記録なし) | **本実装 brush ce n=2 mean 36.494 vs msplat 30K対称条件 brush ce best 34.47 (r1 33.05/r2 34.47) → +2.02dB (best比) / +2.73dB (mean比)** | 同一 evaluator・同一 convention (brush, premultiplied) での比較。msplat の brush ce は run 間で 1.4dB のブレがある (p2-msplat-parity-lego §4 非決定性) ため +2.02〜+3.45dB の幅で読む。convention 非依存の同一 evaluator 比較としてはこの行のみが優劣判定に使える |
| PSNR (self-eval/native、convention相違につき参考併記のみ・優劣判定せず) | 36.26 (本実装12.5k) vs 35.48 (msplat spike native) | 本実装 premultiplied self-eval n=2 mean 36.450 (r1 36.457/r2 36.443) vs msplat white-bg native mean 36.53 (r1 36.539/r2 36.513、p2-msplat-parity-lego) | 各実装は自分の学習 convention 下で評価されており (p1-a-3 の convention coupling)、直接比較は原理的に無効。優劣は上の brush cross-eval 行でのみ判定する |
| PSNR (本実装 現行30k vs 6月12.5k 36.26dB) | — | **+0.190dB (self) / +0.234dB (brush ce)** (n=2 mean) | iter数2.4倍・大幅高速化と両立しつつ品質もわずかに向上 (30k化・最終スタック施策の複合効果、ノイズ帯に近いが方向は正)。本行も本実装内比較で msplat とは無関係 |
| final splats (本実装30k vs msplat30k) | — | 489,679 vs 192,830 (対称mean比、**2.54×**、n=2 mean。r1単体では490,866/192,830=2.55×) | spike基準 (208,215) では489,679/208,215=2.35×だったが対称mean (192,830) 基準では2.54×とやや拡大。本実装は msplat 対称条件の2.5倍超の splat 数で高PSNR (brush convention) を達成 — 密な表現とrobustnessの傾向は従来のnarrativeと整合 |
2026-06 spike が使っていた「本実装11m48s/36.26dB (12.5k) vs msplat3m40s/35.48dB (30k)」という比較は、iter数の非対称 (12,500 vs 30,000) に加え、msplat側の219.8s/35.48dBという数値自体がinit点群・holdout・解像度スケジュール不明の条件非対称な初期spike値である (`p2-msplat-parity-lego.toml`、2026-08-16の同日対称条件再計測で判明) という二重の限定を持つ。iter数を揃え、msplat側もp2-msplat-parity-legoの対称値 (167.7s (n=2 mean) / native 36.53dB / brush ce 33.05-34.47dB) に置き換えると、比較は「本実装 n=2 mean 7m28s(448.26s)/36.45dB(self, convention相違につき参考)・36.49dB(brush ce) (30k) vs msplat 167.7s(n=2 mean)/36.53dB(native, convention相違につき参考)・33.76-34.47dB(brush ce) (30k)」に置き換えられる。gap は r1(413.56s) で2.47×、n=2 mean(448.26s) で2.67× (旧3.22×はspike基準・iter数非対称の二重非対称値であり参考扱いに降格)。PSNR は同一convention (brush) でのみ優劣を判定でき、本実装が+2.02dB(best比)〜+2.73dB(mean比)優位 — ただしmsplat側のbrush ceは非決定性1.4dBを含む。self-eval/native convention同士の比較 (36.45 vs 36.53) はconvention相違のため優劣を断定しない — p1-a-3のconvention couplingの再確認である。final splatsは489,679 vs 192,830 (対称mean比) で2.54×。卒論§5のdirect comparison表・Paretoナラティブを更新する際はこの対称断面 (msplat側も対称条件)を優先すべきである。ただし r2 (482.96s) は r1 (413.56s) より+16.8%遅く、post-run load1=24.44 (`mds_stores` = Spotlight indexing 起因と推定、機体ディスク残 1.9GiB という逼迫も一因の可能性) の影響が疑われるため n=2 σ (10.95%) は §1 の n=3 (σ1.727%) より大きい。n=2 のみでは load 汚染を統計的に切り分けられないため、公式headline化するには (1) n=3 以上への拡張 (できれば load クリーンな条件での paired 実行)、(2) msplat側の同日再実行 (p2-msplat-parity-lego と同様のinterleave手順、本節では2026-08-16実測を借用しており本実装30k runとは別日) の両方を推奨する。PSNR (self-eval / brush cross-eval) と final splats は load 非依存でσが小さく (0.03-0.34%)、こちらは n=2 でも安定した根拠として扱ってよい。「6月708s/36.26dBはPhase H 12,500 iterであり、本節の30k比較 (本実装/msplat双方とも30,000 iter) とは別条件」という点を卒論反映時にも明記すること。
§10 の含意で挙げた申し送り事項 (「公式headline化には msplat 側の同日再実行を推奨」) を実施する。msplat venv (wheel v1.1.3、`uv venv --python 3.12` + `uv pip install msplat==1.1.3 numpy pillow`、torch 不要 — msplat は Metal ネイティブ実装で `_core.cpython-312-darwin.so` を直接 import する) をスクラッチパッドに再構築 (前回 session のセッション専用パスは既に消えていたため再作成)、`docs/strategy/msplat_parity_lego.py convert` で dataset を再変換 (5207 pts の culled init.ply、100 train view の white-bg composite、常時 800×800 — p2-msplat-parity-lego と完全同一条件) し、`train --iters 30000` を 1 run 実行した。pre-run に AC 電源・`pgrep -fl "splat|msplat|python"` 空・load1 2.43 (<6) を確認済み。§10 の 本実装 30k r1 (413.56s、commit 1565fcc、2026-08-31 実行) と同じ HEAD 系列・同じ M4 Max で日付を跨いでいない (同日 01:54-01:58 実行)。brush cross-eval は §10・p2-msplat-parity-lego と同じ `splat eval --convention brush --quantize-8bit --split val` (q8 が公式値、no-quant は overshoot で 21.4dB まで崩壊し p2-msplat-parity-lego §4 の再現)。
| 実装 / 断面 | iter | wallclock | self/native PSNR | brush cross-eval (q8) | final splats |
|---|---|---|---|---|---|
| msplat 30K (2026-08-16 parity、p2-msplat-parity-lego 参考再掲) | 30,000 | 167.7s (r1/r2 mean) | 36.53 (native) | 33.05 / 34.47 (r1/r2) | 190,674 / 194,986 |
| **msplat 30K (2026-08-31 本節、同日実行)** | 30,000 | **165.65s** | **36.462 (native)** | **33.927** | **191,941** |
| 本実装 現行最終スタック 30k r1 (§10、2026-08-31 同日) | 30,000 | 413.56s | 36.457 (self) | 36.501 | 490,866 |
| 本実装 現行最終スタック 30k n=2 mean (§10) | 30,000 | 448.26s | 36.450 (self) | 36.494 | 489,679 |
| 比較軸 | 値 | 解釈 |
|---|---|---|
| wallclock gap (本実装 r1 / msplat、真の同日 n=1 対 n=1) | **2.497×** (413.56s / 165.65s) | §10 は本節の実行前に msplat 側を 2026-08-16 の借用値 (167.7s、非同日) に更新済みで gap 2.466× だった。真の同日実測 (165.65s) に置き換えると gap は **2.497×** とわずかに拡大 — msplat が今回さらに速かった (165.65s < 167.7s) ことが主因で、2026-06 spike (219.8s) 基準の旧 1.882× からは大きく拡大する。 |
| wallclock gap (本実装 n=2 mean / msplat、真の同日) | **2.706×** (448.26s / 165.65s) | §10 の 2026-08-16 借用値基準 (2.673×) からわずかに拡大。n=2 mean (r2 の load 汚染込み) を分母にすると gap はさらに拡大する。§10 の n=2 σ10.95% の議論はそのまま有効 — 保守的な (悪化方向の) 参考値として扱う。 |
| PSNR (brush cross-eval q8、同一 evaluator・真の同日) | 本実装 **+2.574dB** (36.501 vs 33.927) | p2-msplat-parity-lego §4 の convention coupling が同日 30k iter 断面でも再現: msplat は white-bg 学習のため premultiplied (brush) 評価で native (36.46) から -2.5dB 落ちる。§10 の 2026-08-16 借用値基準 (best比+2.02dB/mean比+2.73dB) と比べても、本節の真の同日値 (+2.574dB) は同じレンジに収まり、msplat 側の brush ce 非決定性 (1.4dB) の範囲内で整合する。 |
| PSNR (native/self、各実装の学習 convention) | msplat **+0.005dB** (36.462 vs 36.457、ほぼ同値) | 各実装が自分の convention で測ると真の同日 30k iter でも事実上互角 (§10 の 2026-08-16 借用値 36.53 との差も 0.07dB でノイズ帯)。品質優位の主張は native 断面では成立せず、brush cross-eval (本実装の学習 convention) でのみ成立する点に注意 (p2-msplat-parity-lego §4 と同型の限定)。 |
| final splats 比 | **2.557×** (490,866 vs 191,941) | §10 の 2.54× (2026-08-16 借用値 mean 基準) とほぼ一致。本実装は同 iter 数で msplat の 2.5 倍超の splat 数を使って同水準の native PSNR / brush 優位を達成 — 密な表現という傾向は不変。 |
msplat 30K = 165.65s / native 36.462dB / brush ce (q8) 33.927dB / 191,941 splats (2026-08-31 真の同日実測、本実装 30k r1/r2 と同一日・同一 M4 Max)。本実装 30k r1 (413.56s / self 36.457dB / brush ce 36.501dB / 490,866 splats、§10) との完全対称 gap は wallclock 2.497× (n=1) / 2.706× (n=2 mean)、brush cross-eval PSNR +2.574dB。この値は §10 が用いた 2026-08-16 借用値基準 (2.466×/2.673×、+2.02〜2.73dB) とほぼ同水準 (差 1-2%) であり、非同日借用によるバイアスは実質的に無視できる大きさだったと確認された。卒論 §5 の direct comparison 表・Pareto v3 系列の headline gap は、より厳密な根拠を持つ本節の 2.497×(n=1)/2.706×(n=2 mean) を正式値として採用すべきである。native/self PSNR 断面では両者ほぼ互角 (msplat +0.005dB) という事実は、品質優位の主張が brush convention (本実装の学習 convention) に限定されるという p2-msplat-parity-lego §4 の結論を 30k iter 断面・真の同日条件下でも裏づける。
§8/§9 は「finalv2/finalv3 (backend flag 無指定、default 経由) が paired control (backend flag に ssim_reduce = "gpu" を明示) より恒常的に +5.7% 遅い」件を、10分 cooldown (§8、解消せず) と explicit-flag config の単発 rerun (§9、125.19s、bfs 500-600%CPU の contamination 込みで断定不能) で切り分けようとしたが、いずれも決着していなかった。本節はもう一段厳密に、control config 自体 (2026-08-30-s4b-12500-on-r{1,2,3}.toml) を 1 バイトも変更せず ([experiment].name/description/[output].run_dir のみ変更、diff で [data]/[trainer]/[refine]/[adam]/[backend] が完全一致することを確認済み — splat/configs/2026-08-31-quiet-12500-r{1,2,3}.toml)、n=3 を 静穏条件を能動的に確認してから 直列実行する。事前チェック: df -h / 空き26GiB (閾値5GiB を大きく超過)、pmset -g batt series 前後とも AC Power (不変)、pgrep -fl "splat|msplat|mds_stores" は mds_stores (PID 885) のみ検出したが ps -p 885 -o pcpu で 0.0%CPU (アイドル) と確認できたため待機は不要と判断、series 開始時 load1=1.15 (<4)。splat/scripts/final-stack-n3.sh (LOAD_LIMIT=4.0 に明示指定、既存 default 6.0 より厳しい閾値) を configs/2026-08-31-quiet-12500 / quiet-12500 で起動し、各 run 前に load1<4.0 が 60 秒 (6 サンプル) 連続するまで能動 quiesce。加えて 10 秒間隔の ps aux | sort -nrk3 | head -3 サンプラーを script の load sampler と並行して独立に走らせ、各 run の pre_date/post_date epoch で window 切り出しし、同時実行プロセスの実体を記録した。binary sha256 c804b349223ffc68e9e1101d79c5ea9f058dfa8d34620504b66aa0a3eb10aa13・git rev f5b7a81987323a6f369b8d5da5da2b3621e3b8fa は series 前後・§8/§9 の rev 系統 (5c731cf/1565fcc) から splat/ crate に実コード変更なし (git log 1565fcc..HEAD -- splat/ は docs/config/log 系の 2 commit のみ) を確認済みで不変。判定は事前登録: mean が control ±1.5% バンド (120.93-124.61s、§8 で定義) 内 → drift 解消。mean が finalv2/finalv3 の ~129-130s 圏に達する → drift 継続 (session汚染起因の当初仮説が正しい可能性が高まる)。その中間 → straddle として mean±σ が両陣営のどちらと重なるか (または どちらとも重ならないか) を明示して報告し、第三の narrative を後付けしない。
| run | train elapsed (s) | self-eval PSNR (dB) | final splats | run 中 load1 (min-max, 10s sampler) | pre uptime (load 1/5/15m) | post uptime (load 1/5/15m) |
|---|---|---|---|---|---|---|
| r1 | 124.91 | 36.171 | 406,850 | 2.12-2.85 | 3.03 3.03 3.95 | 1.95 2.70 3.69 |
| r2 | 127.22 | 36.214 | 407,946 | 2.35-3.19 | 2.40 2.67 3.62 | 3.66 2.94 3.59 |
| r3 | 126.13 | 36.192 | 407,553 | 2.47-3.03 | 2.86 2.99 3.54 | 2.99 2.95 3.43 |
| **mean (n=3)** | **126.087** (σ1.156s, 0.917%) | **36.192** (σ0.0594%) | 407,449.7 (σ0.136%) | 2.12-3.19 (系列全体、finalv2 r3 の 2.1-3.0 と同水準、finalv3 の 1.31-2.57 よりわずかに高いが LOAD_LIMIT=4.0 を終始下回る) | — | — |
[backend] BackendConfig {...} ログで ssim_reduce: Gpu, radix_scatter: SimdBallot, refine_scratch_persist: true, refine_direct_write: true, refine_gpu_snapshot: false が完全一致することを確認 (§11 の「実効 flag は一致、flag 経路依存 bug ではない」を再確認)。self-eval PSNR は training log の mean val: PSNR (100 views)。σ は標本標準偏差 (n-1)。ps aux 独立サンプラーで各 run window を確認したところ、r1 の pre 直前に dj-lab (ユーザーの音声処理プロセス、§2 で既出) が PID 8971 で 22.8%CPU 検出されたがこの個体は r1 の post 時点では上位3位から消えており、その後 r2 開始直前 (2:13AM) に 別 PID (10175) の dj-lab が新規に起動し、r2/r3 の pre/post を通じて 33-40%CPU で稼働し続けた (WindowServer の系列全体を通じた baseline ~40-48%CPU は macOS の通常の compositor 負荷で、過去 finding の Finder 147%CPU/bfs 500-600%CPU のような突発的 contamination とは性質が異なる)。dj-lab の新規起動タイミングが r1 (124.91s、最速) と r2/r3 (127.22s/126.13s、やや遅い) の速度順位と符合する。事前登録した 2 分岐 (control バンド 120.93-124.61s / finalv2-finalv3 圏 ~129-130s) のどちらにも該当しない。3 run 全てが control バンド上限 (124.61s) を超えている (r1 +1.75% / r2 +3.63% / r3 +2.74%、control 122.768s 比)。mean±σ = 124.93-127.24s — この区間は control バンド (120.93-124.61s) の直上に隙間 (0.32s) を空けて存在し、重ならない。finalv2 (130.657s) / finalv3 (129.750s) の側とも重ならない (最短距離は finalv3 との 2.51s = mean+σ からの差)。相対距離で見ると、mean (126.087s) は control (122.768s) から +2.70%、finalv2/finalv3 mean (130.204s) からは -3.16% — control 側にやや近いが、control バンド自体には入っていない。§9 の単発 rerun (125.19s、bfs contamination あり) とは +0.72% で近く、本 n=3 の結果はその単発値をおおむね裏づける形になった。結論: 静穏条件 (load1 終始2.1-3.2、LOAD_LIMIT=4.0 を維持、突発的 contamination なし) を確保してもなお、control config は元の paired gate 値 (122.77s) を再現できず、恒常的に +2.7% 程度遅い状態が続いている。一方で、backend flag 無指定の finalv2/finalv3 が示した +5.7〜6.5% ほど極端ではなく、ほぼ半分程度の drift 幅にとどまる。§9 で切り分けた「explicit flag config は default-flag config より drift 幅が小さい」というパターンは本節でも再現されており (explicit flag: 122.77→126.09s、+2.70%。default flag: 124.39(M7)→130.657(finalv2)、+5.05%)、『flag 経路依存』ではなく『環境の時間依存 drift が config 種別に関わらず存在し、その絶対量が session ごとに変動する』という §8/§11 の結論を補強する。今回新たに観測された dj-lab の断続的な起動/停止 (r1→r2 の間で新規プロセスが立ち上がった) は、load average だけでは捉えきれない低〜中負荷の同時実行プロセスが依然として drift の一因でありうることを示唆するが、その寄与度を本 n=3 だけで定量化することはできない。milestones.md の「現在地」は §2/§8/§9 の判断を変更せず、paired control 122.77s (S4b on-arm) を引き続き採用する — 本節は「静穏条件でも drift は完全には消えない」という追加の計測論的事実を記録するにとどめる。次の一手としては、§9 が提案した『explicit flag config』と『default flag config』の同一 session・同時間帯 back-to-back A/B に加え、dj-lab のような低負荷バックグラウンドプロセスの有無を意図的に制御した A/B が優先度が高い。
§6 の ficus (349.63s)・materials (421.90s) の wallclock は post-run uptime で load 9.6-32.6 / 7-27 の汚染が確認され「方向感のみ」に格下げされていた。本節はゼミの多 scene 表用に静穏条件で取り直す。splat/runs/multiscene-{ficus,materials}-30k/config.toml (§6 で実際に使われた config の snapshot、元 config と diff でバイト一致を確認済み) を base に、[experiment].name/description/[output].run_dir のみ変更 ([data]/[trainer]/[refine]/[adam]/[backend] は無変更、diff で確認済み) した splat/configs/2026-08-31-multiscene-{ficus,materials}-30k-q.toml を splat check で validate。実行前チェック: df -h / 空き26-27GiB、pmset -g batt 系列前後とも AC Power、pgrep -fl "target/release/splat" 空、load1<4 が 60秒 (6サンプル×10s) 連続することを各 run 前に個別に確認 (ficus 前: 0.94-1.25、materials 前: 1.48-1.66)。完了検出は §6 の教訓 (pgrep -f の自己マッチで 10分 timeout を1回消費) を踏まえ、nohup sh -c '... ; echo $? > の sentinel ファイルを foreground until loop でポーリングする方式に変更 (プロセス名マッチを一切使わない)。加えて §13 と同様の 10s 間隔 uptime+ps aux サンプラーを 2 run の実行区間全体にわたって独立に走らせ、各 run の起動/終了 epoch で window 切り出しして run 中の load1 推移を実況で 記録した (§6 は post-run uptime の単発値のみで in-run 推移は無かった)。2 run は直列実行 (ficus → 完了確認 → 60秒 quiesce 再確認 → materials)。binary sha256 c804b349223ffc68e9e1101d79c5ea9f058dfa8d34620504b66aa0a3eb10aa13・git rev 63266e409404dd7cdc9cd109b2a17944781f9ca1 は §6 (binary sha 同一値) 以降 splat/ crate に変更なし (docs コミットのみ) で不変。抽出は §6 と同じ 3 フィールド — training done in Xs (wallclock)、mean val: PSNR X dB (100 views)、final splats: X — をログから読み取り、result.toml [metrics] と一致することを確認した。ficus の 1 回目 (以下 q1) で PSNR が baseline から -1.4dB 台乖離する事象が生じたため、コードの RNG (StdRng::seed_from_u64(cfg.output.seed)、run 名/run_dir に非依存であることを grep で確認) を排除した上で、同一 config を -q2 として複製・再 quiesce・再実行した (追加の n=1、直列)。
| scene | baseline PSNR (2026-05-25) | 初回 PSNR (§6、2026-08-31) | 静穏 run の PSNR (参考、variance観測) | baseline wallclock | 初回 wallclock (§6、load汚染) | 静穏 wallclock (正式値) | 静穏 run 中 load1 (min-max) | baseline splats | 静穏 splats |
|---|---|---|---|---|---|---|---|---|---|
| ficus (227k) | 34.281 | 34.261 | q1 32.836 / q2 34.279 | 1300s (21m40s) | 349.63s | **254.09s (q1) / 256.21s (q2)** | q1: 0.81-1.62 (終始クリーン)。q2: 0.94-4.79 (iter中盤に mds/cargo 由来の短時間スパイクあり、LOAD_LIMIT=4.0 を一時超過) | 226,749 | 228,147 (q1) / 228,595 (q2) |
| materials (355k) | 30.025 | 29.998 | 29.997 | 1846s (30m46s) | 421.90s | **319.54s** | 1.18-2.07 (終始クリーン) | 349,784 | 354,917 |
静穏 config は diff で [data]/[trainer]/[refine]/[adam]/[backend] が §6 の config と完全一致 (name/description/run_dir のみ変更) しており、BackendConfig ログも一致するため config 起因ではないことは確認済み。コードの RNG は StdRng::seed_from_u64(cfg.output.seed) (config の seed フィールドのみに依存、splat-cli/src/cmd/train.rs) で、run 名や run_dir をハッシュに含む経路は grep で確認した限り存在しない — 「run_dir の違いが結果に影響した」という仮説は事前に排除した上で、同一 config を -q2 として再度 splat check validate・quiesce (60秒 load1<4) を経て再実行した。結果は 34.279dB (baseline 34.281dB 比 -0.002dB) で、q1 の -1.4dB 台とは全く異なり baseline/§6 と整合した。final splats も q1 228,147 / q2 228,595 と近く (0.2%差)、wallclock も q1 254.09s / q2 256.21s と近い (0.8%差) — 不安定だったのは PSNR のみで、wallclock・splats は 2 run で再現性がある。事前登録した 2 分岐のうち「~34.2 に着地」が的中したため、「ficus は GPU 非決定性に特に脆弱な scene である」という強い仮説 (機構の特定) は撤回する。q1 の -1.4dB 自体は a-10-variance-baseline が報告する SIMD backward の atomic_fetch_add 順序非決定性 (→ refine の split/clone 判定 flip → splat trajectory 分岐 → PSNR drift) の一事例である可能性が高い。ただし機構の特定とは別に、§6/q1/q2 の同一 modern-stack config・3 run で観測された range は 1.443dB (34.261/32.836/34.279) であり、これは a-10 が Lego 30k・4 run で確立した range 0.885dB の 1.6 倍 — materials の同条件 3 run range (0.028dB) とは対照的に、ficus では a-10 の σ±0.32dB / range 0.885dB を「退行判定の noise floor」としてそのまま転用するのは無効である。§6 の「3 scene とも ΔPSNR は σ±0.32dB の1/10以下」という記述、および §6 退行判定callout の「±0.1dB を超えたら scoped gate」という基準は、ficus に限っては n=1 の ΔPSNR -0.020dB がこの range (1.443dB) 内に埋もれる程度の情報量しか持たないことを意味する — M4/A7/S4b が PSNR-neutral な設計 (grad/param 更新を変えない) であるという §6 の結論そのものは変わらないが、「ficus の n=1 ΔPSNR が小さいことをもって退行なしと確度高く言える」という強さの主張はできない。本 finding では追加 run による σ の確定は行わない (観測された range を記録し、multi-scene gate 閾値の見直しが必要という指摘にとどめる)。
この finding が観測された / 言及している実験 run。