OpenDLSS-NR:NVIDIA DLSS 5 神經渲染的 Vulkan 重實現(位元精確)

TL;DR

OpenDLSS‑NR 在 Vulkan 上重現 NVIDIA 的 DLSS 5 神經渲染網路,並實現 位元精確 的輸出,與原始 71 個 block 的 Swin/ViT 模型每一個中間張量完全一致,且在 RTX 4070 SUPER 上每 1080p 幀的執行時間低於 10 ms。


此專案提供的內容

  • 精確的網路複製 – 71 個 transformer block(六個池化層級),與 DLSS‑NR build 310.8.0 完全相同,使用 FP8(E4M3)激活與 FP16 累加。所有 75 個 block 边界皆與原始版本位元對位完全一致。
  • 原生 Vulkan 實作 – C++20 主機程式、GLSL 參考核心,以及手寫的 PTX 核心,充分利用 NVIDIA 協作矩陣 FP8 GEMM、cp.async ring 與無障礙計數器鏈接。
  • WebGPU 備用方案 – 第二個移植版本可在瀏覽器中執行相同網路,無需張量核心或 FP8,達到功能上的等效性(位元精確性由規格定義,而非硬體)。
  • 示範應用程式 – 將網路整合至修補過的 Filament 渲染器,提供 ImGui 控制介面與 glTF 模型資料庫。
  • 開源工具鏈 – 提供腳本以取得 Vulkan headers、glslang、PTX 產生器與 Filament;無需完整 Vulkan SDK。

網路架構概覽

此模型為一 U‑Net,由位移窗格 transformer block 組成,頂部為全域 ViT。主要規格如下:

屬性 值
Blocks 71(75 個 block 邊界)
Transformer 類型 Swin‑window + ViT
精度 FP8(E4M3)激活,FP16 累加
權重大小 141 MiB
輸入 低動態範圍代理幀、三個高斯雜訊通道、重新投影的前一幀輸出、五個條件標量
輸出 每像素四個 f32 通道:RGB 殘差 + 時間混合 logits

此網路 不會升頻;它會重新渲染相同解析度的幀,加入細節並調整色調。


建置、執行與驗證流程

  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 原始實作所捕獲的參考輸出。驗證每一個 block 邊界上的所有張量。
  • 數值合約 – docs/numerics.md 檔案定義四種驗證結果:位元精確(通過)、零值符號(可接受)、在一個碼字內(8 位元捕獲容差),以及 不匹配。
  • 逐核心驗證 – verify 需要測試範本包含 block‑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

相關

  • 專案
  • 專案
  • 專案
  • 專案
  • 專案