Virtio-nvgpu - KVM 게스트에서 네이티브에 가까운 NVIDIA GPU 접근

1 week ago 16

virtio-nvgpu는 그래픽 API 대신 NVIDIA 커널 드라이버의 ABI 수준에서 ioctl을 전달하며, 게스트가 수정하지 않은 NVIDIA 사용자 모드 드라이버로 호스트 GPU를 사용하게 함 목표는 헤드리스 스트리밍으로, 게스트 안에서 GPU 렌더링, 합성, 인코딩을 수행하고 압축 영상만 내보냄 RTX 3060의 동일한 합성 부하에서 프레임 시간이 약 2ms 이상이면 베어메탈 대비 차이가 2% 이내였고 CPU 사용량도 비슷했으나, 매우 짧은 프레임에서는 GPU 대기 후 깨우기 비용이 두드러짐 GPU 한 장에서 게스트 4개의 동시 렌더링과 H.264 인코딩을 확인했으며, 렌더링 총처리량은 단일 게스트와 비슷하고 부하는 고르게 나뉨 IOMMU 기반 하드웨어 격리는 제공하지 않음. 호스트 NVIDIA 드라이버를 신뢰해야 하며, 상호 신뢰하지 않는 테넌트에는 IOMMU를 사용하는 VFIO 패스스루나 vGPU가 필요함 목표와 기존 방식의 제약 헤드리스 스트리밍에서는 호스트가 GPU를 계속 보유하고, 모니터 없는 게스트에서 게임/애플리케이션, Wayland 컴포지터, 하드웨어 인코더를 실행함 목표 파이프라인은 Vulkan/OpenGL 렌더링, 창 합성, CUDA 제로카피 가져오기, NVENC의 H.264/H.265 인코딩으로 이어짐 외부로 나가는 것은 프레임당 약 100KB의 압축 비트스트림이며, 이를 위해 버퍼 핸들, 펜스, CUDA 장치 포인터, NVENC 세션에 대한 실제 드라이버 수준 접근이 필요함 virtio-gpu + Venus의 API 수준 직렬화와 호스트 재실행은 이 용도에서 지연, CPU 비용, 게스트 인코딩 제약을 만듦 게임은 프레임당 1,000~5,000회의 드로 호출 외에도 바인딩, 디스크립터 갱신, 렌더 패스 전환을 수행함 60fps의 16.6ms 프레임 예산에서 직렬화에 1~3ms가 들면 GPU 작업 전에 6~18%를 소모함 직렬화, 전송, 재실행은 애플리케이션에 필요한 호스트 CPU를 사용함 호스트 소유 버퍼를 게스트 컴포지터가 보거나 가져올 수 없어, 게스트의 CUdeviceptr로 연결하기 어렵고 NVENC 사용에는 전체 CPU 읽기 및 복사가 필요함 DRM native context는 Intel/AMD에서 실제 Mesa 드라이버로 게스트 내부 명령 버퍼를 만들고 제출만 경계를 넘게 하며, 게스트 버퍼 소유권과 인코딩을 지원하지만 NVIDIA에는 없음 VFIO 패스스루는 네이티브 성...

Read Entire Article