OpenDLSS: Nvidia의 DLSS 5 Neural Rendering 네트워크 Vulkan 재구현
요약
NVIDIA의 DLSS 5 Neural Rendering 네트워크를 Vulkan으로 재구현하는 방법을 안내합니다. 이 구현체는 원본과 비트 단위로 정확하게 일치하며, 브라우저 환경(WebGPU)에서도 동일한 바이트를 사용하도록 독립적으로 개발되었습니다. 이는 생성형 신경 렌더링을 통해 디테일을 생성하고 스타일을 조정하는 기술입니다.
핵심 포인트
- DLSS 5 Neural Rendering 네트워크를 Vulkan으로 재구현함.
- 원본과 비트 단위로 정확하게 일치하며, WebGPU 포트로도 구현됨.
- 생성형 신경 렌더링은 디테일 생성 및 스타일 조정을 수행함.
- 제공된 스크립트를 통해 빌드 및 실행 과정을 확인할 수 있음.
OpenDLSS-NR
NVIDIA의 DLSS 5 Neural Rendering 네트워크를 Vulkan으로 재구현했으며, 원본과 비트 단위로 정확하게 일치합니다.
DLSS-NR build 310.8.0에서 사용된 것과 동일한 71개 블록의 Swin / ViT 네트워크가 있으며, 텐서 코어(tensor cores)에서 FP8을 실행합니다. 중간 결과물 역시 최종 이미지뿐만 아니라 모든 75개 블록 경계에서 바이트 단위로 일치합니다.
ports/browser-webgpu/는 두 번째 독립적인 구현체입니다. 여기서는 브라우저 환경에서, 텐서 코어와 FP8 없이 동일한 바이트를 사용합니다.
사용자가 가중치를 제공해야 합니다. 아래 설명된 레이아웃의 모델 디렉터리 형태로 제공해 주십시오.
네트워크
전역 ViT(ViT)가 하단에 있는 Shifted-window transformer 블록들의 U-net 구조입니다. 6개의 풀링 레벨에 걸쳐 71개 블록이 사용되며, FP8 (E4M3) 활성화와 FP16 누적을 사용하고 가중치는 141 MiB입니다. 이는 생성형 신경 렌더링 네트워크(generative neural rendering network)이며(NVIDIA의 용어), 이미 엔진이 그린 프레임을 다시 렌더링하여, 주입된 노이즈로부터 디테일을 생성하고 스타일 설정에 따라 톤, 구조 및 피부를 조정합니다. 입력과 출력은 동일한 해상도이며, 업스케일러가 아닙니다.

