OpenDLSS-NR: NVIDIA DLSS 5 ニューラルレンダリングの Vulkan 実装(ビット正確)
TL;DR
OpenDLSS‑NR は Vulkan 上で NVIDIA の DLSS 5 ニューラルレンダリングネットワークを ビット正確 に再実装し、オリジナルの 71 ブロック Swin/ViT モデルのすべての中間テンソルと一致させ、RTX 4070 SUPER で 1080p フレームあたり 10ms 未満の速度で動作します。
このプロジェクトが提供するもの
- 正確なネットワーク再現 – DLSS‑NR ビルド 310.8.0 と同一の 71 ブロック(6 つのプーリングレベル)で、FP8(E4M3)活性化と FP16 累積を使用。すべての 75 ブロック境界がオリジナルとバイト単位で一致。
- Vulkan ネイティブ実装 – C++20 ホスト、GLSL リファレンスカーネル、NVIDIA のコープレーティブマトリクス FP8 GEMM、cp.async リング、バリアフリーのカウンターチェイニングを活用した手書き PTX カーネル。
- WebGPU フォールバック – 同じネットワークをブラウザ上で実行する第二のポート。テンソルコアや FP8 が利用できない環境でも機能的に同等(ビット正確性は仕様による定義、ハードウェアに依存しない)。
- デモアプリケーション – パッチ済み Filament レンダラーにネットワークを統合し、ImGui コントロールと glTF シーンのライブラリを提供。
- オープンソースツール – Vulkan ヘッダ、glslang、PTX ジェネレータ、Filament の取得スクリプト。完全な Vulkan SDK は不要。
ネットワークアーキテクチャの概要
モデルは U‑Net であり、シフトされたウィンドウ変換器ブロックとグローバル ViT で構成される。主な仕様:
| 属性 | 値 |
|---|---|
| ブロック数 | 71(75 ブロック境界) |
| 変換器タイプ | Swin‑window + ViT |
| 精度 | FP8(E4M3)活性化、FP16 累積 |
| 重みサイズ | 141 MiB |
| 入力 | 低ダイナミックレンジのプロキシフレーム、3 つのガウスノイズチャンネル、再投影された前フレーム出力、5 つの条件付きスカラ |
| 出力 | ピクセルあたり 4 つの 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)
全ネットワークは 1 フレームあたり 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 実装からキャプチャされた参照出力に対してネットワークを実行。75 ブロック境界のすべてのテンソルを検証。 - 数値契約 –
docs/numerics.mdファイルは 4 つの検証カテゴリを定義:ビット正確(合格)、ゼロの符号(許容)、1 コード以内(8 ビットキャプチャ許容)、不一致。 - カーネル単位の検証 –
verifyはブロック 0 の参照出力と入力特徴をフィクスチャに含む必要があり、任意の不一致を細かくバイセクト可能。 - 切り替え可能なルート – 環境変数(例:
DLSS5VK_UNFUSED=1)により、PTX カーネルを GLSL リファレンスに置き換えながら出力の同一性を維持可能。デバッグや FP8 対応なしのハードウェア向けに有用。
Hacker News からのコミュニティの洞察
"オリジナルとビット正確に一致するとは、いったいどんな魔法なの?非常に印象的な仕事だ!" – TheJCDenton
"1080p でほぼ 8ms は非常に高コストに思えるが、オリジナルも同程度のレンダリング予算を消費しているのだろうか?" – flohofwoe
"Zバッファを入力にしないのは驚いた。ニューラルレンダラーには有用そうに思えるのに。" – Lerc
"重みがなければどれだけ有用なのか?NVIDIA はゲームごとにモデルを提供しているが、汎用モデルは可能なのだろうか?" – franticgecko3
これらのコメントは、バイトレベルのパリティという技術的達成と、パフォーマンスへの影響、事前学習済み重みの入手可能性という実用的な疑問の二つのテーマを浮き彫りにしている。
制限事項と欠落している機能
- DLSS‑SR 対応なし – リポジトリはニューラルレンダリング(NR)パスのみ実装。スーパーレゾリューションバージョンは未対応。
- 重みは外部提供 – ユーザーは独自に E4M3 重みファイルを取得または生成する必要がある。リポジトリにはプロプライエタリな NVIDIA 重みは含まれない。
- 時間的履歴はデモのみ –
dlss5vkツールは履歴なしで単一フレームを処理するが、デモでは時間的安定性のため再投影された前出力を使用。 - ハードウェア要件 – Ada世代 NVIDIA GPU が必要。Vulkan 拡張
VK_KHR_cooperative_matrix、VK_NV_cooperative_matrix2、VK_EXT_shader_float8、VK_NV_cuda_kernel_launchをサポート。
なぜこれが重要なのか
OpenDLSS‑NR は、複雑でプロプライエタリな AI 加速グラフィックスパイプラインがオープンソースの Vulkan で忠実に再現可能であることを証明し、独立した研究、クロスプラットフォームの実験(WebGPU を含む)、透明なパフォーマンスベンチマークを可能にする。このプロジェクトの厳格なパリティテストは、ニューラルレンダリングにおける再現可能性の新しい基準を設定している。
スタートガイド
- ハードウェア – 必要な Vulkan 拡張を備えた NVIDIA Ada ジェネレーション GPU(RTX 40 シリーズ以降)。
- ツールチェーン – 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
関連
- プロジェクト
- プロジェクト
- プロジェクト
- プロジェクト
- プロジェクト