松田研究室
FindingID: p2-msplat-parity-lego
Status: stable / task 2026-08 msplat gap sweep Phase 3 (parity 再計測)
← Findings Index
P2 gap sweep · Phase 3 · msplat 等価比較 (parity)

P2 msplat parity — 同日等価比較で msplat 30K = 167.7s / 36.5 dB、gap は 12.5k で 2.10× (matched-wallclock 7.5k は 1.08× で brush +0.94 dB)

msplat wheel v1.1.3 と本実装 default スタック (resident + last_contributor、profile=false) を <strong>同日・同一 M4 Max・同一 init 点群 (culled init.ply 5207 pts)・同一 evaluator</strong> で interleave 実行。msplat 30K は <strong>167.7s / native val 36.53 dB / 190-195k splats</strong> — 2026-06 spike (219.8s / 35.48 dB) より 24% 速く 1.05 dB 高く、<strong>従来の gap 1.53× は過小評価で実際は 2.10×</strong> (12.5k 352.3s 比)。PSNR 断面は convention coupling が支配的: <strong>brush convention (premultiplied GT) cross-eval では本実装 12.5k 36.27 dB vs msplat 34.47 dB (+1.79 dB)</strong>、<strong>white-bg convention では msplat 36.28 dB vs 本実装 35.19 dB (-1.09 dB)</strong> と、同一 evaluator でも各実装が自分の学習 convention で勝つ。convention 非依存の事実は wallclock (2.10× @ 12.5k、1.08× @ 7.5k) と per-splat·iter throughput (msplat ~2.6× 高速: 33.9 vs 88.9 ns/splat·iter)。

mixedrank: highparity-established-gap-2.10x-convention-coupled-psnr第 1 軸第 2 軸gap-sweepphase-3msplatparitybaselinecross-evaleval-conventionthermal-interleavelegom4-maxthesis-ready
Δ PSNR
brush convention (同一 evaluator): 本実装 12.5k +1.79 dB / 7.5k +0.94 dB (vs msplat 30K q8 34.47)。white-bg convention: msplat +1.09 dB (36.28 vs 本実装 12.5k 35.19)
Δ Wallclock
msplat 30K 167.7s vs 本実装 12.5k 352.3s = **2.10×** (両者 profile なし・同日実測)。matched-wallclock: 7.5k 181.4s = 1.08×。従来の 1.53× (spike 値 220s 基準) は撤回
Impact
gap sweep の公式 gap 数値を 同日・同一条件の実測で確定: Lego 12.5k vs msplat 30K の wallclock gap は 2.10× (352.3s vs 167.7s、両者 profiling なし) — Phase 2 の 1.53× は spike の古い msplat 値 (219.8s) 起因の過小評価だった。一方 matched-wallclock 断面 (本実装 7.5k = 181.4s、msplat の 1.08×) では brush convention の同一 evaluator cross-eval で本実装が +0.94 dB (35.41 vs 34.47)。PSNR 比較は eval convention に強く依存し (white-bg では msplat +1.09 dB)、p1-a-3 の「訓練/評価 convention coupling」を第三者実装との比較で再実証した。msplat の native 品質が spike 比 +1.05 dB 向上した主因は今回の対称条件 (同一 culled init.ply 5207 pts・train 100 view 全量・常時フル解像度) にあり、msplat 側の条件を今回初めて本実装と揃えた結果。卒論 §5 の direct comparison 表はこの数値で置き換える。
01

本文

msplat (rayanht, PyPI wheel v1.1.3) と本実装 (commit 2fb7554、default = binning resident + last_contributor) を、msplat → splat 12.5k → msplat → splat 7.5k の interleave 直列実行 (thermal 打ち消し) で同日比較した。dataset は同一 (NeRF Synthetic lego 800×800)、init 点群は本実装と同じ cull (||pos|| ≤ 1.5) を適用した 同一の 5207 点、学習 view は両者とも train 100 view 全量、eval は 両実装の final PLY を同じ `splat eval` (val 100 view) に通す cross-eval。wallclock は両者とも profiling オーバーヘッドなし。

Headline

msplat 30K = 167.7s / native 36.53 dB / 190-195k splats — 2026-06 spike (219.8s / 35.48 dB / 208k) より速く・高品質。従来引用してきた gap 1.53× は過小評価で、実際の同日 gap は 2.10× (12.5k) / 1.08× (7.5k)。PSNR は同一 evaluator でも convention で勝敗が反転する (brush: 本実装 +1.79 dB、white-bg: msplat +1.09 dB) — 「速さの msplat vs 品質+robustness の本実装」という Pareto 直交 narrative 自体は維持されるが、品質優位は『本実装の学習 convention (premultiplied) 下で』という限定付きに修正が必要。

1. 実測サマリ (M4 Max、同日 interleave、wallclock は train loop のみ)

