NVENC가 시작되지 않을 때: 모델로 가득 찬 GPU와 폴백을 사용하는 렌더러
영상
저희 영상 렌더러는 스크립트를 작성하는 언어 모델과 같은 머신에서 실행됩니다. 어느 저녁, 하드웨어 인코더가 단순히 열리지 않았습니다. "CUDA_ERROR_OUT_OF_MEMORY: out of memory" 오류가 발생하고, 이어서 "No capable devices found" 메시지가 나타났습니다.
무슨 일이 있었나요
해당 머신은 CPU와 GPU가 하나의 메모리 풀을 공유하는 NVIDIA GB10 데스크톱입니다. vLLM을 통해 로컬 모델을 서비스하며, Studio는 같은 기기에서 ffmpeg를 사용하여 가능할 때 NVENC로 렌더링합니다. 테스트 실행 중 인코더가 CUDA 컨텍스트 생성에 실패했습니다. 오류는 몇 초 안에 발생했다 사라지기도 했습니다. 짧은 NVENC 프로브는 통과했지만 직후 렌더링은 실패했고, 다음 실행에서는 프로브 자체가 실패했으며, 그 다음 실행에서는 프로브와 렌더링 모두 NVENC를 통해 정상 처리되었습니다.
왜 그런가요
vLLM은 시작 시 모델과 캐시를 위해 GPU 메모리의 고정된 부분을 예약합니다. NVENC는 각 세션의 CUDA 컨텍스트를 위해 자체적으로 약간의 메모리가 필요합니다. 모델 서버와 다른 작업들이 메모리를 모두 소진하면, NVENC는 칩 위의 별도 엔진으로 GPU 연산에는 거의 영향을 주지 않음에도 불구하고 시작할 수 없게 됩니다.
해결책: 프로브가 아닌 인코딩 시점에 결정하기
시작 시 프로브는 NVENC가 방금 전에는 정상 작동했다는 사실만 알려 줄 뿐, 다음 파일에서도 작동한다는 보장은 없습니다. 그래서 Studio는 렌더링마다 NVENC를 시도하고, ffmpeg이 실패하면 동일한 필터 그래프를 libx264로 다시 실행합니다. 라이브 채널은 시작할 때마다 라이브 설정으로 0.5초 테스트 인코딩을 수행하며, NVENC가 실패하면 libx264를 사용합니다. 스트리밍 중 NVENC 또는 CUDA 오류가 발생하면 다음 시작 시 libx264로 전환됩니다. 완성된 각 영상에는 어떤 인코더가 생성했는지 기록되므로, 폴백 발생 시 unnoticed로 넘어가지 않고 작업 파일에 표시됩니다.
폴백의 비용
예상보다 적었습니다. 같은 머신의 20코어 Arm CPU에서 libx264는 카메라 무브, 번인 자막, 라우드니스 정규화가 포함된 1080p 영상 12초를 7.6초 만에 렌더링했습니다. 하루에 한 번 만드는 짧은 영상의 경우 CPU도 충분히 좋은 인코더입니다. GPU는 인코딩보다는 이미지 모델에 훨씬 더 중요합니다.
핵심 요약
공유 머신에서는 GPU 인코더를 선택 사항으로 취급하세요. 사용할 수 있으면 사용하고, 그렇지 않으면 대체 방식으로 전환하며 어떤 방식을 사용했는지 기록하세요. 이미 모델 서버가 메모리의 대부분을 차지한 머신에서 자체 메모리가 필요한 모든 GPU 기능에도 동일하게 적용됩니다. Studio는 이 동작이 기본적으로 활성화되어 있습니다.