☰
为什么DLSS 5 NR不是超分器?OpenDLSS-NR揭开生成式神经渲染的原理
2026/10/23 1:54:11 网站建设 项目流程

【免费下载链接】OpenDLSS-NR

A Vulkan reimplementation of NVIDIA's DLSS 5 Neural Rendering network, bit-exact against the original.

项目地址:https://gitcode.com/gh_mirrors/op/OpenDLSS-NR
点击查看免费下载

OpenDLSS-NR 是一个用 Vulkan 重写 NVIDIA DLSS 5 Neural Rendering(NR)网络的开源项目,输出与原版逐字节一致。借助它我们能看清一个反直觉的事实:DLSS 5 NR 根本不是超分器——输入和输出是同一个分辨率,它靠噪声和时间历史"重新画"出画面。

🧐 先分清:NR 不放大,它"重画"

听到 DLSS,多数人想到的是 DLSS-SR:低分辨率渲染,再用神经网络放大到高分辨率。但 DLSS 5 里的 NR(Neural Rendering)是另一种物种,NVIDIA 称它为generative neural rendering(生成式神经渲染)网络:

  • 输入和输出同分辨率——网络内部没有任何输出放大;
  • 引擎先正常渲染一帧,NR 网络在此基础上重新渲染这一帧;
  • 从注入的高斯噪声出发,结合色调、结构、皮肤等条件信息,生成细节;
  • 同时按风格设置调整 tone、structure、skin 的表现。

先看项目文档里的实测对比(WebGPU 端,2048×1152,左:NR 关闭;右:NR 开启):

皮肤纹理、织物纤维、帽檐边缘的额外细节,都是网络"长"出来的,而不是从低分辨率插值出来的。

一个容易忽略的点:网络看到的不是 HDR 场景,而是一个 LDR 的"display proxy"(带软肩、sRGB 编码的近似显示帧),细节见 docs/frame.md。

🧠 网络内部:71 块 Transformer 的 U-Net

根据 README.md 与 docs/network.md 的描述,这套网络(对应 DLSS-NR 310.8.0)的关键参数是:

  • 71 个 shifted-window Transformer 块,按 U-Net 结构分布在6 个池化层级上;
  • 最底层是一个全局 ViT,能对整张图的 token 做全局注意力;
  • 全程FP8(E4M3)激活 + FP16 累加,跑在 tensor core 上;
  • 权重共141 MiB。

结构可以概括为"下采样压上下文 → 底部全局注意力 → 上采样恢复,并与每层细节做 skip 连接":

[全分辨率 32ch] block 0 ──────────── skip ────────────> block 70 → head │ 2×2 池化 ▲ 2× 上采样 [1/2 分辨率 32ch] blocks 1-4 ───── skip ─────> blocks 66-69 │ 池化 + 32→64 ▲ [1/4 分辨率 64ch] blocks 5-8 ───── skip ─────> blocks 62-65 │ …(逐级到 1024 通道)… ▲ [1/32 分辨率 1024ch] blocks 31-38:全局 ViT 注意力

每个块都是固定套路:FFN → QKV 投影 → 窗口注意力 → 输出投影,外加两条带学习的缩放 skip 连接。有两个设计点特别值得注意:

  1. 四相移位窗口:8×8 token 的窗口网格有 4 种原点偏移(0/4 像素),让窗口边界不会按固定模式切断细节——比常见 Swin 的两相交替更细;
  2. 缩放余弦注意力:q、k 先做余弦归一化再乘学习的每头 scale,使注意力分数有界。这正是 FP16 累加器和 3 位尾数权重量化能成立的前提,也省掉了 softmax 里通常的减最大值操作。

🔄 它如何"生成"一帧?16 进 4 出

网络每个像素吃16 条 f32 输入,吐4 条 f32 输出(docs/network.md):

输入 lane内容
0–23 条高斯噪声(按帧播种)
4–6当前帧 display proxy(中心化后)
7–9重投影后的上一帧输出(时间历史)
10–11风格 id / 128、局部色调
12–14结构 / 皮肤 / auto-mask 条件三元组

上图为 NR 关闭时的渲染帧,正是送入网络的当前帧 proxy 的来源。而输出的 4 个通道分工非常明确:

  • 通道 0–2:RGB 残差——按 1/4 强度叠加到 proxy 上(clamp(proxy + rgb / 4, 0, 1)),这就是"生成"出来的细节;
  • 通道 3:时间混合 logit——网络逐像素自己判断该保留多少上一帧历史,weight = sigmoid(logit) × blendScale,再与重投影历史做混合。

