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) 的特征:
- 在每一层找它落在哪个体素 → 算 8 个角点的整数坐标
- 用一个空间哈希函数把整数坐标映射到表里的位置
- 取出 8 个角的特征 → 三线性插值(trilinear interp)→ 这一层的 2 维特征
- 16 层拼起来 → 32 维特征向量
2. 故意让哈希冲突(collision),让 MLP 自己消歧
Section titled “2. 故意让哈希冲突(collision),让 MLP 自己消歧”哈希表小于真实体素数(粗层不冲突,细层一定冲突)。这看起来要命,实际是关键:
- 真正”重要”的位置(比如物体表面)梯度大,会反复更新对应的哈希槽
- 不重要的空白区域梯度小,被冲突的”重要点”覆盖也无所谓
- 末端的小 MLP 在 32 维特征上学会”哪些组合代表真实表面、哪些是噪声”
3. tiny-cuda-nn:全融合 CUDA 核
Section titled “3. tiny-cuda-nn:全融合 CUDA 核”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)”git clone --recursive https://github.com/NVlabs/instant-ngpcd 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 数小时质量(按场景略有出入)。
案例 2:换数据就能跑别的任务
Section titled “案例 2:换数据就能跑别的任务”同一套哈希编码 + 小 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,权重留在寄存器。
- 哈希表太小 → 细节糊:T=2^14 对小场景够,大场景需要 2^22 以上,否则细节糊成马赛克。
- 空白区域出现”漂浮物”(floaters):哈希冲突让一些空白格学到错误密度。论文用”密度网格剪枝”+ “提前停止采样”缓解。
- tiny-cuda-nn 只支持 NVIDIA:AMD / Apple Silicon 用户基本无解,只能换纯 PyTorch 实现并接受变慢。
- 学习率不能照抄 NeRF:哈希编码的梯度分布完全不同,要用 Adam + 较大学习率(1e-2)+ weight decay = 0。
- 多分辨率层数 L 不要随意调:默认 16 是细心调过的,砍到 8 会丢细节,加到 32 训练更慢但质量不见涨。
适用 vs 不适用场景
Section titled “适用 vs 不适用场景”适用:
- NeRF 加速训练 / 推理(最主流用法)
- 单场景过拟合任务(gigapixel / SDF / 神经体)
- 有 NVIDIA GPU、追求秒级反馈的工程团队
不适用:
- 跨场景泛化(哈希表是单场景过拟合,换场景要重训)
- 极大场景(街区级 NeRF)—— 哈希冲突会爆炸,需要分块(block-NeRF 思路)
- AMD / Apple Silicon 平台(tiny-cuda-nn 不支持)
- 对视角外推质量要求极高的场景(原版 NeRF 在难视角上略好)
历史小故事(可跳过)
Section titled “历史小故事(可跳过)”- 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 类方法的工业基线
- 数据结构 + 小模型 > 单一大模型:把”记忆”外包给可索引的结构(哈希表),让小 MLP 只做”解读”
- 故意制造冲突 + 让梯度自己解决——这是机器学习思维取代纯算法思维的典型案例
- 算法和硬件绑死:tiny-cuda-nn 的全融合是论文”快”的另一半,论文不可分割
- 同一编码通吃多任务——好的表示(representation)跨问题迁移,比单点优化更值钱
- 从 demo 到产品,常常缺的不是”更好的算法”,而是”工程极限的实现”
- 项目主页 + 代码:NVlabs/instant-ngp(C++ + CUDA,含交互式 GUI)
- 论文 PDF:Instant Neural Graphics Primitives
- tiny-cuda-nn 仓库:NVlabs/tiny-cuda-nn(独立的全融合 MLP 库)
- NeRFStudio:nerfstudio-project/nerfstudio(把 Instant-NGP 等多个 NeRF 变体打包的研究框架)
- nerf-2020 —— 被 Instant-NGP 加速的原始 NeRF
- 3d-gaussian-splatting —— 后来居上的另一条路:不用神经网络,直接用 3D 高斯
- ampere-architecture-2020 —— Instant-NGP 主要跑在 Ampere 系 GPU 上(RTX 30/A100)
- 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 — 不要神经网络也能渲染辐射场