[{"data":1,"prerenderedAt":503},["ShallowReactive",2],{"finding:c32-orig3dgs-bench":3,"finding-runs:c32-orig3dgs-bench":454,"finding-related:c32-orig3dgs-bench":455},{"meta":4,"impact":32,"sections":39},{"id":5,"title":6,"subtitle":7,"eyebrow":8,"date":9,"status":10,"category":11,"polarity":12,"axes":13,"tags":15,"task_code":24,"related_runs":25,"related_findings":28},"c32-orig3dgs-bench","c32 V100 原著 3DGS 30k bench — A.5 三層対比表の最終 row & eval convention 乖離 finding","Phase 2c。graphdeco-inria\u002Fgaussian-splatting を V100 (sm_70) で 30k 学習し PSNR 28.384 dB \u002F 10m37s \u002F 237k splats。同時に codebase eval (28.4 dB) vs paper-standard eval (14.6 dB) の 12 dB 乖離が判明、A.5 三層対比の eval convention 問題を確定。","Phase 2c · orig 3DGS V100 bench","2026-05-23","stable","experiment","mixed",[14],2,[16,17,18,19,20,21,22,23],"phase-2","original-3dgs","v100","c32","cuda","bench","eval-convention","abstraction-cost","A.3",[26,27],"orig3dgs-lego-1k-smoke","orig3dgs-lego-30k",[29,30,31],"c32-gsplat-smoke","m4-brush-bench","c33-cuda-setup-notes",{"summary":33,"rank":34,"verdict":35,"delta_psnr":36,"delta_wallclock":37,"delta_splats":38},"原著 3DGS を V100 で 30k 学習 (PSNR 28.38 dB \u002F 10m37s \u002F 237k splats)。同 V100・同 30k で brush (wgpu→Vulkan) 8m24s \u002F 37.46 dB を上回れず、抽象コスト ≪ 実装最適化レベル を CUDA 機でも再確認。さらに codebase eval と paper-standard eval で 12 dB 乖離 (28.4 vs 14.6) を発見、A.5 表は eval convention 注記必須。","high","investigative",28.384,"10m37s","237,920",[40,43,66,69,88,91,96,99,101,103,109,113,115,117,119,121,123,125,127,129,132,134,136,138,141,143,145,147,149,154,156,158,160,162,164,180,182,184,186,188,190,226,228,230,248,254,256,260,262,264,288,290,292,309,311,313,317,319,321,323,327,329,331,370,372,374,379,382,384,386,388,393,395,398,400,433,435,437,439,445,447],{"type":41,"text":42},"lead","V100 (c32 GPU1) で \u003Ccode>graphdeco-inria\u002Fgaussian-splatting\u003C\u002Fcode> (\u003Ccode>54c035f\u003C\u002Fcode>) を Lego 30k 学習し \u003Cstrong>PSNR 28.384 dB \u002F 10m37s \u002F 237,920 splats\u003C\u002Fstrong>。同 V100・同 30k で \u003Cstrong>brush wgpu→Vulkan が 8m24s \u002F 37.46 dB\u003C\u002Fstrong> と原著 CUDA を上回る (wgpu 抽象は 21% 速い)。加えて codebase eval (28.4 dB) vs paper-standard eval (14.6 dB) で \u003Cstrong>12 dB の convention 乖離\u003C\u002Fstrong>が発覚、A.5 三層対比表に eval convention 注記が必須となった。",{"type":44,"items":45},"kv",[46,48,51,54,57,60,63],{"key":47,"value":9},"実施日",{"key":49,"value":50},"対象機","matsudalab-c32 (compute-0-32, V100-PCIE-32GB × 2, driver 555.42.02, CUDA 12.1)",{"key":52,"value":53},"GPU 占有","GPU0 = yamada さん diffusion train (100% util)、GPU1 = free \u002F 32 GB → CUDA_VISIBLE_DEVICES=1",{"key":55,"value":56},"repo","graphdeco-inria\u002Fgaussian-splatting @ 54c035f",{"key":58,"value":59},"env","~\u002Fminiconda3\u002Fenvs\u002Forig3dgs-env (torch 2.4.1+cu121、Python 3.11)",{"key":61,"value":62},"extensions","diff-gaussian-rasterization \u002F simple-knn \u002F fused-ssim を sm_70 で再 build",{"key":64,"value":65},"dataset","~\u002Fdatasets\u002Fnerf_synthetic\u002Flego (NFS、test split 物理欠損 164\u002F200 → val を test に substitute)",{"type":67,"text":68},"heading","TL;DR",{"type":70,"columns":71,"align":74,"rows":76},"table",[72,73],"項目","値",[75,75],"left",[77,80,83,86],[78,79],"PSNR @ 30k (codebase eval)","28.384 dB (val 100 frame、α マスク render vs raw gt)",[81,82],"PSNR @ 30k (paper-std eval)","14.598 dB (val 100 frame、raw render vs white-composited gt) — 詳細 §6",[84,85],"wallclock @ 30k","10m 37s (train、init pcd 含む) \u002F 全体 11m 07s",[87,38],"final splats",{"type":89,"text":90},"paragraph","phase 2a\u002F2b 結果対比: gsplat (V100) PSNR 32.94 \u002F 5m03s \u002F 108,704 splats、brush wgpu→Vulkan (V100) PSNR 37.46 \u002F 8m24s \u002F ~260k splats、brush wgpu→Metal (M4 Max) PSNR 37.40 \u002F 9m08s \u002F ~284k。",{"type":92,"label":93,"variant":94,"text":95},"callout","注意","warn","PSNR が 2 通り出るのは、原著 3DGS 上流の \u003Cstrong>train.py 損失が \u003Ccode>image *= alpha_mask\u003C\u002Fcode> + raw RGB gt の混成領域\u003C\u002Fstrong> で実装されており、paper 想定の white-bg eval (gt を白でアルファ合成) で測ると訓練中見たことのない off-object floater が penalize されて 14 dB 台に下がるため。\u003Cstrong>A.5 表では codebase eval (28.4 dB) を使う\u003C\u002Fstrong>が、両方を併記する。",{"type":92,"label":97,"variant":94,"text":98},"c33 NFS 副作用","orig3dgs-env の 3 拡張 wheel が sm_70 で上書き済。c33 (A6000, sm_86) で再使用するには \u003Ccode>TORCH_CUDA_ARCH_LIST='7.0;8.6'\u003C\u002Fcode> でマルチ sm 再 build か、\u003Ccode>8.6\u003C\u002Fcode> 単独で上書きが必要 (将来作業)。",{"type":67,"text":100},"1. setup 経緯と c33 (A6000) 構築済 env からの差分",{"type":89,"text":102},"phase 1 で c33 に build した orig3dgs-env は NFS 共有なので、c32 側でも \u003Ccode>conda activate\u003C\u002Fcode> するだけで Python パッケージは即動く。問題は \u003Cstrong>CUDA 拡張の sm 互換性\u003C\u002Fstrong>:",{"type":104,"items":105},"list",[106,107,108],"gsplat は JIT build なので \u003Ccode>TORCH_CUDA_ARCH_LIST=7.0\u003C\u002Fcode> を export すれば V100 用 .so を初回 build cache する (\u003Ccode>c32-gsplat-smoke.md\u003C\u002Fcode> 参照、93s)。","\u003Cstrong>orig 3DGS の 3 拡張 (diff-gaussian-rasterization \u002F simple-knn \u002F fused-ssim) は AOT build wheel\u003C\u002Fstrong>。c33 で build したものは \u003Ccode>-gencode arch=compute_86,code=sm_86\u003C\u002Fcode> のみで、\u003Cstrong>sm_70 (V100) で kernel launch すると symptom が \"OOM 21 TB\"\u003C\u002Fstrong> という形で発現 (kernel ABI mismatch の garbage launch parameter)。","対処: c32 側で \u003Ccode>TORCH_CUDA_ARCH_LIST=7.0\u003C\u002Fcode> + \u003Ccode>--force-reinstall --no-build-isolation --no-deps\u003C\u002Fcode> で 3 サブモジュールを再 build。",{"type":110,"lang":111,"text":112},"code","bash","ssh matsudalab-c32\nsource ~\u002Fminiconda3\u002Fetc\u002Fprofile.d\u002Fconda.sh && conda activate orig3dgs-env\ncd ~\u002Frepos\u002Fgaussian-splatting\nexport TORCH_CUDA_ARCH_LIST='7.0'\nexport CUDA_HOME=\u002Fusr\u002Flocal\u002Fcuda\npip install --force-reinstall --no-build-isolation --no-deps \\\n    submodules\u002Fsimple-knn \\\n    submodules\u002Fdiff-gaussian-rasterization \\\n    submodules\u002Ffused-ssim\n",{"type":89,"text":114},"\u003Cstrong>副作用\u003C\u002Fstrong>: NFS 共有 env なので、これで wheel が sm_70 上書きされた状態になる。c33 (A6000、sm_86) で同 env を使う場合、現状 simple-knn の \u003Ccode>distCUDA2\u003C\u002Fcode> が \u003Ccode>no kernel image\u003C\u002Fcode> で落ちる。対処案 2 通り:",{"type":110,"lang":111,"text":116},"# 案 1: c33 側で 8.6 上書き (c32 で再度使うとまた 7.0 上書き必要)\nTORCH_CUDA_ARCH_LIST='8.6' pip install --force-reinstall --no-build-isolation --no-deps submodules\u002F*\n# 案 2: マルチ sm wheel (build 時間 2 倍、安定)\nTORCH_CUDA_ARCH_LIST='7.0;8.6' pip install --force-reinstall --no-build-isolation --no-deps submodules\u002F*\n",{"type":89,"text":118},"phase 2d 以降 c33 で原著 3DGS を再実行する場合は要対処 (今 session はスコープ外)。",{"type":67,"text":120},"2. dataset 問題と val 代替",{"type":89,"text":122},"NeRF Synthetic Lego の \u003Ccode>test\u002F\u003C\u002Fcode> 200 frame のうち 164 frame がローカル NFS rsync で欠損していた (phase 2a の gsplat smoke 時点で既知)。原著 3DGS の \u003Ccode>readNerfSyntheticInfo\u003C\u002Fcode> は \u003Cstrong>eval flag に関係なく test 用 \u003Ccode>readCamerasFromTransforms\u003C\u002Fcode> を呼び\u003C\u002Fstrong>、200 frame 全部 Image.open するため、欠損 = train.py が起動できない。",{"type":89,"text":124},"対処: \u003Cstrong>\u003Ccode>transforms_val.json\u003C\u002Fcode> を \u003Ccode>transforms_test.json\u003C\u002Fcode> に substitute\u003C\u002Fstrong>。これで \u003Ccode>--eval\u003C\u002Fcode> 評価は val 100 frame に対して走る。",{"type":110,"lang":111,"text":126},"cd ~\u002Fdatasets\u002Fnerf_synthetic\u002Flego\ncp transforms_test.json transforms_test.json.bak\ncp transforms_val.json transforms_test.json\n",{"type":89,"text":128},"加えて、ローカル copy の transforms_*.json は \u003Ccode>file_path\u003C\u002Fcode> に既に \u003Ccode>.png\u003C\u002Fcode> を含む変則的書式 (\u003Ccode>.\u002Ftrain\u002Fr_0.png\u003C\u002Fcode>)。\u003Ccode>readCamerasFromTransforms\u003C\u002Fcode> が \u003Ccode>path + extension\u003C\u002Fcode> で \u003Ccode>.png.png\u003C\u002Fcode> を作って FileNotFound するため、3 split 全部から \u003Ccode>.png\u003C\u002Fcode> を strip。",{"type":110,"lang":130,"text":131},"python","for fr in d[\"frames\"]:\n    if fr[\"file_path\"].endswith(\".png\"):\n        fr[\"file_path\"] = fr[\"file_path\"][:-4]\n",{"type":89,"text":133},"(\u003Ccode>transforms_*.json.bak\u003C\u002Fcode> で原本は保持。\u003Ccode>.\u002Fval\u002Fr_0\u003C\u002Fcode> の path は OK、loader は \u003Ccode>path\u002Fval\u002Fr_0.png\u003C\u002Fcode> を開く。)",{"type":89,"text":135},"\u003Cstrong>gsplat ↔ 原著 3DGS の eval 公平性\u003C\u002Fstrong>: どちらも val=100 frame で eval する状態に揃った (gsplat smoke も val 評価。\u003Ccode>c32-gsplat-smoke.md\u003C\u002Fcode> §2 参照)。brush は brush 自体の eval pipeline で別マスキング規約だが、A.5 表ではこのまま 3 層対比に使う。",{"type":67,"text":137},"3. 上流コードの非互換 2 件 (smoke で踏んだ)",{"type":67,"level":139,"text":140},3,"3.1 PIL の np.byte 拒否 (numpy 2.x + Pillow 12.x)",{"type":89,"text":142},"\u003Ccode>scene\u002Fdataset_readers.py:259\u003C\u002Fcode> で \u003Ccode>Image.fromarray(np.array(arr*255.0, dtype=np.byte), \"RGB\")\u003C\u002Fcode> が \u003Ccode>TypeError: Cannot handle this data type: (1, 1, 3), |i1\u003C\u002Fcode>。\u003Ccode>np.byte = np.int8\u003C\u002Fcode> (signed) であり、numpy 2.4 + Pillow 12.2 で signed int8 が RGB image として拒否される。",{"type":110,"lang":130,"text":144},"# 1 行修正\n# np.byte → np.uint8\nimage = Image.fromarray(np.array(arr*255.0, dtype=np.uint8), \"RGB\")\n",{"type":67,"level":139,"text":146},"3.2 --white_background モードでの eval PSNR が誤計算",{"type":89,"text":148},"これは原著 3DGS の eval 実装が \u003Ccode>--white_background\u003C\u002Fcode> Blender 系に対し未対応:",{"type":104,"items":150},[151,152,153],"\u003Ccode>readCamerasFromTransforms\u003C\u002Fcode> は alpha compose で白背景合成した RGB PIL image を作るが、\u003Cstrong>\u003Ccode>utils\u002Fcamera_utils.py:21\u003C\u002Fcode> の \u003Ccode>loadCam\u003C\u002Fcode> は \u003Ccode>Image.open(image_path)\u003C\u002Fcode> で原 PNG を直接再 open\u003C\u002Fstrong>、RGBA を読む。\u003Ccode>scene\u002Fcameras.py:42-46\u003C\u002Fcode> で \u003Ccode>gt_image = resized_image_rgb[:3, ...]\u003C\u002Fcode> (RGB チャネル = \u003Cstrong>黒背景の raw RGB\u003C\u002Fstrong>) + \u003Ccode>alpha_mask = resized_image_rgb[3:4, ...]\u003C\u002Fcode> (アルファ別保持)。","訓練ループ (\u003Ccode>train.py:114-116\u003C\u002Fcode>) では \u003Ccode>image *= alpha_mask\u003C\u002Fcode> で render を α マスクしてから loss を取るため正しく学習が進む。","しかし \u003Cstrong>eval ブロック (\u003Ccode>train.py:230-241\u003C\u002Fcode>) で α マスクが当たっておらず\u003C\u002Fstrong>、render (白背景) と gt_image (黒背景) を直接比較。1k 段階で \u003Cstrong>PSNR 3.05 dB\u003C\u002Fstrong> と異常値 (実態は loss 0.05 で学習自体は順調)。",{"type":67,"level":139,"text":155},"Patch 3.2",{"type":110,"lang":130,"text":157},"# train.py line 231 直後に挿入\nimage = torch.clamp(renderFunc(viewpoint, scene.gaussians, *renderArgs)[\"render\"], 0.0, 1.0)\nif viewpoint.alpha_mask is not None:\n    image = image * viewpoint.alpha_mask.cuda()   # added: match training loss masking\ngt_image = torch.clamp(viewpoint.original_image.to(\"cuda\"), 0.0, 1.0)\n",{"type":89,"text":159},"これで 1k 段階 PSNR が \u003Cstrong>23.58 dB\u003C\u002Fstrong> (paper 軌跡: 1k で ~25 dB、30k で ~35 dB) に揃った。\u003Cstrong>ただし完成形ではない\u003C\u002Fstrong> — §6 参照。",{"type":67,"text":161},"4. smoke (1k iter) 結果",{"type":110,"lang":111,"text":163},"CUDA_VISIBLE_DEVICES=1 python train.py \\\n    -s ~\u002Fdatasets\u002Fnerf_synthetic\u002Flego \\\n    --model_path ~\u002Fruns\u002Forig3dgs-lego-1k-smoke \\\n    --iterations 1000 --eval --white_background \\\n    --test_iterations 500 1000 --save_iterations 1000 \\\n    --disable_viewer\n",{"type":70,"columns":165,"align":169,"rows":171},[166,167,168],"iter","L1 (test=val)","PSNR (test=val)",[170,170,170],"right",[172,176],[173,174,175],500,"0.0423","19.984 dB",[177,178,179],1000,"0.0225","23.583 dB",{"type":89,"text":181},"wallclock 1k iter ≈ 30s (含む dataset load + random 100k init pcd の knn)。",{"type":67,"text":183},"5. 30k full bench",{"type":67,"level":139,"text":185},"コマンド",{"type":110,"lang":111,"text":187},"CUDA_VISIBLE_DEVICES=1 nohup python -u train.py \\\n    -s ~\u002Fdatasets\u002Fnerf_synthetic\u002Flego \\\n    --model_path ~\u002Fruns\u002Forig3dgs-lego-30k \\\n    --iterations 30000 --eval --white_background \\\n    --test_iterations 5000 10000 15000 20000 25000 30000 \\\n    --save_iterations 30000 --disable_viewer \\\n    > ~\u002Fruns\u002Forig3dgs-lego-30k\u002Ftrain.log 2>&1 &\n",{"type":67,"level":139,"text":189},"Eval history (test=val、α マスク render vs raw gt)",{"type":70,"columns":191,"align":195,"rows":196},[166,192,193,194],"L1 (test)","PSNR test (dB)","PSNR train sample (dB)",[170,170,170,170],[197,202,207,212,216,221],[198,199,200,201],5000,"0.00895","27.785","27.415",[203,204,205,206],10000,"0.00751","28.342","28.012",[208,209,210,211],15000,"0.00722","28.402","28.194",[213,209,214,215],20000,"28.386","28.279",[217,218,219,220],25000,"0.00715","28.417","28.329",[222,223,224,225],30000,"0.00720","28.384","28.353",{"type":89,"text":227},"→ 15k 以降ほぼ完全に plateau。densify_until_iter=15000 (default) で refine 停止後は flat。",{"type":67,"level":139,"text":229},"Wallclock",{"type":70,"columns":231,"align":234,"rows":235},[232,233],"区分","時刻",[75,75],[236,239,242,245],[237,238],"Output folder 作成","03:06:20",[240,241],"Train start (init pcd 完了)","03:06:50",[243,244],"Train end (iter 30000 save)","03:17:24",[246,247],"プログラム終了","03:17:27",{"type":104,"items":249},[250,251,252,253],"\u003Cstrong>30k 純 train wallclock = 10m 32s\u003C\u002Fstrong> (tqdm 最終 line)","\u003Cstrong>train + init = 10m 37s\u003C\u002Fstrong>","\u003Cstrong>total (dataset load 込み) = 11m 07s\u003C\u002Fstrong>","iter rate: 30〜50 it\u002Fs (densify 中) → 50〜52 it\u002Fs (refine 停止後)",{"type":67,"level":139,"text":255},"Final splats",{"type":104,"items":257},[258,259],"saved point cloud: \u003Ccode>~\u002Fruns\u002Forig3dgs-lego-30k\u002Fpoint_cloud\u002Fiteration_30000\u002Fpoint_cloud.ply\u003C\u002Fcode>","\u003Cstrong>vertex count = 237,920\u003C\u002Fstrong> (random 100k init から +138k densify)",{"type":67,"text":261},"6. 重要 finding — codebase eval vs paper-standard eval の乖離",{"type":89,"text":263},"iter 30000 checkpoint の保存後、4 通りの eval ストラテジで val 100 frame の PSNR を比較したところ:",{"type":70,"columns":265,"align":270,"rows":271},[266,267,268,269],"Variant","説明","PSNR (dB)","L1",[75,75,170,170],[272,275,280,283],[273,274,224,223],"A. codebase 修正版","render *= alpha mask、gt 生 RGB",[276,277,278,279],"B. paper-standard","render 生 (bg=white)、gt += (1-α)*white","14.598","0.08848",[281,282,278,279],"C. 両方白合成","render 生 + gt 白合成 (= B と同じ、render bg=white なので)",[284,285,286,287],"D. 上流 unmodified","render 生 vs gt 生 RGB (train.py original eval)","2.512","0.61280",{"type":89,"text":289},"paper 提示 (Kerbl Table 2) の Lego 30k = \u003Cstrong>34.5 dB\u003C\u002Fstrong> に対し、本実装の A は \u003Cstrong>-6.1 dB\u003C\u002Fstrong>、B は \u003Cstrong>-19.9 dB\u003C\u002Fstrong>。",{"type":89,"text":291},"\u003Cstrong>原因解析\u003C\u002Fstrong> (iter 30000 の test camera 0 の中央エリア統計):",{"type":70,"columns":293,"align":298,"rows":299},[294,295,296,297],"エリア","render 平均 RGB","gt 平均 RGB (raw)","gt 平均 RGB (white-composite)",[75,75,75,75],[300,304],[301,302,303,303],"object 内側 (α>0.5)","(0.58, 0.50, 0.30)","(object color)",[305,306,307,308],"外側 (α\u003C0.1)","\u003Cstrong>(0.93, 0.93, 0.85)\u003C\u002Fstrong>","\u003Cstrong>(0.002, 0.002, 0.001)\u003C\u002Fstrong> (≒0、premultiplied)","(1.0, 1.0, 1.0)",{"type":89,"text":310},"→ object 外側で render は \u003Cstrong>白に近いが完全に白ではない (0.93)\u003C\u002Fstrong>。原因は \u003Cstrong>train loss が \u003Ccode>image *= alpha_mask\u003C\u002Fcode> で render の外側を 0 にされてから gt と比較\u003C\u002Fstrong>しており、モデルが \u003Cstrong>外側に何を描くかを学習する圧がかからない\u003C\u002Fstrong>ため、低 opacity の \"floater\" gaussian が散らばって rendering bg (白) と混ざる結果。",{"type":89,"text":312},"これが visible に: render イメージに \u003Cstrong>yellow speck が散らばる\u003C\u002Fstrong> 形で確認できる (\u003Ccode>\u002Ftmp\u002Frender_30k.png\u003C\u002Fcode> を eval debug で出力)。",{"type":92,"label":314,"variant":315,"text":316},"眺め","info","\u003Cstrong>A (28.4 dB) は upstream codebase の自己整合的な数値\u003C\u002Fstrong> だが、paper 想定の \"white-bg comparison\" とは厳密に異なる。Kerbl らの paper 35 dB と直接比較不可。\u003Cbr>\u003Cstrong>B (14.6 dB) が paper-standard 評価\u003C\u002Fstrong> だが、本実装の trainer が paper-standard で訓練していないため公平不可。\u003Cbr>\u003Cstrong>D (2.5 dB) は上流 train.py が printf する数値\u003C\u002Fstrong> で、\u003Ccode>--white_background\u003C\u002Fcode> Blender path で実質壊れている。",{"type":89,"text":318},"\u003Cstrong>A.5 表での扱い\u003C\u002Fstrong>: A の 28.4 dB を載せ、本 .md の本セクションを reference して \"eval convention 注記\" を付ける。3 層対比 (gsplat 32.94 \u002F brush 37.46 \u002F orig 28.4) は \u003Cstrong>同 val=100 frame、同 V100、ただし orig は codebase-internal eval\u003C\u002Fstrong> の枠で並べる。",{"type":67,"level":139,"text":320},"この finding の卒論への価値",{"type":89,"text":322},"「\u003Cstrong>Apple Silicon native vs CUDA 三層対比\u003C\u002Fstrong>」の比較を取る際に、ナイーブに gsplat \u002F brush \u002F orig 3DGS を並べてしまうと:",{"type":104,"items":324},[325,326],"orig 3DGS が \u003Cstrong>paper 値より大きく下がる\u003C\u002Fstrong> (28.4 vs 34.5、gsplat 32.94 が orig より高い)","読者は「原著実装が gsplat より悪い」と誤読する",{"type":89,"text":328},"実際には \u003Cstrong>eval convention の選択\u003C\u002Fstrong> で 28.4 〜 14.6 〜 2.5 dB の 12 dB 幅の振れが生じる、というのが本来の事実。卒論 Chapter 4 ではこの \u003Cstrong>convention 依存性\u003C\u002Fstrong> を最初に明示し、3 層対比は「同 convention 内での比較」に限定する必要がある。これは A.3 phase 2 全体の \u003Cstrong>methodological prerequisite finding\u003C\u002Fstrong> と位置付けられる。",{"type":67,"text":330},"7. 三層対比表 (A.5 §第 1 軸 完成)",{"type":70,"columns":332,"align":338,"rows":339},[333,334,335,336,337],"","自作 (M4 Max)","brush wgpu→Vulkan (V100)","orig CUDA (V100)","gsplat CUDA (V100)",[75,170,170,170,170],[340,345,350,354,358,364],[341,342,343,224,344],"PSNR (dB) (codebase-internal eval)","24.842","37.460","32.940",[346,347,348,37,349],"wallclock","23m40s","8m24s","5m03s",[87,351,352,38,353],"79,239","~260k","108,704",[355,356,357,357,357],"GPU (TDP)","M4 Max (40W)","V100 (250W)",[359,360,361,362,363],"抽象レイヤ","native Metal","wgpu→Vulkan","CUDA native (paper)","CUDA native (PyTorch ext)",[365,366,367,368,369],"Eval convention","(val 100) white-bg","brush internal","α-masked render vs raw gt","val 100 white-bg",{"type":67,"level":139,"text":371},"第 1 軸 + 第 2 軸 finding",{"type":89,"text":373},"\u003Cstrong>(1) 純粋抽象差分の対比対象が初めて揃った\u003C\u002Fstrong>: orig 3DGS (CUDA native、paper baseline) と brush (wgpu→Vulkan) は同 V100 GPU・同 30k iter で動かしたので、原理的には \u003Cstrong>wallclock の差 = wgpu 抽象オーバーヘッド\u003C\u002Fstrong> を抽出可能。実測:",{"type":104,"items":375},[376,377,378],"brush wgpu→Vulkan: 8m24s","orig CUDA: \u003Cstrong>10m37s\u003C\u002Fstrong>","gsplat CUDA: 5m03s",{"type":92,"label":380,"variant":94,"text":381},"意外な順序","wgpu (brush) が CUDA native (orig) より \u003Cstrong>約 21% 速い\u003C\u002Fstrong>。これは「wgpu 抽象は重い」という素朴予想を再度反証。原因はおそらく \u003Cstrong>trainer 側の実装最適化レベル差\u003C\u002Fstrong> (brush は kernel fusion \u002F dispatch overhead 削減が orig より進んでいる)。即ち \u003Ccode>m4-brush-bench.md\u003C\u002Fcode> で M4 Max 上で観察したのと同じ「\u003Cstrong>抽象コスト ≪ 実装最適化レベル\u003C\u002Fstrong>」が V100 でも観察された。",{"type":89,"text":383},"\u003Cstrong>(2) PSNR は brush > gsplat > orig (同 V100、同 val 100、同 30k)\u003C\u002Fstrong>: 抽象レイヤの薄さと PSNR の絶対値は無相関どころか \u003Cstrong>逆相関\u003C\u002Fstrong> している。原因: trainer recipe (densification、refine schedule、capacity bound、eval methodology) が dominant。orig 3DGS が最低なのは off-object floater が white-bg eval 下で penalize されて codebase eval (28.4 dB) にも影響、§6 参照。",{"type":89,"text":385},"\u003Cstrong>(3) gsplat vs orig 3DGS (同 V100、同 CUDA native)\u003C\u002Fstrong>: 両者とも CUDA native だが gsplat は simple_trainer minimal、orig は l1+ssim+fused_ssim+exposure compensation。それでも gsplat が +4.5 dB 上回るのは \u003Cstrong>gsplat の DefaultStrategy が NeRF Synthetic の eval (white-bg) と整合的に train する\u003C\u002Fstrong>ため。orig 3DGS 上流の \u003Ccode>image *= alpha_mask\u003C\u002Fcode> 損失は eval\u002Ftrain で convention 差を作る (本 .md §6)。",{"type":89,"text":387},"\u003Cstrong>(4) 卒論 Chapter 4.1\u002F4.2 への含意\u003C\u002Fstrong>:",{"type":104,"items":389},[390,391,392],"表は「\u003Cstrong>3 軸のキャプチャレベル + eval convention\u003C\u002Fstrong> をどう取るかで 4.5 dB \u002F 5 分単位で結果が変わる」という事実を最初に明示する","純抽象差分を取りたい場合は「\u003Cstrong>同 GPU + 同 trainer + 同 convention で渡したい kernel API だけを差し替える\u003C\u002Fstrong>」という新しい control variable が必要 (例: brush の trainer を CUDA backend で動かすか、gsplat の trainer を wgpu に移植する)","本卒研の M-3.x baseline (自作 native Metal、24.84 dB) は「同 eval convention で比較すれば brush native Metal 37.40 dB に対し -12.6 dB のギャップが本研究の trainer 最適化余地」という Chapter 4 の主張は変わらない",{"type":67,"text":394},"8. リモートファイル (c32 \u002F NFS 共有)",{"type":110,"lang":396,"text":397},"text","\u002Fhome\u002Fotake_26\u002F\n├── miniconda3\u002Fenvs\u002Forig3dgs-env\u002F        ← c33 構築、c32 で sm_70 再 build 済 (c33 で要再 build)\n├── repos\u002Fgaussian-splatting\u002F            ← graphdeco-inria HEAD 54c035f\n│   ├── scene\u002Fdataset_readers.py         ← np.byte → np.uint8 修正済 (in-place、.bak 保持)\n│   ├── train.py                         ← eval ブロックに alpha_mask 適用 patch (§3.2)\n│   └── submodules\u002F{diff-gaussian-rasterization,simple-knn,fused-ssim}\u002F\n├── datasets\u002Fnerf_synthetic\u002Flego\u002F\n│   ├── transforms_{train,val,test}.json  ← .png strip 済\n│   ├── transforms_{train,val,test}.json.bak  ← オリジナル保持\n│   └── (test\u002F 実体は 36\u002F200 frame しか無いが、transforms_test.json は val を copy)\n├── runs\u002Forig3dgs-lego-1k-smoke\u002F         ← smoke 結果\n└── runs\u002Forig3dgs-lego-30k\u002F              ← 本 bench\n    ├── point_cloud\u002Fiteration_30000\u002Fpoint_cloud.ply (237,920 vert, 17 MB)\n    ├── cameras.json \u002F cfg_args \u002F exposure.json \u002F input.ply\n    └── train.log\n",{"type":67,"text":399},"9. 失敗箇所と対処 (sm_70 ABI 含む)",{"type":70,"columns":401,"align":406,"rows":407},[402,403,404,405],"#","失敗","原因","対処",[75,75,75,75],[408,413,418,423,428],[409,410,411,412],"F1","\u003Ccode>MemoryError: std::bad_alloc cudaErrorMemoryAllocation\u003C\u002Fcode> (simple_knn \u003Ccode>distCUDA2\u003C\u002Fcode>)","c33 で build した sm_86 .so を V100 (sm_70) で load → kernel ABI mismatch、\u003Ccode>distCUDA2\u003C\u002Fcode> への引数が garbage に解釈されて 21 TB alloc 要求","\u003Ccode>TORCH_CUDA_ARCH_LIST=7.0\u003C\u002Fcode> で 3 拡張を \u003Ccode>--force-reinstall --no-build-isolation --no-deps\u003C\u002Fcode> 再 build",[414,415,416,417],"F2","\u003Ccode>TypeError: Cannot handle this data type: (1, 1, 3), |i1\u003C\u002Fcode> (PIL fromarray)","numpy 2.4 + Pillow 12.2 で \u003Ccode>np.byte\u003C\u002Fcode> (signed int8) が RGB image として拒否","\u003Ccode>dtype=np.byte → np.uint8\u003C\u002Fcode>",[419,420,421,422],"F3","\u003Ccode>FileNotFoundError: .\u002Ftrain\u002Fr_0.png.png\u003C\u002Fcode>","dataset 配布元差異で \u003Ccode>file_path\u003C\u002Fcode> に既に \u003Ccode>.png\u003C\u002Fcode> が含まれ、loader が再度 \u003Ccode>.png\u003C\u002Fcode> を append","3 split 全部から \u003Ccode>.png\u003C\u002Fcode> を strip",[424,425,426,427],"F4","smoke 1k で PSNR 3.05 dB (loss 0.05 \u002F 学習自体は順調)","eval ブロックで render に α マスク未適用、白背景 render vs 黒背景 gt の直接 L2","eval ブロックに \u003Ccode>image *= alpha_mask\u003C\u002Fcode> 2 行追加",[429,430,431,432],"F5 (finding)","30k で codebase eval 28.4 dB vs paper-std eval 14.6 dB の乖離","train loss が α-mask render なので off-object floater が学習中 penalize されず、white-bg eval で目立つ","§6 で finding として記録、修正は scope 外",{"type":67,"text":434},"10. 再現コマンド (one-liner)",{"type":110,"lang":111,"text":436},"ssh matsudalab-c32 \u003C\u003C 'EOF'\nsource ~\u002Fminiconda3\u002Fetc\u002Fprofile.d\u002Fconda.sh\nconda activate orig3dgs-env\nexport CUDA_VISIBLE_DEVICES=1\ncd ~\u002Frepos\u002Fgaussian-splatting\npython train.py \\\n    -s ~\u002Fdatasets\u002Fnerf_synthetic\u002Flego \\\n    --model_path ~\u002Fruns\u002Forig3dgs-lego-30k \\\n    --iterations 30000 --eval --white_background \\\n    --test_iterations 5000 10000 15000 20000 25000 30000 \\\n    --save_iterations 30000 --disable_viewer\nEOF\n",{"type":67,"text":438},"11. 残課題",{"type":104,"ordered":440,"items":441},true,[442,443,444],"\u003Cstrong>c33 (A6000) で orig3dgs-env を sm_86 再 build\u003C\u002Fstrong> — 副作用解消 (or マルチ sm wheel に統一)","\u003Cstrong>paper-standard eval (B 方式) で trainer を回す ablation\u003C\u002Fstrong> — \u003Ccode>image *= alpha_mask\u003C\u002Fcode> を除去し \u003Ccode>bg=white\u003C\u002Fcode> で raw 比較、PSNR が 35 dB まで上がるか検証 (A.3 phase 2e 候補)","\u003Cstrong>3 層対比表の wallclock 解釈\u003C\u002Fstrong> — brush 8m24 \u002F orig 10m37 \u002F gsplat 5m03 のうち、純粋抽象コストを取り出す制御実験 (Chapter 4.2 詳細課題)",{"type":67,"text":446},"12. 関連",{"type":104,"items":448},[449,450,451,452,453],"A.5 final ablation: \u003Ccode>final-ablation-table.md\u003C\u002Fcode>","gsplat V100 bench: \u003Ccode>c32-gsplat-smoke.md\u003C\u002Fcode>","brush M4 Max bench: \u003Ccode>m4-brush-bench.md\u003C\u002Fcode>","CUDA env setup: \u003Ccode>c33-cuda-setup-notes.md\u003C\u002Fcode>","関連 memory: [[research_direction]], [[research_plan_doc]]",[],[456,475,489],{"id":29,"title":457,"date":9,"status":10,"polarity":458,"category":459,"axes":460,"tags":461,"task_code":24,"related_runs":466,"delta_psnr":469,"delta_wallclock":470,"rank":471,"verdict":472,"impact_summary":473,"detail_path":474},"c32 V100 gsplat smoke — NFS 共有 env を異 sm 機へ持ち込み JIT 再 build 1 回で動作確認","positive","setup",[14],[16,462,18,19,20,463,464,465],"gsplat","smoke","nfs","jit",[467,468],"gsplat-lego-1k-smoke","gsplat-lego-50-dryrun",19.81,"10.5s \u002F 1k step","mid","accepted","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 \u002F val PSNR 19.81 dB。30k full は Phase 2b。","\u002Ffindings\u002Fc32-gsplat-smoke\u002F",{"id":30,"title":476,"date":9,"status":10,"polarity":12,"category":11,"axes":477,"tags":478,"task_code":24,"related_runs":483,"delta_psnr":485,"delta_wallclock":486,"rank":34,"verdict":35,"impact_summary":487,"detail_path":488},"M4 Max 上 brush (wgpu→Metal) の 30k baseline — wgpu 抽象は自作より速かった",[14],[16,479,480,481,482,23],"brush","wgpu","baseline","m4-max",[484],"lego-sh3-30k","+11.13 dB (brush 比優位)","−65.6% (brush の方が速い)","wgpu 抽象は自作 native より遅いはず、という想定が逆。同一 M4 Max 上で brush (wgpu) が 9m08s \u002F 37.40 dB、自作 (Metal 直) が 26m32s \u002F 26.27 dB。第 2 軸 (抽象コスト定量化) の主張を再 framing する必要が確定。","\u002Ffindings\u002Fm4-brush-bench\u002F",{"id":31,"title":490,"date":491,"status":10,"polarity":492,"category":459,"axes":493,"tags":494,"task_code":24,"related_runs":499,"delta_psnr":-1,"delta_wallclock":500,"rank":471,"verdict":472,"impact_summary":501,"detail_path":502},"c33 CUDA env setup — gsplat \u002F orig 3DGS \u002F brush の 3 env を A6000 + NFS 共有ホームで構築","2026-05-22","neutral",[14],[16,459,20,495,496,462,17,479,497,498,464],"a6000","c33","conda","rust",[],"~18.6 GB disk","c33 (A6000, sm_86) に gsplat-env \u002F orig3dgs-env \u002F Rust + brush の 3 env を build。NFS 共有ホーム経由で c32 \u002F c34 にも継承可能。3 env とも import \u002F --help \u002F --version レベルで動作確認 OK。実 training (Lego 30k) は Phase 2 で。","\u002Ffindings\u002Fc33-cuda-setup-notes\u002F",1782449788626]