run (実行順)iterwallclockfinal splats自己 eval PSNRbrush cross-eval (q8)white-bg cross-eval
msplat r130,000167.85s190,67436.539 (white, native)33.04936.247
splat 12.5k #112,500352.27s407,57236.236 (brush, trainer)36.26535.185
msplat r230,000167.48s194,98636.513 (white, native)34.47036.277
splat 7.5k7,500181.36s346,86035.388 (brush, trainer)35.41133.990
splat 12.5k rep2 (参考、非 interleave)12,500385.25s412,68836.140 (brush, trainer)36.16635.081
実行順そのまま (interleave)。「自己 eval」= 各実装が学習と同じ convention で測る値 (msplat: white-bg GT + float render、splat: premultiplied GT)。「brush cross-eval (q8)」= 両 PLY を splat eval --convention brush --quantize-8bit (val 100 view) に通した同一 evaluator 値。「white-bg cross-eval」= 両 PLY を本実装 renderer で描画し α 合成で white-bg 化して white GT と比較 (8-bit RGBA 経由)。splat 側の brush cross-eval が trainer 値と一致 (36.236/35.388) することで evaluator の整合性を確認済み。

2. 2026-06 spike との差分 (msplat 側)

項目spike (2026-06-26)本日 (2026-08-16)差
wallclock (30K)219.8s167.7s (×2 mean)**-52.1s (-23.7%)**
PSNR (msplat 自己 eval)35.48 dB36.53 dB**+1.05 dB**
final splats208,215190,674 / 194,986-15k
init 点群不明 (spike 記録なし)**本実装と同一の culled init.ply 5207 点 (色付き)**対称化
学習 view不明 (eval_mode holdout の可能性)train 100 view 全量 (本実装と同一)対称化
解像度スケジュール不明num_downscales=0 (常時 800×800、本実装と同一)対称化
spike の実行条件 (init / holdout / downscale) は記録が残っておらず、本日の対称条件が spike と異なる可能性が高い。msplat が spike より速く・高品質になった主因は「良い init 点群 + 全 view 学習」と推定され、msplat 実装自体の変化ではない (同じ wheel v1.1.3)。今後の比較は本 finding の数値を正とする。

3. 公式 gap 断面 (2 断面 + throughput)

断面比較wallclock 比PSNR 差 (同一 evaluator)
**matched-PSNR (brush conv)**splat 7.5k (35.41 dB) > msplat 30K best (34.47 dB)**1.08×** (181.4s vs 167.7s)brush conv では msplat 30K の到達 PSNR を 7.5k で +0.94 dB 上回る — matched-PSNR gap は **≤1.08×**
**matched-PSNR (white conv)**msplat 36.28 dB に対し本実装 12.5k で 35.19 dB12.5k = 2.10×white conv では本実装 Pareto 上に matched 点が**存在しない** (12.5k でも -1.09 dB)
**matched-wallclock**msplat 167.7s ≈ splat 7.5k 181.4s (1.08×)≈1×brush: 本実装 +0.94 dB / white: msplat +2.29 dB
**12.5k 公式点**splat 12.5k vs msplat 30K**2.10×** (352.3s vs 167.7s)brush: +1.79 dB / white: -1.09 dB
per-splat·iter throughputmean splats 正規化 (splat 317k / msplat 165k)msplat **~2.6×**28.18 ms/iter ÷ 317k = 88.9 ns vs 5.59 ms/iter ÷ 165k = 33.9 ns per splat·iter
wallclock gap の正式値: 12.5k 点で 2.10×、matched-wallclock 点 (7.5k) で 1.08×。iter 数 (12.5k vs 30K)・splats 数 (407k vs 193k) は全行で非対称であり、本実装は少 iter ×多 splats、msplat は多 iter ×少 splats という workload 構造の違いがある。per-splat·iter では msplat が ~2.6× 高速 — kernel-level の速度差は Phase 2 (C0+LC で -56%) 後もなお残る。

4. eval convention coupling — PSNR 勝敗は convention で反転する

メカニズム (p1-a-3 の再実証)

