Nanite와 Lumen이 GPU와 VRAM을 한계치까지 사용하고 있습니다. 어떻게 해야 하나요?

Nanite와 Lumen은 서로 다른 방식으로 VRAM을 사용하므로, 어떤 기능이 그래픽 카드의 메모리를 과도하게 점유하고 있는지 파악해야 적절한 해결책을 찾을 수 있습니다. Nanite는 고해상도 지오메트리를 스트리밍하여 VRAM에 캐시하므로, 스캔 데이터나 영화급 품질의 에셋으로 구성된 씬(scene)은 객체 수가 적더라도 VRAM에 상당한 부하를 줍니다. Lumen의 경우, 광선 추적(ray tracing)에 사용되는 가속 구조(acceleration structures)와 라이팅 캐시가 주요 리소스 소모 요인입니다. 특히 ‘고해상도 타일링(High Resolution Tiling)’을 활성화하면 각 타일마다 이러한 구조로 인한 오버헤드가 발생한다고 Epic은 설명합니다.

UE5에서 비디오 메모리 부족 오류가 발생할 때 가장 흔히 권장되는 해결책은 Nanite와 Lumen을 끄는 것입니다. 이 두 시스템은 각기 다른 메커니즘으로 메모리를 사용합니다. 따라서 현재 씬에서 어떤 메커니즘이 메모리 부하를 유발하는지 파악한다면, 이미지 품질을 유지하면서도 메모리 사용량을 줄일 수 있는 방법을 거의 항상 찾을 수 있습니다.

서로 다른 두 가지 식욕

이미지 출처: Unreal Engine Forums

나나이트(Nanite)는 가상화된 지오메트리를 사용합니다. 메시 데이터는 카메라가 필요로 할 때 디스크에서 스트리밍되어 VRAM의 스트리밍 풀에 저장됩니다. 풀 크기가 클수록 메모리 사용량도 늘어나고, 뷰에 비해 풀 크기가 너무 작으면 캐시 스래싱이 발생하여 정적인 장면에서도 스트리밍이 안정화되지 않습니다. 이러한 메모리 사용량은 디테일 밀도와 화면에 표시되는 고해상도 에셋의 수에 따라 증가합니다.

루멘(Lumen)은 다른 방식으로 메모리를 사용합니다. 장면을 따라 광선을 추적하기 위한 가속 구조와 프레임 간에 재사용되는 표면 조명 캐시가 필요합니다. 이 메모리는 단 한 번의 반사 계산이 이루어지기 전에 할당됩니다. 고해상도 타일링(High Resolution Tiling)의 각 타일은 광선 추적 및 루멘 가속 구조에 대한 자체 오버헤드를 가지고 있습니다.

두 가지 주요 메모리 사용량 요소가 대부분의 VRAM 할당에서 제외됩니다. 가상 그림자 맵은 자체 페이지 풀을 할당하고, 텍스처 스트리밍 풀은 장면에서 현재 필요한 모든 밉맵을 저장합니다.

GBuffer는 메모리 사용량이 상당히 많으며, 8K~16K 범위의 매우 큰 렌더링은 메모리 측면에서 비효율적일 수 있다는 경고를 표시합니다. 따라서 가벼워 보이는 장면에서도 메모리 부족 현상이 발생할 수 있습니다.

화면상으로는 비슷해 보이는 두 장면이 메모리 프로필은 완전히 다를 수 있는 이유도 바로 이것입니다.

각 증상이 말해주는 것

증상가장 유력한 원인가장 먼저 조정할 사항
텍스처가 뭉개지다가 나중에 튕김텍스처 스트리밍 풀풀 용량을 늘리거나 텍스처 해상도를 낮춤
출력 해상도를 높이면 VRAM이 부족해짐GBuffer해상도를 낮추거나 타일링을 활성화, 8K 크래시 가이드 참조
Lumen을 켜면 메모리가 부족하고 끄면 정상 동작함Lumen 가속 구조 및 조명 캐시초안 패스의 Lumen 품질을 낮춤
스캔된 에셋이 많은 씬에서 메모리가 부족해짐Nanite 스트리밍에셋 밀도를 줄이고 배경에 프록시를 사용함
여러 프레임에 걸쳐 사용량이 지속적으로 증가함장시간 작업 시 메모리 누적시퀀스를 더 짧은 작업으로 분할함

