跳转到内容

Instant-NGP — 把 NeRF 训练从几小时压到 5 秒

待复核

Instant-NGP(Instant Neural Graphics Primitives)是 NVIDIA 2022 年的工程奇迹:让训一个 NeRF 从几小时缩到 5 秒。日常类比:原来背一本 500 页字典靠死记硬背(一个超大 MLP 把整个场景塞进去),现在改成”小卡片盒”——把空间切成多层网格,每层一个哈希表(hash table)存特征向量,最后只用一个超小 MLP 解读。

核心一句:多分辨率哈希编码(multi-resolution hash encoding)+ 极小 MLP + 全融合 CUDA 核(tiny-cuda-nn)

效果:

  • NeRF 原版:3-4 小时一个场景
  • Instant-NGP:5 秒就能看出形状,1-2 分钟就到原版质量

NeRF(nerf-2020)2020 年震撼业界——一个 MLP 居然能”背下”整个 3D 场景。但训练慢到工业界用不了。Instant-NGP 解决了这个鸿沟:

  • 让神经渲染从研究 demo 走到产品:NVIDIA Omniverse、Luma AI、无人机三维重建都直接用它
  • 训练快到能实时迭代:拍完照片几分钟就能看结果,而不是隔夜
  • 同一个编码套路换数据就能跑:NeRF / 千兆像素图像 / SDF(带符号距离场)/ 神经体渲染都通用
  • 后续工作(Plenoxels、3D Gaussian Splatting、NeRFStudio)几乎都参考它的工程实现

不夸张地说:没有 Instant-NGP,神经渲染还停在 PhD 论文里

整个方法可以拆成 三块

1. 多分辨率哈希网格(multi-resolution hash grid)

Section titled “1. 多分辨率哈希网格(multi-resolution hash grid)”

把 3D 空间切成 L 层(论文默认 L=16)从粗到细的网格:

  • 第 0 层:粗网格,比如 16×16×16 个体素
  • 第 L-1 层:细网格,比如 512×512×512 个体素
  • 每层都有一个哈希表,大小 T(默认 2^14 到 2^24),表里存 2 维特征向量

查一个 3D 点 (x, y, z) 的特征:

  1. 在每一层找它落在哪个体素 → 算 8 个角点的整数坐标
  2. 用一个空间哈希函数把整数坐标映射到表里的位置
  3. 取出 8 个角的特征 → 三线性插值(trilinear interp)→ 这一层的 2 维特征
  4. 16 层拼起来 → 32 维特征向量

2. 故意让哈希冲突(collision),让 MLP 自己消歧

Section titled “2. 故意让哈希冲突(collision),让 MLP 自己消歧”

哈希表小于真实体素数(粗层不冲突,细层一定冲突)。这看起来要命,实际是关键

  • 真正”重要”的位置(比如物体表面)梯度大,会反复更新对应的哈希槽
  • 不重要的空白区域梯度小,被冲突的”重要点”覆盖也无所谓
  • 末端的小 MLP 在 32 维特征上学会”哪些组合代表真实表面、哪些是噪声”

MLP 只有 2-3 层、64 维宽。这种超小 MLP 在普通框架(PyTorch / TensorFlow)里反而慢,因为每层之间要进出显存。tiny-cuda-nn 把整个 MLP 融合成一个 CUDA kernel,权重全程留在寄存器里,绕开显存带宽瓶颈。

三块一起:哈希网格记”在哪”,小 MLP 记”是什么”,tiny-cuda-nn 让前两者跑出 GPU 的极限。

案例 1:官方仓库跑一个 NeRF 场景(有 NVIDIA GPU)

Section titled “案例 1:官方仓库跑一个 NeRF 场景(有 NVIDIA GPU)”
Terminal window
git clone --recursive https://github.com/NVlabs/instant-ngp
cd instant-ngp && cmake . -B build && cmake --build build --config RelWithDebInfo -j
./build/instant-ngp data/nerf/fox # 自带 fox 场景;GUI 里几秒见形状

逐步解释:① 递归克隆带上 tiny-cuda-nn 子模块;② CMake 编出带 GUI 的二进制;③ 指向已标定好的 NeRF 数据集目录。论文量级:同卡上约 5 秒可见形状,1–5 分钟逼近原版 NeRF 数小时质量(按场景略有出入)。

