【免费下载链接】OpenDLSS-NR
A Vulkan reimplementation of NVIDIA's DLSS 5 Neural Rendering network, bit-exact against the original.
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 连接。有两个设计点特别值得注意:
- 四相移位窗口:8×8 token 的窗口网格有 4 种原点偏移(0/4 像素),让窗口边界不会按固定模式切断细节——比常见 Swin 的两相交替更细;
- 缩放余弦注意力:q、k 先做余弦归一化再乘学习的每头 scale,使注意力分数有界。这正是 FP16 累加器和 3 位尾数权重量化能成立的前提,也省掉了 softmax 里通常的减最大值操作。
🔄 它如何"生成"一帧?16 进 4 出
网络每个像素吃16 条 f32 输入,吐4 条 f32 输出(docs/network.md):
| 输入 lane | 内容 |
|---|---|
| 0–2 | 3 条高斯噪声(按帧播种) |
| 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×768 | 2.8 ms | 105 TFLOP/s |
| 1920×1080 | 7.8 ms | 131 TFLOP/s |
| 2560×1440 | 12.6 ms | 137 TFLOP/s |
| 3840×2160 | 29.3 ms | 133 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.
相关推荐
DLSS-NR on AMD 为什么不是兼容层?HIP 内核与内存布局的从零重写路线揭秘
DLSS NR on AMD 为什么不是兼容层?HIP 内核与内存布局的从零重写路线揭秘 DLSS NR on AMD 是一个开源项目,让 DLSS 5 Neu
为什么 DLSS-NR on AMD 的帧生成需要伪装?A 卡 DLSS Frame Generation 完整解析
为什么 DLSS NR on AMD 的帧生成需要伪装?A 卡 DLSS Frame Generation 完整解析 DLSS NR on AMD(管理工具名为
DLSS5-Feeder 神经渲染 3 选 1:Deep Fried Chicken、RenoDX、OptiScaler DLSS-NR 终极横评
DLSS5 Feeder 神经渲染 3 选 1:Deep Fried Chicken、RenoDX、OptiScaler DLSS NR 终极横评 DLSS5
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考