무언가를 변경하기 전에 먼저 측정하십시오

다음 4가지 방법을 따라 확인해 볼 수 있습니다.

  1. 최종 출력 해상도에서 GPU 메모리 사용량을 확인하십시오. 실제 배포할 해상도로 씬(scene)을 렌더링하는 동안 에디터 내에서 GPU 메모리 통계(stat RHI 명령어로 개요 확인 가능)를 실행해 봅니다. 뷰포트에 표시되는 수치는 오해의 소지가 있을 수 있는데, 이는 GBuffer 및 대부분의 화면 크기 버퍼가 픽셀 수에 따라 스케일링되기 때문입니다.
  2. 가장 부하가 큰 프레임에서의 최대치를 기록하십시오. 지오메트리, 조명, 효과가 가장 많이 포함된 프레임으로 이동하여 해당 시점의 VRAM 수치를 확인합니다. 시퀀스의 첫 번째 프레임이 부하가 가장 심한 경우는 드뭅니다.
  3. 테스트를 위해 Lumen을 잠시 끄고 다시 측정해 보십시오. 두 측정값의 차이가 해당 씬에서 Lumen이 차지하는 비용(부하)입니다. 측정 후에는 다시 Lumen을 켜십시오. 이는 진단을 위한 단계일 뿐, 최종 설정을 결정하는 과정은 아닙니다.
  4. 텍스처 스트리밍 풀(texture streaming pool)을 확인하십시오. stat streaming 명령어를 사용하면 씬에서 요구하는 양과 풀(pool) 예산(budget)을 비교해 볼 수 있습니다. 예산 초과 경고가 뜬다면 엔진이 용량을 맞추기 위해 이미 밉맵(mip)을 생략(dropping)하고 있다는 뜻입니다. 지오메트리의 경우, Nanite 스트리밍 통계를 통해 해당 풀이 포화 상태인지 확인할 수 있습니다.

스타일은 유지하면서 줄이는 방법

  • 드래프트 패스에서만 루멘 품질을 낮추세요. 블로킹 및 검토를 위해 루멘 설정을 낮춘 드래프트 구성을 유지하고, 최종 구성은 최고 품질로 유지하세요. 대부분의 샷에서 드래프트 렌더링 횟수가 최종 렌더링 횟수보다 많으므로, 여기서 메모리 절감 효과를 볼 수 있습니다.
  • 배경에 더 가벼운 에셋을 사용하세요. 멀리 있는 히어로 스캔을 프록시 또는 저밀도 버전으로 교체하면 스트리밍 풀에 전경을 위한 공간이 확보됩니다.
  • 거리에 따라 텍스처 해상도를 낮추세요. 멀리 있는 에셋의 최대 텍스처 크기를 줄이고 가까이 있는 재질은 그대로 두세요. 장면 전체의 해상도를 낮추면 실제로 시청자가 인식하는 표면의 품질이 저하됩니다.
  • VRAM 여유가 있다면 텍스처 스트리밍 풀 크기를 늘리세요. 1단계에서 여유 공간이 있고 4단계에서 풀 크기가 초과된 경우, r.Streaming.PoolSize를 늘리는 것이 가장 저렴한 변경 방법입니다. Epic은 스트리머가 메모리 부족으로 어려움을 겪지 않도록 충분히 큰 풀 크기와 메모리 낭비를 방지할 수 있도록 충분히 작은 풀 크기를 권장합니다. 이미 카드가 가득 찬 경우, 풀 크기를 늘려도 부족 현상이 다른 곳으로 옮겨갈 뿐입니다.
  • 긴 시퀀스를 더 짧은 작업으로 분할하세요. 사용량이 수백 프레임에 걸쳐 점진적으로 증가할 경우, 범위 사이에서 프로세스를 재시작하면 누적된 사용량이 초기화됩니다.

씬을 최적화했는데도 여전히 성능 한계에 도달하는 경우