同一套哈希编码 + 小 MLP,只换输入输出:

  • NeRF(x,y,z,视角) → 颜色+密度
  • 千兆像素图(x,y) → RGB
  • SDF(x,y,z) → 到表面的距离
  • 神经体(x,y,z,t) → 体积颜色

案例 3:哈希查询伪代码(理解“卡片盒”怎么查)

Section titled “案例 3:哈希查询伪代码(理解“卡片盒”怎么查)”
def hash_encode(x, y, z, tables, L=16):
feats = []
for level in range(L):
# 1) 落在哪个体素 → 8 个角的整数坐标
corners = voxel_corners(x, y, z, resolution[level])
# 2) 空间哈希进表;3) 取出 2 维特征做三线性插值
feats.append(trilinear([tables[level][spatial_hash(c)] for c in corners], weights))
return concat(feats) # L*2 维,默认 32 维,再喂小 MLP

为什么 PyTorch 复刻常慢 5–10×:64 维宽的超小 MLP 在普通框架里每层进出显存;tiny-cuda-nn 把整网融成一个 CUDA kernel,权重留在寄存器。

  1. 哈希表太小 → 细节糊:T=2^14 对小场景够,大场景需要 2^22 以上,否则细节糊成马赛克。
  2. 空白区域出现”漂浮物”(floaters):哈希冲突让一些空白格学到错误密度。论文用”密度网格剪枝”+ “提前停止采样”缓解。
  3. tiny-cuda-nn 只支持 NVIDIA:AMD / Apple Silicon 用户基本无解,只能换纯 PyTorch 实现并接受变慢。
  4. 学习率不能照抄 NeRF:哈希编码的梯度分布完全不同,要用 Adam + 较大学习率(1e-2)+ weight decay = 0。
  5. 多分辨率层数 L 不要随意调:默认 16 是细心调过的,砍到 8 会丢细节,加到 32 训练更慢但质量不见涨。

适用

  • NeRF 加速训练 / 推理(最主流用法)
  • 单场景过拟合任务(gigapixel / SDF / 神经体)
  • 有 NVIDIA GPU、追求秒级反馈的工程团队

不适用

  • 跨场景泛化(哈希表是单场景过拟合,换场景要重训)
  • 极大场景(街区级 NeRF)—— 哈希冲突会爆炸,需要分块(block-NeRF 思路)
  • AMD / Apple Silicon 平台(tiny-cuda-nn 不支持)
  • 对视角外推质量要求极高的场景(原版 NeRF 在难视角上略好)
  • 2020:NeRF 论文出来,效果惊艳但训练 hours/scene,业界看了说”等等吧”
  • 2021:Plenoxels(无 MLP,纯体素)、KiloNeRF(拆成 1000 个小 MLP)等方案陆续提速到分钟级
  • 2022 年 1 月:Müller 等人放出 Instant-NGP,5 秒直接破圈,Twitter 疯传
  • 2022 SIGGRAPH:拿下最佳论文奖(Best Paper)
  • 2023-2024:3D Gaussian Splatting(3d-gaussian-splatting)登场,但 Instant-NGP 仍是 NeRF 类方法的工业基线
  1. 数据结构 + 小模型 > 单一大模型:把”记忆”外包给可索引的结构(哈希表),让小 MLP 只做”解读”
  2. 故意制造冲突 + 让梯度自己解决——这是机器学习思维取代纯算法思维的典型案例
  3. 算法和硬件绑死:tiny-cuda-nn 的全融合是论文”快”的另一半,论文不可分割
  4. 同一编码通吃多任务——好的表示(representation)跨问题迁移,比单点优化更值钱
  5. 从 demo 到产品,常常缺的不是”更好的算法”,而是”工程极限的实现”
  • nerf-2020 —— Instant-NGP 是给 NeRF 提速的工程方案,原理仍是体渲染
  • 3d-gaussian-splatting —— 同样追求实时神经渲染,但放弃了 MLP,用显式高斯
  • ampere-architecture-2020 —— 全融合 CUDA 核充分利用 Ampere 的寄存器和共享内存
  • attention —— 哈希编码本质是”多分辨率位置编码”,与 Transformer 的位置编码哲学相通
  • pytorch —— 主流复刻基于 PyTorch,但全融合内核仍依赖 tiny-cuda-nn
  • instant-ngp-2022 —— Instant-NGP — 秒级训练 NeRF 的多分辨率哈希编码
  • plenoxels-2022 —— Plenoxels — 不要神经网络也能渲染辐射场