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 잔차 + 시간적 블렌드 로짓

네트워크는 업스케일링하지 않습니다. 동일 해상도 프레임을 다시 렌더링하며, 디테일을 추가하고 톤을 조정합니다.


빌드, 실행 및 검증 워크플로우

  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 구현에서 캡처한 참조 출력과 함께 네트워크를 실행합니다. 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 포함), 그리고 투명한 성능 벤치마킹을 가능하게 합니다. 프로젝트의 엄격한 정확성 검증은 신경 렌더링 분야에서 재현 가능성의 새로운 기준을 설정합니다.


시작하기 체크리스트

  1. 하드웨어 – 필요한 Vulkan 확장을 지원하는 NVIDIA Ada 세대 GPU(RTX 40세대 이상).
  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 라이선스로 배포되며, 제3자 컴포넌트는 NOTICE에 나열되어 있습니다.

Sources

관련

  • 프로젝트
  • 프로젝트
  • 프로젝트
  • 프로젝트
  • 프로젝트