msplat は white-bg composite で学習するため、半透明領域の色は「white 合成後に GT と一致する」よう最適化される。これを premultiplied (bg=0) で評価すると背景 haze と edge の色 shift が systematic に乗り、native 36.53 → brush cross-eval 34.47 (q8) に -2.1 dB 低下する。逆に本実装 (premultiplied 学習) を white-bg で評価すると 36.24 → 35.19 に -1.05 dB 低下する。同一 evaluator・同一 renderer でも、各実装は自分の学習 convention で勝つ — PSNR 単一値の直接比較は原理的に convention の選択を含み、卒論では両断面を並記する。

  • brush conv no-quant の罠: msplat PLY の raw float render は [0,1] 外への overshoot を含み、clamp なし比較では 21.1 dB まで崩壊する (8-bit quantize = clamp 込みで 33.0-34.5 dB に回復)。本実装は overshoot がほぼなく q8 差 +0.03 dB。msplat 側の brush 数値は q8 (clamp 込み) を公式とする。
  • white-bg cross-eval の測定条件: 本実装 renderer で両 PLY を描画し、8-bit RGBA PNG 経由で α 合成 → white GT と比較。msplat native (float、msplat renderer) の 36.53 に対し同 PLY で 36.28 — renderer 差 + 8-bit 量子化で -0.25 dB。この -0.25 dB は両実装の PLY に同じ経路を通すことで対称化されている。
  • evaluator 整合性の確認: 本実装 final.ply の brush cross-eval (36.236 / 35.388) が trainer 内部の final val PSNR と一致 (< 0.001 dB) — eval CLI と trainer eval の等価性を確認。
  • 非決定性: msplat は同条件 2 run で final splats 190,674 / 194,986、brush cross-eval 33.05 / 34.47 (1.4 dB 差、native では 0.03 dB 差)。本実装も 12.5k 2 run で 36.236 / 36.140 (0.10 dB 差)。convention mismatch 下の cross-eval は run 間分散が増幅される。

5. wallclock の信頼区間と profile=false の効果

  • 本実装 12.5k は同日 2 run で 352.27s / 385.25s (interleave 1 run 目 / 直後の連続 rep2)、公式 (profile=true、Phase 2 時) は 336.33s。profile=false による短縮は観測されず、run 間分散 (~10%、thermal / OS jitter) が profiling オーバーヘッドを上回る。gap 計算には interleave protocol 下の 352.27s を使用 (336.33s 基準なら 2.01×)。
  • msplat は 2 run で 167.85s / 167.48s (0.2% 差) と極めて安定。単一 encoder ×30K dispatch の構造は thermal / jitter の影響を受けにくい。
  • wallclock の定義: 両者とも train loop のみ (dataset load / PLY export / eval を除外)。msplat は Python 側 perf_counter、本実装は trainer 内 Instant。

6. 再現手順

# msplat 環境 (wheel v1.1.3)
uv venv msplat-venv --python 3.12
uv pip install --python msplat-venv/bin/python "msplat==1.1.3" numpy pillow

# dataset 変換 (blender lego → nerfstudio 形式、white-bg composite + culled init.ply)
LEGO=/Users/otkrickey/dev/3dgs-workspace/datasets/nerf_synthetic/lego
python docs/strategy/msplat_parity_lego.py convert --lego $LEGO --out /tmp/lego-ns

# interleave 実行 (msplat → splat 12.5k → msplat → splat 7.5k)
python docs/strategy/msplat_parity_lego.py train --dataset /tmp/lego-ns --lego $LEGO \
  --iters 30000 --out-ply msplat-r1.ply           # → 167.85s / 36.539 dB
( cd splat && ./target/release/splat train \
  --config configs/2026-08-16-lego-parity-noprof-12500.toml )  # → 352.27s / 36.236 dB
# (msplat r2, splat 7.5k を同様に)

# cross-eval (同一 evaluator)
python docs/strategy/msplat_parity_lego.py convert-ply --inp msplat-r1.ply --out msplat-r1-brush.ply
splat/target/release/splat eval --ply msplat-r1-brush.ply --dataset $LEGO \
  --split val --convention brush --quantize-8bit
splat/target/release/splat eval --ply splat/runs/lego-parity-noprof-12500/final.ply \
  --dataset $LEGO --split val --convention brush
# white-bg cross-eval は 3dgs-workspace/msplat-parity-20260816/white_eval.py

7. 卒論への反映と申し送り

  1. §5 direct comparison 表の更新: msplat Lego 30K は 167.7s / 36.53 dB (native) を正とし、spike 値 (219.8s / 35.48 dB) は「初期 spike、条件非対称」と脚注化。gap は 2.10× (12.5k) / 1.08× (7.5k) を併記。
  2. reframing narrative の修正: 「Lego で +0.78 dB」という単純な品質優位の主張は不可 (convention 依存で反転する)。品質軸の主張は materials robustness (+21 dB、convention 非依存の破綻) と convention 明示性 (Phase A audit) に寄せる。
  3. convention coupling を §5 の独立トピックに: 第三者実装との cross-eval で p1-a-3 の主張 (training/eval convention は coupling する) を再実証した — 評価方法論の contribution として書ける。
  4. gap sweep Phase 3 の残作業: Pareto plot v3 は本 finding の同日値で再生成する (make_msplat_pareto.py の入力更新)。
  5. msplat 側の PSNR が向上した事実: 良 init + 全 view 学習で msplat は 36.5 dB に達する — spike の 35.48 は msplat の下限側だった。ベースライン数値は実行条件の記録が完全な場合のみ引用可、という protocol 教訓 (mcmc_noise_calibration_lesson と同型)。
02

関連する run

この finding が観測された / 言及している実験 run。

03

関連 finding

© 2026 大竹律輝 — 松田研究室