也就是说,最终画面 =神经结果与上一帧历史按网络自己的逐像素权重混合。细节不是从上一帧"查"来的,而是从噪声里"生成"的——这就是"生成式神经渲染"和帧插值的本质区别。完整的帧流水线(运动矢量、历史反馈、时间环)见 docs/frame.md。

🎯 逐字节复刻:为什么 bit-exact 是最难的部分

docs/numerics.md 里有一句话概括了 OpenDLSS-NR 的核心难点:

网络的身份不是实值函数,而是数值"发布"(舍入)的序列。

两个实现哪怕数学上完全等价,只要舍入顺序不同,输出的画面就会肉眼可见地不同。所以这个项目复刻的不是"同样的结果",而是同样的舍入序列:

  • 每个跨越 kernel 边界的值都是E4M3 字节或IEEE half,且必须"先舍入到 half、再舍入到 E4M3";
  • tensor core 使用与 NVIDIA 原生相同的mma.syncE4M3 指令、同样的 K 序;
  • 全部 75 个块边界逐字节比对通过。

为守住字节级一致,项目用四条独立路线互相印证:

路线位置说明
GLSL 参考路线shaders/cooperative-matrix FP8 GEMM,可读的"规范"
PTX 快速路线scripts/ptx/Python 生成 PTX:mma.sync、cp.async 环、无 barrier 计数链
CPU 参考src/reference.cpp逐 kernel 二分定位第一个出差异的地方
WebGPU 浏览器移植ports/browser-webgpu/没有 tensor core、没有 FP8,同样字节一致

最惊人的是浏览器版:WebGPU 上没有 tensor core、没有 FP8 类型,连exp2/fma的精度都不保证,它却复现出了完全相同的字节。代价是速度:512×512 约 72 ms,而 Vulkan 侧只要 2.7 ms。

⚡ 性能如何?241 个 dispatch 跑完一帧

整网每帧固定241 个 dispatch。实测(RTX 4070 SUPER,40 帧取最小值,docs/execution.md):

分辨率耗时达成算力
768×7682.8 ms105 TFLOP/s
1920×10807.8 ms131 TFLOP/s
2560×144012.6 ms137 TFLOP/s
3840×216029.3 ms133 TFLOP/s

低分辨率瓶颈是"stage 太小填不满 GPU"+ 241 次发射的固定开销;1080p 以上转为算力受限,约为该卡 FP8 张量峰值的一半。调度层的亮点是无 barrier 的计数链(producer 自旋等待 device counter)加看门狗兜底,详见 docs/execution.md。

🚀 如何跑起来

前置要求:Windows + NVIDIA Ada(RTX 40 系)或更新的 GPU,驱动需暴露VK_KHR_cooperative_matrix、VK_EXT_shader_float8等扩展。

powershell -File scripts\fetch_tools.ps1 [-Npm] # 一次性拉取工具链 powershell -File scripts\build.ps1 # 构建 dlss5vk 工具

常用子命令:

build\dlss5vk.exe bench --model <dir> --width 768 --height 768 build\dlss5vk.exe profile --model <dir> --width 768 --height 768 build\dlss5vk.exe parity --model <dir> --fixture <dir> # 与原始捕获逐字节比对

仓库还带一个基于 Filament 的交互式 demo(demo/):按N开关 NR、T开关时间历史,可直接复现本文的对比效果。

⚠️权重需要你自备:仓库只提供网络结构与推理代码,模型目录(manifest.json+ 11 个 E4M3 stage 文件,共 141 MiB)不随仓库分发,目录布局见 docs/weights.md。项目与 NVIDIA 无关联、不含任何 NVIDIA 软件。

❓ 常见疑问

Q:DLSS-SR 超分在哪里?NR 与 SR 是两张不同的网络,本仓库只实现了 NR,整个管线里不存在输出放大——这正是标题问题的答案。

Q:U-Net 里的上采样不算超分吗?不算。那是 decoder 内部把特征恢复到全分辨率的"内部上采样",输入输出分辨率始终不变。

Q:浏览器版值得用吗?ports/browser-webgpu/ 的价值在于可读性与可验证性:它是"把硬件特性逐条换成纯软件写法"的活教材,证明字节级一致性来自规范而非硬件。

想深挖任意一层,文档索引在 docs/README.md:network.md 是图,numerics.md 是精确性契约,execution.md 是调度,frame.md 是 demo 的帧流水线。

【免费下载链接】OpenDLSS-NR

A Vulkan reimplementation of NVIDIA's DLSS 5 Neural Rendering network, bit-exact against the original.

项目地址:https://gitcode.com/gh_mirrors/op/OpenDLSS-NR
点击查看免费下载
上一篇:cognee快速上手:10分钟搭建你的第一个AI应用
下一篇:Higress Helm安装终极指南:Kubernetes环境高效部署实战

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询