OpenDLSS-NR:NVIDIA DLSS 5 神经渲染的 Vulkan 重实现(逐位精确)
TL;DR
OpenDLSS‑NR 在 Vulkan 上以 逐位精确 的方式重现了 NVIDIA 的 DLSS 5 神经渲染网络,匹配原始 71 块 Swin/ViT 模型的每一个中间张量,并在 RTX 4070 SUPER 上实现每 1080p 帧低于 10 ms 的运行速度。
项目提供的内容
- 精确的网络复刻 – 71 个 Transformer 块(六个池化层级),与 DLSS‑NR 构建版本 310.8.0 完全相同,使用 FP8(E4M3)激活和 FP16 累加。所有 75 个块边界均与原始版本逐字节匹配。
- 原生 Vulkan 实现 – C++20 主机代码,GLSL 参考内核,以及手动编写的 PTX 内核,充分利用 NVIDIA 的协作矩阵 FP8 GEMM、cp.async 环和无屏障计数器链。
- WebGPU 备用方案 – 第二个端口在浏览器中运行相同网络,无需张量核心或 FP8,实现功能对等(逐位精确性由规范定义,而非硬件)。
- 演示应用程序 – 将网络集成到修补后的 Filament 渲染器中,提供 ImGui 控制界面和 glTF 场景库。
- 开源工具链 – 脚本用于获取 Vulkan 头文件、glslang、PTX 生成器和 Filament;无需完整的 Vulkan SDK。
网络架构概览
该模型是一个 U‑Net,由移位窗口 Transformer 块组成,并在顶部附加一个全局 ViT。关键规格如下:
| 属性 | 值 |
|---|---|
| 块数 | 71(75 个块边界) |
| Transformer 类型 | Swin‑window + ViT |
| 精度 | FP8(E4M3)激活,FP16 累加 |
| 权重大小 | 141 MiB |
| 输入 | 低动态范围代理帧,三个高斯噪声通道,重投影的前一帧输出,五个条件标量 |
| 输出 | 每像素四个 f32 通道:RGB 残差 + 时间混合逻辑值 |
该网络 不进行上采样;它重新渲染相同分辨率的帧,添加细节并调整色调。
构建、运行与验证流程
- 获取工具链 –
scripts\fetch_tools.ps1下载 glslang 16.6.0、Vulkan‑Headers v1.4.363、Volk、CMake 3.31 和 Ninja 1.13。 - 编译 –
scripts\build.ps1构建着色器、PTX 和dlss5vk.exe驱动程序。 - 准备 Filament 演示 –
scripts\fetch_filament.ps1和scripts\build_filament.ps1克隆 Filament v1.77.0,应用运动向量补丁,并构建演示二进制文件。 - 运行 –
build\dlss5vk.exe bench --model <dir> --width 768 --height 768测量性能;parity对照固定参考输出检查逐位精确性;verify执行逐内核二分查找。 - 模型提供 – 用户需提供包含
manifest.json和打包的 E4M3 权重文件的目录;仓库 不提供 权重文件。
性能数据(RTX 4070 SUPER)
整个网络每帧执行 241 次分派。40 帧的中位时间如下:
| 分辨率 | 每帧耗时 |
|---|---|
| 768×768 | 2.8 ms |
| 1920×1080 | 7.8 ms |
| 2560×1440 | 12.6 ms |
| 3840×2160 | 29.3 ms |
GPU 时钟节流可能导致中位数上升几个百分点;表格报告的是最小值,以确保公平比较。
如何保证精确性
- 对等模式 –
dlss5vk parity --fixture <dir>将网络与 NVIDIA 实现捕获的参考输出进行对比。它验证每个块边界处的每一个张量。 - 数值契约 –
docs/numerics.md文件定义了四种判定类别:逐位精确(通过)、零值符号(可接受)、在一位码内(8 位捕获容差)和 不匹配。 - 逐内核验证 –
verify要求固定文件包含块 0 的参考输出和输入特征,允许对任何差异进行细粒度二分查找。 - 可切换路径 – 环境变量(如
DLSS5VK_UNFUSED=1)允许开发者用 GLSL 参考内核替换 PTX 内核,同时保持输出一致,对调试或无 FP8 支持的硬件非常有用。
Hacker News 社区反馈
"与原始版本逐位精确——这是什么魔法?太令人印象深刻了!" – TheJCDenton
"1080p 下几乎 8 ms 的耗时似乎非常昂贵;原始版本是否也占用如此多的渲染预算?" – flohofwoe
"我很惊讶它没有将 z‑buffer 作为输入;这对神经渲染来说似乎很有用。" – Lerc
"没有权重的情况下,这有多实用?NVIDIA 为每款游戏提供模型;一个通用模型是否可行?" – franticgecko3
这些评论突出了两个反复出现的主题:逐字节对等的技术成就,以及关于性能影响和预训练权重可用性的实际问题。
局限性与缺失部分
- 不支持 DLSS‑SR – 该仓库仅实现神经渲染(NR)路径;超分辨率变体缺失。
- 权重为外部提供 – 用户必须自行获取或生成 E4M3 权重文件;仓库不包含任何专有的 NVIDIA 权重。
- 时间历史仅在演示中存在 –
dlss5vk工具处理单帧,无历史记录;演示使用重投影的前一帧输出以实现时间稳定性。 - 硬件要求 – 需要具备 Vulkan 扩展
VK_KHR_cooperative_matrix、VK_NV_cooperative_matrix2、VK_EXT_shader_float8和VK_NV_cuda_kernel_launch的 Ada 代 NVIDIA GPU。
为何这很重要
OpenDLSS‑NR 证明了复杂的、专有的 AI 加速图形管线可以在开源 Vulkan 中被忠实复现,从而支持独立研究、跨平台实验(包括 WebGPU)以及透明的性能基准测试。该项目严格的对等性测试为神经渲染的可复现性树立了新标准。
快速入门清单
- 硬件 – NVIDIA Ada 代 GPU(RTX 40 系列或更新),并支持所需的 Vulkan 扩展。
- 工具链 – Windows、Visual Studio 2022(C++ x64)、Git、Python 3、Node.js/npm、Pillow。
- 克隆仓库 –
git clone https://github.com/maanHimself/OpenDLSS-NR.git。 - 运行获取脚本 – 在
scripts/中执行 PowerShell 脚本。 - 提供模型 – 将包含
manifest.json和打包权重文件的目录放置好;设置--model <dir>或DLSS5VK_MODEL。 - 运行演示 –
build\dlss5vk.exe bench …或双击演示可执行文件。
许可证
该仓库采用 MIT 许可证发布;第三方组件列于 NOTICE 文件中。
Sources
相关
- 项目
- 项目
- 项目
- 项目
- 项目