
2026/09/30 17:43
OpenDLSS:Nvidia の DLSS 5 ニューラルレンダリングネットワークの Vulkan リ実装
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
このオープンソースプロジェクトは、NVIDIA の DLSS 5 Neural Rendering (DLSS-NR) ネットワーク(ビルド 310.8.0)のビット単位で正確な Vulkan リインプリメンテーションを提供し、Ada クラスまたはそれ以降の GPU を用いて FP8 テンソルコアを利用して精密な結果を達成します。モデルはグローバル ViT を含む 71 ブロックの Swin/ViT U-net 構造を採用しており、FP8(E4M3)アクティベーションと FP16 アクムレイションを使用し、従来のアップスケールではなく注入されたノイズから詳細を生成します。完全なパフォーマンスを発揮するには
VK_KHR_cooperative_matrix が必須です。RTX 4070 SUPER では低解像度で約 2.8 ms で動作し、4K(3840x2160)では約 29.3 ms にスケールします。テンソルコアアクセラレーションを欠くため、ports/browser-webgpu/ には遅い WebGPU ポートが存在し、512x512 で約 72 ms です。
ツールチェーンは移植可能で、完全な Vulkan SDK を必要としません。glslang、Vulkan-Headers、CMake、Ninja などの依存関係を自動的に取得します。ビルド手順には PowerShell スクリプト(
fetch_tools.ps1, build.ps1, fetch_filament.ps1, build_demo.ps1)を用いてツール、シェーダー、PTX カーネル、および Filament デモ(Vulkan 互換性のためのパッチが適用されたバージョン 1.77.0)を生成します。モデルディレクトリには、ステージとテンソルをブロック/レイヤーマッピングで定義する manifest.json を含める必要があり、このリポジトリはこのデータを自動生成しません。ユーザーは提供されたコマンド(タイミング測定のための bench、外部フィクスチャディレクトリに対するビット単位正確性チェックのための parity、ブロック単位のカーネルバイセクションのための verify)を用いて設定を検証できます。環境スイッチにより、カーネルを GLSL にルートしたり、特定の最適化(例:split-K 融合)を無効にしたりすることも可能です。
重要なのは、この独立した実装が MIT ライセンスの下で開発者がローカルでニューラルレンダリングモデルを検証することを可能にし、GPU パフォーマンス解析における透明性を促進しながら、NVIDIA の知的財産権を厳格に尊重し、NVIDIA IP に関する権利は一切付与されないと明確に表明している点です。
本文
Vulkan 再実装 NVIDIA DLSS 5 ニューラルレンダリングネットワーク紹介
オリジナルの NVIDIA DLSS 5 ニューラルレンダリング(DLSS-NR)とビットごとの一致を確保した、Vulkan による高品質な再実装です。
技術概要
- アーキテクチャ:
- WebGPU バージョン 310.8.0 と同等の71 ブロック構成の Swin/ViT ネットワークを採用
- テンソルコア上で**FP8(E4M3)**演算を実行
- 精度保証:
- 最終画像だけでなく、中間計算結果も完全に一致
- すべての75 のブロック境界でバイト単位の同一性を確認済み
WebGPU ポート版
- 場所:
ports/browser-webgpu/ - 特徴:
- ブラウザ環境向け独立実装
- テンソルコアや FP8 サポートなしでも動作
- 完全なバイト一致を保証
ユーザーによるモデルの準備
ネットワークを実行するには、以下の形式のモデルディレクトリが必要です。
フォーマットのnr::Model
を含むディレクトリmanifest.json- ファイル構造とファイル名はガイドラインに従う(詳細は後述)
ネットワーク構成
NVIDIA のGenerative Neural Rendering (GNR) アーキテクチャを採用しています。
- 構造: U-net 構造
- 下部:グローバル ViT モジュール
- 上部:71 ブロックのシフトウィンドウトランスフォーマー
- 計算精度:
- **FP8(E4M3)**アクティベーション
- FP16アキュムレーション
- 容量: 約141 MiBの重み情報
GNR の機能
- 既に描画されたフレームを再レンダリングしてノイズから詳細を生成
- トーン、構造、肌の質感を調整
- 入力と出力の解像度は同一(アップスケーラーではない)
WebGPU 比較デモ
- 比較画像: 左側(NR オフ)vs 右側(NR オン)
- シーン例: 「Cowboy Gramps」(Muhammed Ismayil / CC0 ライセンス)
- 処理内容:
- レンダリングされたフレームの低ダイナミックレンジプロキシ
- ガウスノイズの3 チェーン(入力機能として)
- 前フレームからの再射影出力
- 5 つのコンディショニングスカラー
- 出力形式: ピクセルあたり4 つの f32 チャンネル
- RGB リジッド残差
- 時間的ブレンディングロジット
詳細は
docs/network.md または NVIDIA の報告書「DLSS 5: Generative Neural Rendering」を参照してください。
ビルドと実行方法
必要なスクリプト(Windows PowerShell)
# ツールチェーンの一次取得(一度だけ) scripts\fetch_tools.ps1 [-Npm] # シェーダー、PTX コード、Vulkan バイナリのビルド scripts\build.ps1 # デモ用 Filament ライブラリの取得(一度だけ) scripts\fetch_filament.ps1 scripts\build_filament.ps1 # デモアプリケーションのビルド scripts\build_demo.ps1
実行コマンド例
- ベンチマークテスト
build\dlss5vk.exe bench --model <モデルディレクトリ> --width 768 --height 768 - パフォーマンスプロファイリング(各ディスパッチの時間測定)
build\dlss5vk.exe profile --model <モデルディレクトリ> --width 768 --height 768 - オリジナルとのビット一致検証
build\dlss5vk.exe parity --model <モデルディレクトリ> --fixture <フックアップディレクトリ> - ブロック単位のバインティング検証(block-0 で Kernel ごとに分割)
build\dlss5vk.exe verify --model <モデルディレクトリ> --fixture <フックアップディレクトリ> - PTX ディビダーのテスト(numpy を使用)
python scripts\ptx\test_fast_divmod.py
デモアプリについて
- ダブルクリックで直接起動可能
に配置されるシーンがデフォルトドロップダウンリストに表示され、最初の一つから開始build/scenes/- コマンドライン引数で glTF ファイルを指定すると、そのシーンをロード
モデルディレクトリの優先順位:
--model <ディレクトリ>
環境変数DLSS5VK_MODEL
(README と隣接)models\nr/
詳細は
demo/README.md を参照してください。
パフォーマンス結果
テスト環境: RTX 4070 SUPER、全体ネットワークをフレーム単位の最小値で計測(40 フレーム以上平均)、241 回のディスパッチを各解像度で実行
| 解像度 | 処理時間 |
|---|---|
| 768×768 | 2.8 ms |
| 1920×1080 | 7.8 ms |
| 2560×1440 | 12.6 ms |
| 3840×2160 | 29.3 ms |
注記: GPU は持続負荷下でクロック周波数の状態を切り替えるため、中央値は最小値よりも数%高い場合があります。比較時は必ず最小値を使用してください。
コンポーネント構成表
| パート | ファイルパス | 備考 |
|---|---|---|
| ホストコード | (C++20) | Vulkan コンテキスト、モデルローディング、重み再配置、カーネルラッパー、ネットワークグラフ、CPU レファレンス算術ロジック、dlss5vk ツール |
| GLSL カーネル | | リファレンスルート:cooperative-matrix FP8 GEMM、32 チャンネルブロック融合、QKV+ ウィンドウアテンション融合、expert MLP、グローバルアテンション、要素ごと演算。独自に完全機能 |
| PTX カーネル | | Python ジェネレーターで高速ルート用 PTX を出力:mma.sync E4M3+f16 アキュムレーション、cp.async リング、バリアレスチェーン(デバイスカウンタ経由)、split-K GEMM、ストリーミンググローバルアテンション。ビルド時に に生成されます |
| デモアプリ | | Filament(Apache-2.0 ライセンス)フレームに内包されたネットワーク:オブジェクトごとの運動ベクトル対応、Vulkan 互換フック、glTF シーン読み込み(gltfio)、ImGui コントロール |
| WebGPU ポート | | ブラウザ環境向け同型実装。テンソルコアなし、FP8 なし、ブロック融合なし、チェーン処理なし。ハードウェアではなく仕様レベルで一致性を保証。512×512 で 72ms(本実装より遅い:2.7ms) |
未実装機能: DLSS-SR は別のネットワークのため含まれていません。ただし、時間経路は実装されており、デモではネットワークのヒストリ入力チャンネルとピクセルごとのブレンディングロジットが再射影フィードバックループを駆動します(
docs/frame.md 参照)。dlss5vk ツールは単一フレームのみを実行し、履歴なしで動作します(これがレファレンスキャプチャの方式と一致しています)。
システム要件
- OS: Windows
- GPU: NVIDIA Ada シリーズ以降(VK_KHR_cooperative_matrix などの拡張をサポート)
- ドライバー:
、VK_EXT_shader_float8
を公開する最新バージョン推奨VK_NV_cuda_kernel_launch
開発環境
- Visual Studio 2022 以降(C++ x64 ツールセット対応;
で探せるか、vswhere
をVCVARS64
に設定)vcvars64.bat - Git
- Python 3(PTX ジェネレーター用)
- Node.js + npm(シーンコンバーター用)
- Pillow(画像処理用)
ポータブルツールチェーン
tools/ ディレクトリに格納され、git で無視されます。
が以下を自動取得:scripts\fetch_tools.ps1- glslang 16.6.0
- Vulkan-Headers v1.4.363
- volk(固定タグ)
- CMake 3.31、Ninja 1.13
オプションを使用すると、シーンコンバーターのモジュールも-Npm
にインストールされます。tools\gltf/
デモ用 Filament
- Filament v1.77.0 を
でクローン・パッチ適用scripts\fetch_filament.ps1
で一度ビルド(約15 分、6 GB のビルドツリー)scripts\build_filament.ps1- 出力先:
または%LOCALAPPDATA%\dlss5-vulkanDLSS5_FILAMENT_BUILD_DIR - 並列コンパイル数は
で制限可能(デフォルト8。MSVC は 1 タスクあたり最大 1 GB を消費するため)DLSS5_BUILD_JOBS
モデルディレクトリ構造
nr::Model フォーマットは manifest.json を読み込みます。
- stages アレイ: 各エントリに
,id
(相対パス)、file
,packedByteLengthsha256 - tensors アレイ: 各エントリに
,name
,block
,layer
,parameter
,stage
,stageOffsetbyteLength
ステージファイルはE4M3 重みをパックしたバイト形式で保持し、ホスト側がカーネルが消費する行列形式へ再配置します(
src/nr_model.cpp 参照)。
このリポジトリ自体ではこのようなディレクトリを生成する機能はありません。
グラフ制限:
- DLSS-NR バージョン 310.8.0 と同等の71 ブロックネットワークのみ対応
- 他のブロック数を有するモデルは読み込み時に拒否されます
Fixture(検証用キャプチャ)
parity コマンドで使用される記録済みキャプチャは、このリポジトリに含まれていません。
Fixture は以下のような manifest.json を持つディレクトリで構成されます。
| キー | 説明 |
|---|---|
/ | 有効サイズとパディングされたフィールド |
または | 入力画像(RGBA f32、コンディショニング・シード・autoMask付き)またはf32機能値本身 |
| ファイトが検証する項目("boundaries", "head", "output"のいずれか;必須且つ空でない) |
, | "boundaries": E4M3 参照情報(ブロック ID、幅、高さ、チャンネル、ファイルパス) |
| 参照のない境界に対する説明({name: reason}形式) |
| "head": f32 RGBA ヘッド値 |
| "output": 合成画像(dtype="f32"=RGBA ハーフ、proxy 必要 または dtype="u8"=8 ビットキャプチャ) |
検証プロセス
GPU 実行前に行われるすべての検証項目が成功しないと実行が拒否されます。以下の条件で失敗判定:
- 宣言されたチェックに対応する参照がない場合
- 参照が存在せず、短縮、またはグラフに記述されていない場合
- チェックで使用されていない参照がある場合
- 比較可能な境界(ブロック 0-69、5 つのエンコーダトランジション)で参照も理由もない場合
判定基準
- ビット完全一致(パス)
- ゼロ符号のみ異なる(失敗)
- コード 1 以内の差(8 ビットキャプチャのみ、別途報告)
- 不一致
比較スケジュール
ヘッダーと出力は生産スケジュールに基づき、
--repeat 回(デフォルト3 回)再提出され、バリア下でも同じグラフで合致する必要があります。境界は計測実行から取得し、そのヘッダーが生産環境との一致を確認します。
チューニングスイッチ
すべてのスイッチはデフォルトで「高速且つ正確なルート」を使用します。各スイッチでは出力バイト列が同一であり、
parity 検証もパスされます。GLSL ルートに切り替えるスイッチは、カウンターチェーンリングを無効化します(PTX カーネルのみが参加するため)。
: GLSL リファレンスルートを実行(最大解像度 2560×1440 まで)、すべての中間値を生成DLSS5VK_UNFUSED=1
: PTX ディレクトリ指定(デフォルトDLSS5VK_PTX_DIR
)build/ptx
: バリア間でディスパッチ分離(カウンターチェーンリング無効化)DLSS5VK_CHAIN=0
,DLSS5VK_PTX_GEMM
,GEMMT
,GEMMV
,BLOCK32
,FFN
,QKV
=0: 該当カーネルファミリを GLSL スクリプトへ戻すATTN
: ストリーミンググローバルアテンションをオン/オフ(1/0)DLSS5VK_ATTN_STREAM
,DLSS5VK_SPLITK=0
,DLSS5VK_VIT_CHAIN=0
: split-K、ViT チェーン、PTX MLP を無効化DLSS5VK_NO_PTX_MLP=1
,DLSS5VK_NO_FUSE_PRE
,POOL
,UPRES
=1: 各融合を省略POST
: ビットマスク(1:expert ステージ, 2:c32 ブロック, 4:split GEMM;デフォルト3)DLSS5VK_CHAIN_MASK
: プロjection GEMM を融合する最大ステージ幅(デフォルト128)DLSS5VK_DEFER_MAX
: Khronos バリデーションレイヤー下で動作(未インストール時は拒否;Vulkan SDK またはDLSS5VK_VALIDATION=1
設定必要)VK_LAYER_PATH
: ドライバー固有メッセージのみ出力(PTX コンパイラー含む)DLSS5VK_DEBUG=1
: 拡張機能をリスト表示DLSS5VK_LIST_EXTENSIONS=1
ドキュメント構成
: インデックスdocs/README.md
: ネットワークグラフnetwork.md
: 正確性契約(数値精度に関する仕様)numerics.md
: 重みのレイアウト形式weights.md
: スケジューリング戦略execution.md
: デモフレームの構造frame.md
免責事項・ライセンス
NVIDIA 非公式声明
- 本プロジェクトはNVIDIA とは一切関係なく、承認も支援も受けていません。
- NVIDIA のソフトウェア、重みデータ、ヘッダー、または取得方法の説明を含むものではありません。
- このリポジトリやライセンスから何らかの NVIDIA 知的財産権を付与されることはありません。使用するモデルデータのライセンスについては各自で責任を負ってください。
ライセンス
- このリポジトリ内のすべてのコードはMIT ライセンス(
ファイル参照)LICENSE - サードパーティコンポーネントの詳細は
ファイルにリストされていますNOTICE