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-윈도우 + ViT |
| 정밀도 | FP8(E4M3) 활성화, FP16 누산 |
| 가중치 크기 | 141 MiB |
| 입력 | 저다이나믹 레인지 프로시 프레임, 세 개의 가우시안 노이즈 채널, 재프로젝션된 이전 출력, 다섯 개의 조건 스칼라 |
| 출력 | 픽셀당 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 기준)
전체 네트워크는 프레임당 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파일은 네 가지 판정 범주를 정의합니다: 비트 정확성 (통과), 영의 부호 (허용됨), 한 코드 내부 (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에서 충실하게 재현할 수 있음을 입증하며, 독립 연구, 크로스 플랫폼 실험(웹GPU 포함), 그리고 투명한 성능 벤치마킹을 가능하게 합니다. 프로젝트의 엄격한 정확성 검증은 신경 렌더링 분야에서 재현 가능성의 새로운 기준을 설정합니다.
시작하기 체크리스트
- 하드웨어 – 필요한 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 라이선스로 배포되며, 제3자 컴포넌트는 NOTICE에 나열되어 있습니다.
Sources
관련
- 프로젝트
- 프로젝트
- 프로젝트
- 프로젝트
- 프로젝트