2048x1152에서 작동하는 WebGPU 포트 예시입니다. 왼쪽은 NR을 끄고, 오른쪽은 NR을 켰습니다. 장면: Cowboy Gramps (Muhammed Ismayil, CC0).
이 네트워크는 하나의 렌더링된 프레임(낮은 동적 범위의 대리 값, 가우시안 노이즈 세 개의 레인, 이전 프레임 출력을 재투영한 것, 그리고 다섯 가지 컨디셔닝 스칼라)을 입력받아 픽셀당 네 개의 f32 채널을 생성합니다: RGB 잔여값(residual)과 하나의 시간적 블렌드 로짓(temporal-blend logit). docs/network.md에 전체 그래프가 있습니다. NVIDIA는 보고서에서 이 모델을 설명했습니다.
DLSS 5: Generative Neural Rendering (프로젝트 페이지).
빌드 및 실행
powershell -File scripts\fetch_tools.ps1 [-Npm] # 한 번 실행: tools\ (glslang, Vulkan-Headers, volk, CMake, Ninja)
powershell -File scripts\build.ps1 # 셰이더, PTX, build\dlss5vk.exe
powershell -File scripts\fetch_filament.ps1 # 한 번 실행, 데모용: third_party\filament (+ 패치)
...
build\dlss5vk.exe bench --model <dir> --width 768 --height 768
build\dlss5vk.exe profile --model <dir> --width 768 --height 768 # 디스패치별 타이밍
build\dlss5vk.exe parity --model <dir> --fixture <dir> # 피처와 비교한 비트 정확도
...
데모는 더블 클릭할 수 있습니다. build\scenes 아래의 모든 장면이 Demo scene 드롭다운 목록에 나열되며, 첫 번째 장면으로 시작하거나 명령줄에서 제공된 glTF를 로드합니다. 모델 디렉토리는 --model <dir>이며, 그렇지 않으면 이 README 옆에 있는 DLSS5VK_MODEL 또는 models\nr을 사용합니다. 렌더러, 키, 장면 및 view.json에 대해서는 demo/README.md를 참조하십시오.
성능 (Performance)
RTX 4070 SUPER, 프레임당 전체 네트워크 실행, 최소 40프레임 이상 기준. 모든 해상도에서 241개의 디스패치(dispatch)가 발생합니다.
| 해상도 | 시간 |
|---|---|
| 768x768 | 2.8 ms |
| ... |
GPU는 지속적인 부하 하에서 두 개의 클럭 상태를 번갈아 사용하므로 평균값(medians)은 몇 퍼센트 더 높게 나옵니다. 최소값(minima)을 비교하십시오.
포함된 내용 (What is here)
| 부분 | 파일 | 참고 사항 |
|---|---|---|
| Host | src/ (C++20) | Vulkan 컨텍스트, 모델 로딩 및 가중치 재배열(weight re-layout), 커널 래퍼, 네트워크 그래프, 산술에 대한 CPU 참조 구현, dlss5vk 도구 |
| ... |
미구현된 내용: DLSS-SR로, 이는 다른 네트워크입니다. 시간적 경로(temporal path)는 구현되었지만, 데모에서는 다음과 같습니다: 네트워크의 히스토리 입력 레인과 픽셀별 블렌드 로짓이 재투영 피드백 루프(docs/frame.md)를 구동합니다. dlss5vk 도구는 히스토리가 없는 단일 프레임을 실행하며, 이는 참조 캡처가 이루어진 방식입니다.
요구 사항 (Requirements)
- Windows 운영체제와 NVIDIA Ada (또는 그 이상) GPU 및
VK_KHR_cooperative_matrix,VK_NV_cooperative_matrix2,VK_EXT_shader_float8,VK_NV_cuda_kernel_launch를 노출하는 드라이버가 필요합니다. - Visual Studio 2022 이상 버전과 C++ x64 도구 세트(모든 에디션 또는 Build Tools; vswhere로 찾거나
VCVARS64를vcvars64.bat으로 설정), git, PTX 생성기를 위한 Python 3, 그리고 씬 컨버터를 위한 Node.js + npm 및 Pillow가 필요합니다. tools/아래의 포터블 툴체인(git 무시):scriptsetch_tools.ps1은 glslang 16.6.0, Vulkan-Headers v1.4.363, volk (고정 태그), CMake 3.31, 그리고 Ninja 1.13을 다운로드합니다. 별도의 Vulkan SDK 설치는 필요하지 않습니다.-Npm은 또한 씬 컨버터의 모듈을tools ltf에 설치합니다.- 데모를 위해: Filament v1.77.0이 필요한데, 이는
scriptsetch_filament.ps1에 의해 클론되고 패치되었으며,scriptsuild_filament.ps1에 의해 한 번 빌드됩니다(둘 다 git 무시; 약 15분 소요 및 6 GB의 빌드 트리가%LOCALAPPDATA% ltf-vulkan또는DLSS5_FILAMENT_BUILD_DIR에 배치됨; MSVC가 Filament에서 작업당 최대 1GB를 사용하므로,DLSS5_BUILD_JOBS는 병렬 컴파일을 제한하며 기본값은 8입니다).
모델 디렉토리
nr::Model은 manifest.json을 읽습니다: stages 배열(각 항목: id, 디렉토리에 대한 상대 경로의 file, packedByteLength, sha256)과 tensors 배열(각 항목: name, block, layer, parameter, stage, stageOffset, byteLength). 스테이지 파일은 E4M3 가중치를 패킹된 바이트로 담고 있으며, 호스트는 이를 커널이 소비하는 행렬 형태로 다시 배치합니다(src/nr_model.cpp). 이 저장소의 어떤 것도 그러한 디렉토리를 생성하지 않습니다.
그래프는 310.8.0의 71개 블록 네트워크이며 그 외에는 아무것도 없습니다: 다른 블록 수를 가진 모델은 로드 시 거부됩니다.
픽스처(Fixtures)
parity는 이 저장소에 포함되지 않은 원본 기록 캡처와 비교합니다. 픽스처는 manifest.json을 가진 디렉토리입니다:
| key | |
|---|---|
sourceDimensions, fullDimensions | 유효 크기 및 패딩된 필드 |
| ... | |
모든 것은 GPU가 실행되기 전에 검증되며, 그중 어느 하나라도 실패하는 경우 해당 픽스처는 거부됩니다. 참조 없이 선언된 체크, 누락되거나 짧거나 그래프에서 아무것도 명시하지 않은 참조, 선언된 체크가 사용하지 않는 참조, 또는 참조나 이유가 없는 비교 가능한 경계(블록 0-69, 다섯 개의 인코더 트랜지션) 등이 있습니다. 판결은 비트 단위로 정확하거나 (통과), 제로의 부호까지는 같음 (실패), 하나의 코드 이내 (8비트 캡처만 보고됨) 또는 불일치입니다. docs/numerics.md를 참조하십시오. 헤드와 출력은 프로덕션 스케줄에서 비교되며, --repeat 횟수(기본값 3)만큼 재제출되어야 하며, 이는 배리어 하에서도 동일한 그래프와 일치해야 합니다. 경계는 계측된 실행에서 오며, 그 헤드는 프로덕션의 헤드와 일치해야 합니다. verify는 추가적으로 inputFeatures와 block-0 참조가 필요합니다. |
튜닝 스위치
모두 기본값으로 빠르고 정확한 경로를 따릅니다. 모든 스위치는 출력 바이트를 동일하게 유지하며, 그 중 각각의 parity는 게이트의 일부입니다. 커널을 GLSL로 다시 보내는 어떤 스위치도 카운터 체이닝(counter chaining)을 비활성화시키는데, 이는 PTX 커널만이 이 과정에 참여하기 때문입니다.
DLSS5VK_UNFUSED=1은 GLSL 참조 경로를 실행하며, 최대 2560x1440 해상도까지 지원하여 모든 중간 결과를 생성합니다.DLSS5VK_PTX_DIR는 PTX 디렉터리로 기본값은build/ptx입니다.DLSS5VK_CHAIN=0은 카운터 체이닝 대신 각 실행 사이에 배리어(barrier)를 삽입합니다.DLSS5VK_PTX_GEMM,GEMMT,GEMMV,BLOCK32,FFN,QKV, 그리고ATTN을 0으로 설정하면 하나의 커널 패밀리(kernel family)가 GLSL 표기법으로 돌아갑니다.DLSS5VK_ATTN_STREAM은 스트림형 전역 어텐션(global attention)을 강제로 비활성화(0)하거나 활성화(1)합니다.DLSS5VK_SPLITK=0,DLSS5VK_VIT_CHAIN=0, 그리고DLSS5VK_NO_PTX_MLP=1은 split-K, ViT 체인, PTX MLP를 비활성화합니다.DLSS5VK_NO_FUSE_PRE,POOL,UPRES,POST를 1로 설정하면 각각 하나의 융합(fusion)을 제거합니다.DLSS5VK_CHAIN_MASK는 비트 마스크이며, 1은 전문가 스테이지(expert stages), 2는 c32 블록, 4는 split GEMMs를 나타냅니다. 기본값은 3입니다.DLSS5VK_DEFER_MAX는 프로젝션 GEMM이 융합되는 가장 넓은 단계(stage)이며, 기본값은 128입니다.DLSS5VK_VALIDATION=1은 Khronos 검증 계층(validation layer) 하에서 실행됩니다 (설치되지 않은 경우 거부됨: Vulkan SDK 또는 Vulkan-ValidationLayers 빌드의VK_LAYER_PATH). 여기서 보고된 오류는 실행 실패를 의미합니다.DLSS5VK_DEBUG=1은 드라이버 자체의 메시지(PTX 컴파일러의 메시지 포함)만 출력합니다.DLSS5VK_LIST_EXTENSIONS=1은 확장 목록을 나열합니다.
Documentation
docs/README.md가 인덱스이며, network.md는 그래프, numerics.md는 정확성 계약(exactness contract), weights.md는 레이아웃(layouts), execution.md는 스케줄링(scheduling), 그리고 frame.md는 데모의 프레임에 관한 내용입니다.
Not affiliated with NVIDIA
본 프로젝트는 NVIDIA와 제휴하거나, 승인받거나, 지원받지 않습니다. 이 프로젝트에는 NVIDIA 소프트웨어, 가중치(weights), 헤더 또는 이를 얻기 위한 지침이 포함되어 있지 않습니다. 본 저장소나 그 라이선스에 의해 어떠한 NVIDIA 지적 재산권도 부여되거나 암시되지 않으며, 사용자가 이를 사용하는 모든 모델 데이터에 적용되는 라이선스에 대한 책임은 사용자에게 있습니다.
License
본 저장소의 모든 것은 MIT 라이선스에 따릅니다 (LICENSE). 타사 구성 요소는 NOTICE에 명시되어 있습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 개발 자료 HN · 24a98210의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기