최적화 작업을 마쳤음에도 여전히 가장 무거운 프레임이 정상적으로 처리되지 않는다면, 남은 해결책은 더 많은 VRAM을 갖춘 그래픽카드를 사용하는 것입니다. 구매하기에 앞서, 추가된 메모리 용량이 해당 장면의 문제를 해결해 줄 수 있을지 확인해 보는 것이 좋습니다.

iRender는 24GB VRAM의 RTX 4090 시스템과 32GB VRAM의 RTX 5090 단일 카드 패키지를 분 단위 과금 방식으로 대여하고 있습니다. 이를 활용하면 기존 사양에서 실패했던 바로 그 장면을 실행해 보고, 8GB의 메모리 추가만으로도 문제를 해결할 수 있는지 직접 확인해 볼 수 있습니다.

최고의 속도, 완벽한 자유. iRender의 전용 GPU 서버로 VFX 워크플로를 완벽하게 제어하세요. iRender로 렌더링을 시작하세요 →

FAQ

  1. Nanite와 Lumen은 얼마나 많은 VRAM을 사용하나요?
    정해진 수치는 없습니다. 두 기술 모두 씬(scene)의 복잡도와 출력 해상도에 따라 사용량이 달라지기 때문입니다. Nanite의 사용량은 화면에 보이는 고해상도 지오메트리의 양과 스트리밍 풀(streaming pool)의 크기에 따라 결정됩니다. Lumen은 가속 구조(acceleration structures)와 라이팅 캐시를 사용하며, 고해상도 타일링(High Resolution Tiling) 적용 시 타일별로 사용량이 증가합니다. GBuffer 또한 픽셀 수에 비례하여 메모리 사용량을 늘리는데, Epic은 8K~16K 렌더링의 경우 메모리 문제로 인해 실용적이지 않을 수 있다고 경고하기도 합니다. 정확한 수치를 확인하는 가장 확실한 방법은 최종 출력 해상도에서 가장 부하가 큰 프레임의 최대 GPU 메모리 사용량을 측정하는 것입니다.
  2. Lumen과 Nanite 중 어느 것이 VRAM을 더 많이 사용하나요?
    상황에 따라 어느 쪽이든 더 많은 메모리를 사용할 수 있으며, 이는 각 기술의 작동 방식에 달려 있습니다. Nanite는 스트리밍된 지오메트리 데이터를 보관하므로, 스캔 데이터나 영화급 품질의 메시(mesh)가 밀집된 씬에서 메모리 점유율이 높습니다. 반면 Lumen은 가속 구조와 캐시된 라이팅 데이터를 보관하므로, 조명이 적용된 대규모 환경이나 타일링을 사용하는 고해상도 환경에서 점유율이 높습니다. 본인의 씬에 어떤 기술이 더 큰 영향을 미치는지 확인하려면 GPU 메모리를 측정한 뒤, 테스트 삼아 Lumen을 비활성화하고 다시 측정해 보십시오. 그 차이만큼이 Lumen이 사용하는 메모리 양입니다. 나머지 메모리는 Nanite, 텍스처, 그림자, GBuffer가 나누어 사용합니다.
  3. Unreal이 충돌하기 전에 텍스처가 흐릿하게 보이는 이유는 무엇인가요?
    텍스처 스트리밍 풀이 가득 찼기 때문입니다. Unreal은 스트리밍되는 텍스처를 고정된 메모리 예산 내에서 관리하는데, 씬에서 요구하는 데이터가 예산을 초과하면 엔진은 모든 데이터를 수용하기 위해 더 낮은 해상도의 밉(mip) 단계로 전환합니다. 그 결과 표면이 흐릿하게(soft) 보이게 됩니다. 메모리 부족 상태가 지속되면 결국 프로그램이 충돌하게 됩니다. 많은 사용자가 멀쩡한 텍스처를 직접 수정하려 하곤 합니다. 대신 스트리밍 통계를 확인한 후, 그래픽 카드에 여유 VRAM이 있다면 풀(pool) 크기를 늘리거나 멀리 있는 에셋의 텍스처 해상도를 낮추는 것이 좋습니다.

더 보기: Houdini에서 Redshift Out-of-Core를 사용하는 이유와 VDB가 이를 무시하는 이유

No Comments

Leave A Comment