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 残差 + 时间混合逻辑值

该网络 不进行上采样;它重新渲染相同分辨率的帧,添加细节并调整色调。


构建、运行与验证流程

  1. 获取工具链 – scripts\fetch_tools.ps1 下载 glslang 16.6.0、Vulkan‑Headers v1.4.363、Volk、CMake 3.31 和 Ninja 1.13。
  2. 编译 – scripts\build.ps1 构建着色器、PTX 和 dlss5vk.exe 驱动程序。
  3. 准备 Filament 演示 – scripts\fetch_filament.ps1 和 scripts\build_filament.ps1 克隆 Filament v1.77.0,应用运动向量补丁,并构建演示二进制文件。
  4. 运行 – build\dlss5vk.exe bench --model <dir> --width 768 --height 768 测量性能;parity 对照固定参考输出检查逐位精确性;verify 执行逐内核二分查找。
  5. 模型提供 – 用户需提供包含 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)以及透明的性能基准测试。该项目严格的对等性测试为神经渲染的可复现性树立了新标准。


快速入门清单

  1. 硬件 – NVIDIA Ada 代 GPU(RTX 40 系列或更新),并支持所需的 Vulkan 扩展。
  2. 工具链 – Windows、Visual Studio 2022(C++ x64)、Git、Python 3、Node.js/npm、Pillow。
  3. 克隆仓库 – git clone https://github.com/maanHimself/OpenDLSS-NR.git。
  4. 运行获取脚本 – 在 scripts/ 中执行 PowerShell 脚本。
  5. 提供模型 – 将包含 manifest.json 和打包权重文件的目录放置好;设置 --model <dir> 或 DLSS5VK_MODEL。
  6. 运行演示 – build\dlss5vk.exe bench … 或双击演示可执行文件。

许可证

该仓库采用 MIT 许可证发布;第三方组件列于 NOTICE 文件中。

Sources

相关

  • 项目
  • 项目
  • 项目
  • 项目
  • 项目