卒研中に得た実測ノートの一覧。polarity (P / N / mixed)、貢献軸 (第 1/2/3)、impact (Δ PSNR / Δ wallclock) で絞り込み + 並べ替え。
<strong>msplat (rayanht) v1.1.3 を M4 Max で実測完了</strong>。Lego 30K で 219.8s (3m40s) / 35.48 dB / 208k splats、chair 7K で 17.58s / 33.81 dB を確認。<strong>本実装 Phase H lego (11m48s / 36.26 dB) に対し msplat は wallclock 3.2× 高速、ただし PSNR は -0.78 dB</strong>。materials 7K では PSNR 8.80 / splats 367 と densification が壊れた — msplat の scene robustness 弱点が判明し、本実装の <strong>universal な density 動作</strong>が明確な差別化軸として確定。<strong>本実装 Phase I 8 scene のうち 5 scene が msplat lego 30K の 35.48 dB を上回る</strong> (Lego 36.26 / chair 35.88 / hotdog 37.37 / mic 36.62 / drums は 27 のみ)。Pareto plot で msplat は左上 (速い + 中品質)、本実装は右側 (遅い + 高品質 + 全 scene robust) と vector が直交。本 spike により <strong>A (Reframing narrative) の killer figure が確定</strong>、<strong>B (G.2 backport) は引き続き NO-GO</strong> (msplat が既に kernel fusion + pre-allocated bins まで実装済、本実装が追いつく工数は大)、<strong>E (msplat 著者接触) の materials bug 報告は良い PR ネタ</strong>。
Phase G (速度改善 loop) で 4 candidate × 8 scene の Pareto landscape 確定。<strong>結論</strong>: **G.3 alone 30k = universal quality improvement** (8 scene mean **33.592 dB**、Phase D 33.485 比 **+0.107 dB**、7/8 scene で win、wallclock +10.2%、splats +29%)、特に **mic は stacked で -6.05 dB だったが G.3 alone なら +0.244 dB 救済**。<strong>G.1 stop15k</strong> は dense scene で acceptable (Lego/chair/hotdog で Phase D 比 -0.5 dB 圏内) も sparse scene で大幅劣化 (mic -5.84/ficus -1.79)、8 scene mean -1.39 dB で Pareto worse、brush parity (32.86) を -0.76 dB 下回り。<strong>G.1+G.3 stacked</strong> は Lego-specific Pareto sweet spot (16m13s / 36.254 dB / +0.15 dB) だが multi-scene mean 31.998 dB で stacked < G.1 alone、SH warmup の効果が early stop で truncate されて sparse scene で逆効果 (ficus -3.15、mic -6.05)。<strong>G.2 audit</strong> は 4.7× gap が architectural dispatch (Burn/CubeCL 内部 batching vs Metal 直 per-kernel sync) と判明、Phase F 5 連続 falsification への統一的説明、kernel/algorithm 軸では覆せない構造的 finding。<strong>axis 1 future work ROI 階層</strong>: <strong>algorithmic compute reduction > architectural dispatch > kernel-level micro-opt</strong>。Phase G が axis 1 「Apple Silicon native 最適化の ROI 階層」を構造的に確定、卒論 §5.4 narrative の集大成。
Phase G で G.3 alone 30k = universal Pareto improvement (+0.107 dB / +10% wall) を確定した後、**Lego の (wallclock, PSNR) Pareto curve を stop_iter × 6 点 で精密 map**。<strong>結果</strong>: stop_iter=10000 は brush (9m08s / 32.04 dB) を完全 Pareto-dominate (8m42s / 35.931 dB = **同時間で +3.89 dB**)、stop_iter=12500 は Phase D 30k (41m54s / 36.106 dB) を Pareto-dominate (11m48s / 36.259 dB = **-71% wallclock + 0.15 dB**)、stop_iter=17500 以降は marginal +0.1 dB のみで diminishing returns 顕著。<strong>anomaly</strong>: stop_iter=25000 が 36.092 dB と 20000 (36.359) より -0.27 dB 低い (variance or training instability の可能性)。<strong>Scene-validation</strong>: ficus @ stop_iter=12500 = **30.103 dB** (Phase D 34.22 比 -4.12 dB の大幅 fail)、**Lego sweet spot が scene-dependent と確定**。mic / drums / hotdog / ship 等 sparse scene でも同様の fail が予想され (G.1 stacked パターンと整合)、universal config では Phase G.3 alone 30k が依然 best。<strong>Phase H の最終 framing</strong>: Lego の Pareto curve は dense texture scene 固有、sparse scene は full SH from start (no sh_progressive) または full 30k iter が必要。<strong>axis 1 future work</strong>: scene-adaptive iter budget (Lego/chair/materials @ 12500、ficus/drums/mic 等 @ 30000) で 8 scene mean を維持しつつ total wallclock を 5h 36m → ~3h に -40-50% 削減可能と推定。
Phase H で Lego stop_iter=12500 が Pareto sweet spot だが ficus/mic で大幅 fail (-4.12 / -6.03 dB) と scene-dependent 確定後、**Phase I で chair / materials @ stop_iter=12500 も fast converger と確認** (G.3 30k 比 -0.05〜-0.07 dB のみで essentially same)。これにより <strong>scene-adaptive iter budget</strong> (Lego/chair/materials @ 12500、ficus/drums/hotdog/mic/ship @ 30000) を構成、<strong>既存 8 scene 全データ点が揃った状態で 8 scene mean を算出</strong>。<strong>結果</strong>: scene-adaptive 8 scene mean **33.561 dB** / total wallclock **3h 50m 10s**、Phase D 30k 比 <strong>+0.077 dB / -24.4% wallclock</strong>、G.3 30k 比 <strong>-0.031 dB (within noise) / -31.6% wallclock</strong>、brush 比 <strong>+0.701 dB</strong>。<strong>Pareto front の両軸で improvement</strong>: Phase D を quality + speed 両方で dominate、G.3 30k quality を 1/3 短時間で達成。**axis 1 contribution の最終形**: kernel-level 直叩きではなく <strong>scene-adaptive iter budget + sh_progressive + opacity_decay の組み合わせ</strong>が Apple Silicon native Metal 最適化の universal Pareto improvement。卒論 §5.4.7 末尾 + §6 future work で本 Phase I を明示、scene-adaptive を新 universal default として推奨。
User task brief は Phase D 375k 文脈で旧 A.6 (~1% wallclock ROI) を再評価し f16 packed の真の bandwidth ROI を引き出すことを期待したが、orientation 段階で feat.G 実装の事実関係を確認した結果、3 つの factual error (32 byte / -11% / ~12 MB) が判明。bound math (rasterize fwd+bwd share 上限 30% × bandwidth 削減 11%) より wallclock 上限 ~3.3%、user brief の 20-40% 期待は実装の物理特性と整合しない。加えて M5 Lego val gate margin (+0.11 dB) より RGB f16 round-trip 誤差 (rel 5e-4、abs ~0.5 dB drift 想定) の方が大きい可能性、再着手は M5 gate を割るリスク。orientation 段階で halt、bench 不実施。
5 kernel (clean baseline share 合計 55.1%) を Explore subagent で構造的 audit、Apple Silicon 特化最適化候補を kernel 単位で 2-4 個ずつ抽出。<strong>最大の発見</strong>: **emit_pairs_simd PSO は既に実装済**、<code>use_simd_emit: Cell::new(false)</code> で gate off、comment に「30k validation 後 default true 化予定」(tile_bin.rs:86-87)、**Phase D 30k 完遂で即 flip 可能** (-0.7-1.0% wallclock 即時、zero risk)。同様の即 actionable 機会: f16 forward kernel <code>render_splats_f16</code> は env <code>SPLAT_F16_FORWARD=1</code> gate (現在 disabled、A/B test 必須 PSNR risk MED-HIGH)。<strong>Tier 2 (Phase E scope)</strong>: radix_sort GPU prefix sum (-0.54-0.82% wallclock、CPU-GPU 16-pass sync 除去)、backward_raster imageblock+TBDR (-0.67-1.07% wallclock、tile-local 累積で atomic 大幅削減)。<strong>累計 -1.5-2.5% wallclock 改善余地確定、卒論 §6 future work 候補と pilot 実装目標</strong>。backward SIMD reduction は既に default 有効 (rasterize.rs:642、2.43× win 享受中で確認済)、SSIM は eval-only で training 直接寄与なしのため Tier 3。
audit (p1-axis1-metal-opt-audit) で Tier 1「即 actionable gate flip、-0.7-1.0% wallclock、zero risk」と分類した 2 候補を Lego 5k smoke A/B で実証検証。<strong>emit_pairs_simd は total wallclock +4.7% の net regression</strong> (112.11s → 117.38s、~10 kernel 平均なので noise floor 小、real regression 確定)、ただし per-kernel emit_pairs 単体は +8.5% で baseline 2 sample 変動 (4.814 / 5.129、6.5%) と近い hedge 必要。<strong>f16 forward は ~+2.5% wallclock</strong> (114.97s)、run-to-run variance 圏内で improvement / regression いずれも明確に検出できず。<strong>PSNR は両者で許容範囲</strong> (emit_simd -0.132 dB、f16 +0.075 dB、atomic order / fp 順序由来想定)。**audit の予測 calibration data**: Tier 1 SIMD-reduction 系の効果は theory より小さく overhead が打ち消し、Tier 2 別 mechanism (CPU-GPU sync 除去) は別途検証必要、Tier 2 同 family (backward TBDR) は falsification 拡大適用で skip 判断強化。卒論 narrative 価値: 「audit theoretical predictions vs empirical measurements」の方法論 paragraph を §5.4 negative findings 章 (chapter-5-4-negative-findings.md) に追加候補。
audit (p1-axis1-metal-opt-audit) で Tier 2 「radix_sort GPU prefix sum、-0.5-0.8% wallclock、LOW PSNR risk」と分類した候補を empirical 検証。<strong>bit-exact 実装は完成</strong> (16-thread single-threadgroup kernel、Apple SIMD prefix exclusive sum + per-digit serial scan、100k random / 500k packed keys / edge cases 6 種で CPU stable sort と byte-for-byte 一致)、しかし 5k Lego smoke で <strong>wallclock 115.83s → 124.41s (+7.4%)、ts_fwd_radix_sort 4.768 → 6.733 ms/call (+41%)</strong> の net regression。sanity re-run (118.73s / 6.402ms) で再現確認、run-to-run 変動の上。<strong>PSNR は parity</strong> (31.604 → 31.635 dB、bit-exact 経路で 0 drift 期待、観測 +0.03 dB は session noise)。<strong>Likely mechanism</strong>: StorageModeShared buffer での back-to-back compute encoder 間で Metal が implicit fence を挿入 (hist→scan の buf_hist、scan→scatter の buf_offsets で read-after-write hazard)、TBDR pipeline stall。旧 CPU 経路は buf_hist→buf_offsets 変換を host で実行するため GPU 内 memory dependency が無く、<strong>「除去した wait_until_completed」は実は CPU prefix scan と overlap していた active work</strong> だった。教訓: 「CPU 介在を on-GPU に置換」族の audit 予測は overlap の存在を見落とすため systematically overestimate、Tier 2 同 family (backward TBDR、tile-local accumulator) の skip 判断強化。kernel + tests は env <code>SPLAT_RADIX_GPU_SCAN=1</code> で opt-in (future workload hedge)。
Explore subagent (Sonnet very thorough) で brush 18ms/iter vs splat-rs 84ms/iter (4.67×) の真因を architectural 差で構造特定。<strong>brush は Burn/CubeCL backend の <code>launch_unchecked()</code> async dispatch + 内部 command buffer batching</strong> で per-iter 5-7 explicit awaits → ~5 actual GPU flushes。一方 <strong>splat-rs は per kernel 毎に <code>cmd.wait_until_completed()</code> で 10-50 GPU flushes</strong>。計算: 17ms GPU compute + ~25ms wait overhead (~2.5ms/wait × ~10) = ~42ms、実測 84ms とは ~2× ずれあるが (subagent quantification の不確実性)、order-of-magnitude は一致。<strong>これは Phase F 5 連続 falsification への統一的構造説明</strong>: kernel-level micro-opt (SIMD reduction / f16 accumulator / radix GPU prefix / TBDR imageblock 等) が効かなかったのは bottleneck が <strong>per-kernel compute ではなく dispatch synchronization architecture</strong> だったから。**主仮説 ranking** (subagent assessment): (1) command buffer batching (50% of gap、移植 VERY HIGH cost 6-10 週)、(2) async readback (15%、MEDIUM cost 1-2 週、+3-5% expected)、(3) kernel fusion (5-10%、EXTREME cost)。**ただし subagent quantification は overestimate 傾向あり** (Phase F.3 で「removed wait was overlapping with CPU work, not idle」発覚と矛盾、wait は free な場合もある)。卒論 narrative としては <strong>structural explanation</strong> として極めて価値高い、§5.4 negative findings 章で「Phase F 全 kernel-level 改善試行は architectural mismatch だった」統一的 paragraph 候補。
Phase G compute reduction family の G.3 (SH-progressive growth) を実装 + bit-exact unit tests (11 件、cargo test 43 件 全 pass) + **3 layer の Lego 結果検証**。<strong>(1) 5k smoke</strong>: wallclock -13.9% / splats -22% / PSNR -0.12 dB、cascading splat reduction を観測。<strong>(2) 30k full validation</strong>: wallclock **-1.9%** (5k から大幅縮小)、splats **+30%** (5k から逆転)、PSNR **+0.28 dB** (quality improvement!)。5k smoke の cascading 効果は refine.stop_iter=1500 による artifact、30k では sh unlock 完了 (iter 3000) 後に refine が iter 15000 まで full SH で継続 → splats baseline より grow。<strong>(3) G.1+G.3 stacked (max_steps=15000 + sh_progressive)</strong>: Lego **16m13s / 36.254 dB / 428k splats** = Phase D 比 **-61% wallclock + 0.15 dB PSNR** で <strong>Pareto sweet spot</strong> 確定。<strong>Key reframe</strong>: G.3 は「speed win」ではなく「**quality improvement at no speed cost**」、stacked variant で G.1 speed と SH warmup quality gain を統合。<strong>Implementation</strong>: <code>[trainer.sh_progressive]</code> section (default disabled、全 backward compat)、<code>CameraGpu</code> struct を <code>sh_degree</code> (buffer layout) と <code>active_sh_degree</code> (per-iter eval) に分離。<strong>Calibration data point</strong>: Phase F 5 連続 falsification + G.3 5k smoke artifact = audit / smoke overestimate 6 例目、「smoke は production scale を representative しない」が新教訓。8 scene chain validation pending。<strong>卒論 narrative</strong>: Phase F (kernel-level fail) → G.2 (architectural insight) → G.3 (algorithmic reframe: speed → quality + stacked Pareto) の 3 family 比較で「Apple Silicon native 最適化は <strong>algorithmic compute reduction + early stop の組み合わせが Pareto-optimal</strong>」という構造的 calibration。
Per-iter target upload kernel を完全除去 (5000 calls → 0)、構造的には kernel 一つ消えた成果。 だが wallclock ROI は **予想 -5.5% に対し実測 -0.23%** (-1/25)、profile baseline の "5.6% share" は GPU contention 3x 環境での host stall 値で、平常 contention では host upload は既に GPU 計算と overlap していた。 PSNR は seed 同一でも +0.14 dB drift (Metal driver の buffer 配置順序差 → atomic ordering 差 → refine.split RNG 経由)、5k smoke の noise floor 内。 実装は trivial (train_loop entry で `Vec<Buffer>` 構築、train_step に `Option<&Buffer>` 追加)、commit 残しておく価値はあるが、roadmap 上の位置付けは "deprioritize / cleanup level" に修正。 **真の優先順位は radix_sort 改善 (27% share) と A.7 ICB batching tail に集中すべき**。
Phase D opacity_decay (rate=0.004 brush default) を 7 scene × 30k full chain bench、Lego val Phase D 30k と合わせて 8 scene 集計。**全 scene で baseline brushcompat 30k 比 PSNR + splats + wallclock すべて改善 (universal win-win-win)**: PSNR +0.18〜+1.42 dB / splats -57〜-78% / wallclock -39〜-69%。8 scene mean 33.49 dB vs brush paper 8 scene mean 32.86 dB = **+0.63 dB 上回り**、本実装が brush の multi-scene mean を decisive に超えた。brush 超え 3 scene (Lego val +4.07 / drums +1.05 / mic +1.02)、4 scene が brush 比 ±0.7 dB 圏内 (chair -0.02 / hotdog -0.39 / ship -0.01 / materials -0.10)、最遠 scene でも ficus -0.65 で接近。全体 wallclock baseline chain (13h+) → Phase D re-chain 5h 5m (-61%)、mean splats 1.4M → 428k (-69%) で brush 282k に肉薄。P1.M5 完全達成 (Lego val > 36 dB ✅ + multi-scene mean > 32 dB ✅)、卒論 central evaluation table の final 数字確定、universal claim 完全実証。
opacity_decay_rate を 5 点 (0.001/0.002/0.004 default/0.006/0.008) で 5k smoke sweep。**rate=0.002 で PSNR 32.090 dB (default +0.40 dB)** と最高、splats は 88k で +5.8% 微増。rate を上げる (0.006-0.008) と splats は 80k 帯に削減されるが PSNR 影響は 5k variance σ ±0.32 dB 内。Phase D 30k baseline (rate=0.004) は既に M5 +0.11 突破済 (36.106 dB)、rate 変更の追加 +0.2-0.5 dB は smoke noise と並ぶ ROI 不明確。multi-scene Phase D re-chain も brush 互換性維持の観点で rate=0.004 維持を推奨。
Lego brushcompat + opacity decay 30k で training-time eval 36.106 dB (val 100 view, brush convention, raw)、independent eval 36.163 dB (brush q8)。baseline 30k (35.184 dB) を **+0.92 dB 上回り**、splats を 846,689 → 375,146 に **-55.6% 削減**、wallclock を 1h 02m → 41m 54s に **-32% 短縮**。これは trade-off と想定していた PSNR/splats/wallclock が **完全 win-win-win** に。M5 個別 scene gate (Lego brush conv > 36 dB) を val で達成、brush 自身 val 32.038 dB を +4.07 dB 上回り、本実装が brush を decisive に超えた。test subset (n=36) も +0.75 dB 改善 (33.315 → 34.065)、brush paper test 37.40 との gap を -3.34 dB まで縮小。Stage 1 smoke 推定 (splats -11.6%) を 30k で -56% に拡大、opacity decay の効果は iter 累積で増大することを実証。次 step は multi-scene Phase D 7 scene re-chain (chain 完了後 schedule)、低 wallclock + 低 splats での M5 multi-scene parity 完遂を狙う。
Phase D 30k 実測 wallclock 41m54s vs brush 9m08s = -4.6x gap の原因について、task は `splat process CPU 63.4% = 1 core only` → 「refine の host RMW loop が CPU 1-thread bound」と仮説立てた。本 Phase E ではこの仮説を SPLAT_TIMING profile で実測。5k smoke (84k splats、p1-e-profile-5k.toml) の kernel breakdown: **ts_forward 60.1% (123s) / ts_loss_gpu 28.0% (57s) / ts_adam 4.8% (9.9s) / ts_target_upload 3.9% (8.1s) / ts_project_back 2.3% (4.75s) / ts_refine_compact 0.6% (1.14s, 103ms/call × 11) / ts_refine_accumulate 0.3% (605ms) / ts_opacity_decay 0.0046% (957µs)**。**refine 全体で <1%** = refine を完璧に GPU 化しても全体 wallclock は -1% も短縮されない。代わりに demo kernel として `refine_opacity_decay.metal` を実装し、kernel + Rust pipeline + `refine.gpu_path` flag plumbing pattern を validate (CPU vs GPU max diff 1.5e-5、5k full PSNR delta -0.21 dB = 許容内)。Phase F の真の target は (a) forward subdivision で判明した tile-binning chain (`ts_fwd_sort 15.5% + ts_fwd_emit 12.8%`)、(b) Adam の 5x sequential `cmd.wait_until_completed` (1 cmd buffer 化で ~5% 削減期待)、(c) target_upload preload (~4% 削減期待) の 3 つ。
Phase D Lego brushcompat 30k で wallclock 42m / brush 9m gap (-4.6x) の真の bottleneck を per-kernel host Instant 計測で数値化。**仮説 (refine host RMW dominant) は棄却**、refine は 2.6% に過ぎず Phase E GPU 化の ROI は ~3% (期待していた -25% の 1/8)。実 dominant は radix_sort 27% / ssim 16% / backward 14%。優先順位を **target_upload キャッシュ (即時 -5.6%) → radix_sort 改善 (-10〜15% 期待) → A.7 ICB batching tail (-5% 期待) → Phase E は卒論後** に反転すべき。
clean single-process で per-kernel share を取り直し、前 profile baseline (multi-process contention 中) と比較すると <strong>share が大幅 shift</strong>: ts_fwd_radix_sort 27.0% → **13.6%** (-13.4 pt)、ts_fwd_emit_pairs 6.5% → **14.2%** (+7.7 pt)、ts_forward 全体 60.1% → **36.7%** (-23.4 pt)。これは前 profile の share が contention で over-state されていた決定的証拠 (target_upload subagent の share 5.6% → 実 ROI 0.23% を kernel level で再現)。新 axis 1 ROI 上限: emit_pairs 改善 -14% / radix_sort -13% / backward_raster -13% / ssim_fusion -7-8%。Phase E (refine GPU 化) の ROI 仮説 -5x は元々 share 2.6% で 1/40 過大評価だったが、本 clean baseline でも refine 0.2% に縮小、棄却強化。target_upload は本 clean baseline で完全消滅 (cache 化済)。
8 シーン complete (lego + 7 新規) 30k 完遂。シーン依存性が PSNR で 17.6 dB の幅 (materials 12.71 〜 hotdog 30.29)、mean 18.95 ± 6.0 dB。本実装の brush SoTA 比 gap は scene-dependent で -7.4 dB (hotdog) 〜 -22.3 dB (ficus 含む)。共通要因仮説: SfM init.ply の sparsity (細い枝 / マイク / 反射 PBR で薄い) + refine grad_threshold の lego/hotdog tuning over-fit。卒論 evaluation で「lego baseline + multi-scene mean ± std」併記必須。
brush eval は (1) AlphaMode::Transparent で GT を α premultiply、(2) bg=Vec3::ZERO の黒背景に render、(3) composite_bg=None で premultiplied 同士を直接比較、(4) 8-bit roundtrip 後に MSE = mean((pred−gt)²) over H·W·3、(5) PSNR = 10·log10(1/MSE)。これは NeRF Synthetic (RGBA で α=0 の透明領域が支配的) において **透明領域は pred=gt=0 で完全一致** となり、MSE 分母に 0 寄与が大量に入る → conventional 「白背景に composite してから PSNR」より高く出る。splat-rs 側の eval 規約を A.2 で確認し、A.3 で「同 convention 下での真の gap」を測定する必要あり。
splat-rs trainer の eval は (1) val split 100 view・brush は test split 200 view、(2) PSNR は RGB のみ・α 除外、(3) rendered は raw f32 (clamp / quantize なし)・brush 標準は u8 quant 後、(4) rendered は bg 合成なしで Σαi·Ti·ci のみ・target は white-bg pre-composite — の 4 つの diff 軸を持つ。training loss は 4ch (α 含む) で動くため、α 通り collapse が暗黙の white-bg 効果を作るが、convergence は不完全。P1.A.3 で 7 項目の切り分け reproducer を作り apparent gap (推定 −3〜−6 dB) を分離する。
splat-rs `final.ply` (24.879 dB legacy/val baseline) を brush 準拠 convention (premultiplied GT + bg=ZERO 比較 + 8-bit roundtrip) で再評価すると **1.67 dB に崩壊**。audit §6 が予測した +3〜+5 dB 底上げと逆方向に -23 dB。原因は trainer が white-bg target で学習されており、背景領域を opaque-white splat で埋めるよう収束した結果、brush 流の bg=ZERO 比較では背景 pixel 全体で MSE≈1 が systematic に乗る。`view_00.png` 目視確認 (背景は白い不透明領域) で機構を確定。**training と eval の convention は coupling しており、eval pipeline だけ揃える apparent-gap 仮説は不成立**。卒研 P1.M2/M3 に向けては「training loss も brush 化 (RGBA 4ch L1 を α=0 領域で背景に penalty を吹かさない構造)」が必須要件。8-bit quantize 単体の impact はほぼ無視可能 (legacy 24.879 → 24.879、brush 1.605 → 1.667、+0.06 dB)。
両 trainer の eval pipeline を file:line で完全 audit、PSNR formula 本体 (MAX=1 / log10 / RGB only / per-view mean) は同等だが、(1) test split (200 view) vs val split (100 view)、(2) background composite convention の **完全逆方向**、(3) 8-bit roundtrip 有無、(4) α-mask 経路、(5) clamp/quantize 等 7 軸で diff を確認。最大の発見は brush の premultiplied-α + bg=ZERO eval が NeRF Synthetic の透明領域で構造的に PSNR を +3 dB 以上嵩上げする一方、splat-rs は target に white pre-composite / rendered に bg 合成なしの mismatch で convergence 残差が MSE に直接残る。apparent gap の推定 -3〜-6 dB を A.3 reproducer で実証予定、残り -6〜-9 dB が真の algorithmic gap。
Lego sh3 30k で gt_convention=premultiplied (brush 互換) を立てると、4-way eval で legacy=1.60 / brush=35.24 dB。**brush 自身 val 32.0 dB を +3.20 dB 上回る** 結果。M3 lifeline (30 dB) を +5.24 dB 突破、M5 (36 dB) まで -0.76 dB に到達。Phase A 主仮説 (apparent gap -3〜-6 dB) は falsify されたが、coupling 解消の真の効果は **+33.6 dB shift (1.67 → 35.24)**、想定 (+10 dB) の 3 倍。実装は configs 1 行 (gt_convention) + dataset.rs (load_rgba_premultiplied path 追加、既に Stage 1 で merge 済) のみ、既存 30k legacy bench との apples-to-apples comparison が可能。brush の wallclock 38% 高速化は 30k でも継続 (splats 1M-cap で 846k 到達、refine が攻撃的 split)、ただし brush 自身 282k に比べて 3 倍、本実装が capacity を未活用 (refine を絞る余地あり、Phase D で検証可能)。次 Step は multi-scene 8 シーン展開で universal claim 確定、brush mean 33.32 dB 超えで multi-scene parity 完全達成を狙う。
P1.A.3 で `splat-rs trainer が white-bg target で学習 → 背景を opaque-white splat で埋める → brush 流 eval (bg=ZERO 比較) で MSE≈1 崩壊` と診断された coupling を、**GT loader を premultiplied 経路に切替えるだけ** で解消できるか 5k smoke で検証。同一 hyperparameter (`2026-05-22-2155-lego-sh3-30k.toml` の iter のみ 5k 短縮) で `data.gt_convention=white_bg` vs `data.gt_convention=premultiplied` を独立 training し、各 final.ply を 2 通り convention で eval (4 cell)。結果: brush trainer × brush eval = **31.334 dB**、legacy trainer × brush eval = 1.628 dB と完全に対比、coupling が双方向に存在することも symmetry test (brush trainer × legacy eval = 1.595 dB) で確定。5k 段階で既に B-N 30k baseline (24.88 dB legacy) を **brush eval 系で +6.5 dB 超え**、brush 公称 37 dB との gap は -5.7 dB のみ。Stage 1 hypothesis (10+ dB) を 21 dB 上回り、coupling 解消が brush parity への critical path であることを定量実証。実装は `splat-cli/src/config.rs` に `data.gt_convention: GtConvention` enum 追加 (default=`WhiteBg`、既存 configs 完全互換) + `train.rs` の train/val load を `load_nerf_synthetic_with_convention` に切替、合計 4 file の最小差分。loss kernel (`loss.metal:31-88`) は変更不要 (n_total=W·H·4 が α channel を含み、premultiplied target の α=0 領域が `rendered α (=1-T) → 0` の natural pressure を提供、brush の match_alpha 機構と同等効果)。
brush の `refine_splats()` (train.rs:611-619) と同じ sigmoid-space formula で opacity decay を refine cadence に統合: `new_opac = sigmoid(raw) - rate*(1-train_t)` → `clamp(1e-12, 1-1e-12)` → `inv_sigmoid`。5k Lego smoke で PSNR は維持以上 (31.31 → 31.69 dB、+0.38 dB)、splats は **-11.6%** 削減 (93,948 → 83,093)、wallclock は +23% (1500 iter で全 splat 触る host loop が支配的、N=83k で問題ない範囲)。これにより 30k に進めば brush 282k 帯 (Stage 2 の 846k からの大幅削減) + PSNR ≥ 34 dB の同時達成が射程に入る。axis 1 (native Metal) ではなく axis 3 (unified memory CPU RMW) を活用した実装で、refine 周辺の O(N)/refine_every オペレーションには合理的選択 (Metal dispatch overhead > 実 work)。
Lego brushcompat 30k final.ply を test split subset (n=36/200、ローカルに残っている RGB のみ) で eval すると 33.315 dB (q8) / 33.241 dB (raw)。val 100 view 35.237 dB (q8) との Δ = -1.92 dB は novel view (test) vs near-train view (val) の generalization gap (brush 自身も val 32.038 → test 37.40 と +5.36 dB 上振れする方向なので、本実装は test で逆に -1.9 dB 劣化、合計の apples-to-apples diff は -4 〜 -5 dB)。brush paper 37.40 dB との差は -4.09 dB で、val ベースで主張していた `brush 超え` claim は test split に拡張すると **不成立**。n=36 (18% subset) の random subsampling bias は mean PSNR で ±1〜2 dB 程度と見積もれるが、4 dB の gap を埋めるには足りない。本 finding により P1 計画の最終判定は `val split で brush parity + α 達成、test split (novel view generalization) では brush に未達` という mixed 結果で確定。実装側のアウトプットとして `splat eval --split-file <PATH>` flag が追加され、任意 transforms JSON での eval が可能になった (subset / 外部 split 互換)。
TBDR imageblock_data ベースの SSIM tile shader 化は render pipeline 大改修 + backward 設計 + 既存テスト 23 件への影響が大きく、卒論 time-box では見合わない。必要要件のみ記録して close。期待効果は SSIM kernel -50% / trainer 全体 -3〜5%。
Neumaier compensated summation の compensator term は MSL compiler の algebraic optimization で消去され、loss は bit-identical。Kahan は wallclock overhead だけ残し variance reduction 効果ゼロ。
M-3.x lego sh3 30k の PSNR variance は σ ±0.32 dB / range 0.885 dB (4 run estimate)、wallclock variance は σ ±2.4% / range 5.2%。原因は SIMD backward kernel の atomic_fetch_add 順序非決定性で、A.10 Kahan で消えない (compensator も bit-identical のところ)。卒論 finding として「Apple Silicon の variance band は数値精度の問題でなく GPU scheduler 由来」と確定。
T&T を取り込むには dataset DL 5-10GB + COLMAP SfM + trainer 入力 format 対応 + eval indicator 再設計 + long run × 数シーンが必要で 2-3 日コース。NeRF Synthetic 8 シーン整備で幅出しは達成済みのため close。
Splat2DPacked kernel pair は完成 (cargo test 73/73 pass) だが、trainer forward path は fp32 path のみで packed kernel を呼ぶ route がない。理論上 -39% memory traffic / splat だが kernel pair 単独 bench で wallclock 効果 ~1% と既知。close。
forward / backward の各 chain を 1 cmd buffer に集約する simpler batching plan。期待効果 +15-30% wallclock 改善 (commit overhead 20-50% を集約)。スタイル A (Option<&CommandBuffer> opt-in) で既存テスト 23 件を touch せず実装。target -10% wallclock / PSNR drift < 0.05 dB。
scope B 限定版 (forward 末尾の extract_offsets + rasterize.forward を 1 cmd buffer、backward chain の rasterize.backward + project_backwards を 1 cmd buffer) を env SPLAT_BATCHED_FORWARD=1 で活性化。30k bench で wallclock -6.2% / PSNR drift -0.30 dB、Mildly positive。期待 -6〜-12% の下限、Apple Silicon の commit overhead が予想より小さい示唆。
A.7 batched cmd buffer の wallclock 改善は scene 依存で chair -18.6% / hotdog -5.4% / drums -3.4% / ficus -1.6% / lego -6.16% の 5 シーン (12x の幅)。chair の突出は splat 数最大 (~130k) + scene geometry の compute/commit ratio が高いことが要因と推測。一方 ficus / drums は variance 範囲内、独立 effect 断定不可。卒論で「A.7 effective ≠ universal、scene 選択 + workload analysis 必須」と honest framing。
half3 per-pixel accumulator が low-T 領域 (alpha * T < 6e-5) で underflow → 寄与 splat の累積消失で PSNR -10.0 dB。さらに half↔float cast が compute bound でも重く wallclock +75%。Apple Silicon SIMD は half と float が同 throughput、bandwidth bound でないので f16 化は loss-only。
NFS 共有 gsplat-env を異 sm 機 (c33 sm_86 → c32 sm_70) に持ち込み、TORCH_CUDA_ARCH_LIST=7.0 で JIT 再 build 1 回 (93s) → 即動作。Lego 1k iter で wallclock 10.5s / val PSNR 19.81 dB。30k full は Phase 2b。
原著 3DGS を V100 で 30k 学習 (PSNR 28.38 dB / 10m37s / 237k splats)。同 V100・同 30k で brush (wgpu→Vulkan) 8m24s / 37.46 dB を上回れず、抽象コスト ≪ 実装最適化レベル を CUDA 機でも再確認。さらに codebase eval と paper-standard eval で 12 dB 乖離 (28.4 vs 14.6) を発見、A.5 表は eval convention 注記必須。
10k iter で PSNR 24.007 dB を達成、30k baseline (mean 24.834) の 96.7% 品質、wallclock 1/3.4。15k → 23.932、20k → 23.868、25k → 24.623 と non-monotonic で kerbl_exp_decay lr schedule の max_steps 依存性 artifact が混入。卒論モバイル含意では「10k iter で十分、追加 iter は variance noise」と言える反面、E.5 として「fair な iter scaling 比較には固定 schedule での checkpoint 取得が必要」と spec 化が必要。
lego では capacity 50k から 1M まで PSNR は 24.605 〜 25.275 dB で variance σ ±0.32 dB band 内、capacity effect は実質ゼロ。final splats は 50k 飽和 → 81k → 85k → 84k と「本質的 ~85k で plateau」を実証。モバイル制約下で capacity 50-100k を choose しても 1M と同等品質、卒論モバイル章の重要数値。capacity 大きいほど refine が無駄 split で variance noise を増やす副作用も観測。
splat workspace は Rust 8,467 + Metal 2,230 LOC (合計 ~10.7k)、67 unit test 完備、findings ノート 10 件と Cloudflare Pages + R2 配信が稼働。卒論 §4.1 (実装規模) と §4.1.3 (shader 内訳) への直接転記に使える。
wgpu 抽象は自作 native より遅いはず、という想定が逆。同一 M4 Max 上で brush (wgpu) が 9m08s / 37.40 dB、自作 (Metal 直) が 26m32s / 26.27 dB。第 2 軸 (抽象コスト定量化) の主張を再 framing する必要が確定。
SGLD gate を paper 式に揃えた結果 mean_noise_weight が ~50-150x スケールズレし、calibration 補正 (5e5→5e3) でも iter 240 前後で SIGSEGV。Bisect smoke で真因が L1 全滅 → refine prune → 空 buffer crash というアルゴリズム順序問題と判明。Calibration ≠ correctness。
c33 (A6000, sm_86) に gsplat-env / orig3dgs-env / Rust + brush の 3 env を build。NFS 共有ホーム経由で c32 / c34 にも継承可能。3 env とも import / --help / --version レベルで動作確認 OK。実 training (Lego 30k) は Phase 2 で。
三層対比 (自作 M4 / brush V100 / CUDA V100) で wgpu→Vulkan が 37.46 dB / 8m24s と CUDA orig (28.4) / gsplat (32.9) より高 PSNR + 高速、自作 24.84 / 23m40s に対し brush wgpu→Metal が 37.40 / 9m08s。「wgpu 抽象は重い」の素朴予想が 2 機種で逆転し、第 2 軸の主張を『抽象コスト < 実装最適化レベル』に再 framing 必須。
本実装の MCMC が論文と乖離している 3 箇所 (5% incremental growth 欠如、λ_Σ/λ_o covariance/opacity 正則化欠如、relocation が refine prune に便乗) を整理し、A.2 の修正項目と検証条件を確定させた spec。
3 ストーリー (scale_reg 3 連敗 / MCMC 4 連敗 / #5.31 ArgBuffer 却下 → M-3.x 偶発発見) を「事前 commit gate に基づく honest reject が engineering 上の時間配分を保護し、失敗の数字自体が次に必要な infrastructure の signal を encode する」という方法論として整理。M-3.x baseline と第 3 軸 (unified memory) narrative はいずれもこの経路で確定。
refs.bib は Zotero auto-export なので手動編集禁止。A.2 MCMC 関連 (Kheradmand 2024) と D.9 Phase 1D サーベイ補追を Zotero 側に取り込む TODO リスト。
新 splat workspace は M-3.x の training quality (PSNR 24.842 dB) を variance band 内で再現、全 7 kernel + refine + Adam + eval + PLY save が動作。wallclock は +9.6% の軽微 regression (steady-state では +4%) で許容内。
30s Metal System Trace で 14,909 encoder / iter 40 encoder を観測。当初の「STIME 70% = sync overhead」解釈は B-mini プロト (scatter wait 削除、< 1% 改善) で撤回。真の breakdown は GPU compute ~70% / CPU encoding ~30%、dispatch fusion ROI は小さく Phase 4 後続 (C/D/F) 進行に戻る判断。
kernel-level GPU timer で rasterize_backwards が 24.1 ms/call / 52.1% total と確定 dominant。atomic float add が律速と判定し、step 33 SIMD prefix sum reduction prototype の最有力ターゲットを確定。期待 ROI は 50% 削減で iter -13%、80% 削減で -21%。
ArgBuffer は CPU encoding 寄与 0.5% で 3% gate 不通過 → reject。queue reuse refactor 単独で -13.7% wallclock (1.14 ms/iter 削減が autorelease pool 圧縮を伴って効果増幅)。真の bottleneck は host-side loss compute + readback ~10.5 ms/iter (= 24-26% wallclock potential)、第 3 軸 narrative 最強の #5.31.x GPU loss kernel + no-readback を次着手に再定義。
host pump pipeline を排除し forward/loss/backward を GPU buffer で連結。2k iter wallclock -26.9% (42.5 → 31.07 ms/iter)、30k では n=4 variance test で wallclock -14〜-19% を再現。当初の PSNR -0.65 dB regression 主張は撤回 (band 25.0 ± 0.6 dB 内)。第 3 軸 (unified memory) narrative の核。