量化训练实战:Spirula Studio如何用4/8/16-bit在8GB显存塞下1000万高斯
【免费下载链接】spirula-studioCross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA.项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio
Spirula Studio 是一款跨厂商的 3D 高斯泼溅(3D Gaussian Splatting)训练器,从原始照片、视频一路训练到可贴图网格,支持 Vulkan 与 CUDA 双后端,无需 Python/PyTorch。本文带你拆解它的量化训练实战:通过 4/8/16-bit 混合精度存储,在 8GB 显存里轻松塞下 1000 万个带完整球谐(SH3)颜色的高斯。
📊 先算一笔账:1000万高斯到底吃多少显存?
训练 3DGS 模型时,显存大头不是高斯本身,而是每个高斯的球谐颜色系数 + 每个系数的 Adam 优化器状态(一阶矩 g1 + 二阶矩 g2,两份 fp32)。
以 1000 万高斯、完整 SH3(15 个系数 × 3 通道 = 45 个"单元")为例,仅 SH 部分:
| 存储内容 | fp32 全精度 | Spirula 量化后 |
|---|---|---|
| SH 颜色系数(值) | ~1.8 GB | ~0.9 GB(16-bit) |
| SH Adam 状态(g1+g2) | ~3.6 GB | ~0.9 GB(8-bit 对数编码) |
| 位置/缩放/不透明度等优化器状态 | fp32 | ~减半(16-bit) |
可以看到,量化不是"省一点点",而是把最贵的两块内存各砍一半甚至四分之三。这套编码实现全部集中在 src/core/Tensor.h 的QuantizedAdamState(4/8/16-bit 的 Adam 状态编码)与 src/core/Tensor.h 的QuantizedTensor(8/16-bit 线性块量化)里。
🎛️ 一个开关:4/8/16-bit 各管什么?
普通用户不需要关心底层位宽——训练配置里只有一个quantization_level选项(默认 1,定义在 src/config/TrainConfig.h),GUI 中显示为"颜色存储精度"。它在 src/app/TrainerCore.cpp 中被展开成三个位宽:
0(全精度):SH 值 32-bit、SH 优化器 32-bit、非 SH 优化器 32-bit —— 质量基准,显存占用最大;1(量化,默认):SH 值16-bit、SH Adam 状态8-bit、非 SH 优化器16-bit—— 视角相关颜色内存约省一半,肉眼几乎无差别。
至于 4-bit,则是编码层保留的下限:QuantizedAdamState支持 4-bit(每单元 1 字节存两个半字节),块级对数存储QuantizedTensorLog同样支持 4/8-bit,为更小的显存场景留足了余量。
🔬 为什么 8-bit 量化 Adam 状态居然不掉精度?
直觉上,把 Adam 的二阶矩压到 8-bit 会"损失惨重",Spirula 用了两个技巧把损失补回来:
- 对数域编码:不直接存 √g2,而是存
log1p(√g2/ε)。fp32 线性量化在"小数值"区间相对精度最差,而这恰是 Adam 归一化最敏感的区域;对数变换让每个数量级获得均匀分辨率,实测在零额外存储下把单步信噪比提升 20–30 dB(见 src/core/Tensor.h 的注释推导)。 - 256 单元一块的块级 min/max 边界表:每 256 个连续单元共享一对 float 边界,解码只是
min + (max-min) × q/kQMax一次乘法。边界表开销仅占总内存的 ~1/128,可以忽略。
两个细节保证量化"无感":梯度本身永远不量化(SH 梯度保持 fp32 写入);块级边界让相邻高斯的相近系数共享同一把"尺子",量化误差在局部高度一致而非随机抖动。
⚡ 实测:量化后训练反而更快
量化不只是省显存,还省带宽。Spirula 为量化布局设计了转置式存储(每 256 个高斯为一块,单元按字对配对),让一个 wave 的读写从触碰 32 条缓存行降到 2 条。在 500 万高斯的 bicycle 数据集上,融合优化器内核耗时从13.8 ms 降到 8.5 ms(CUDA)、20.3 ms 降到 13.1 ms(Vulkan),详见 docs/notes/sh-quant-layout.md。
更极端场景也覆盖了:当高斯数达到 1 亿(SH3 下约 46 亿个单元)时,单元索引用 64-bit 寻址;Vulkan 后端通过elem_at显式字节寻址绕开驱动 32-bit 索引回绕问题(docs/notes/vram-splat-x-img.md "The 4 GiB rule" 一节)。
✅ 新手上手步骤
- 从 Releases 下载对应平台的单文件可执行程序,双击打开 GUI(无需安装 Python 或 COLMAP);
- 导入照片或视频数据集,GUI 内置 SfM、抽帧与 AI 蒙版,一键完成预处理;
- 训练设置里保持"颜色存储精度"为默认档位
1即可——8GB 显存即可训练千万级 SH3 高斯;追求极限质量可切回0; - 云端训练用 CLI:
spirula train默认会开一个 Web 查看器端口,通过 SSH 转发即可在浏览器观察进度。
📚 延伸阅读
- 量化存储布局原理:docs/notes/sh-quant-layout.md
- 投影/栅格化显存剖析:docs/notes/vram-splat-x-img.md
- 整体架构(前端→引擎→双后端):docs/architecture.md
- 引擎配置定义:src/engine/EngineConfig.h
- SH 解码着色器(CUDA/Vulkan 镜像):src/shaders/harmonics.slang、src/backend/vulkan/shaders/sh_quant.slang
- 各量化档位的回归测试:src/backend/tests/densify_parity.cpp
一句话总结:Spirula Studio 把"量化"从推理端搬进了训练端——16-bit 存颜色、8-bit 对数编码存 Adam 状态,让你在消费级 8GB 显卡上训练 1000 万高斯全 SH 模型,而且比全精度跑得更快。
【免费下载链接】spirula-studioCross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA.项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考