Когда NVENC не запускается: GPU, занятый моделями, и рендерер с откатом
Видео
Наш видеорендерер работает на той же машине, что и языковая модель, пишущая для него сценарии. Однажды аппаратный кодировщик просто отказался открываться: сначала «CUDA_ERROR_OUT_OF_MEMORY: out of memory», затем «No capable devices found».
Что произошло
Это настольный компьютер NVIDIA GB10, у которого CPU и GPU используют общий пул памяти. Он обслуживает нашу локальную модель через vLLM, а Studio рендерит на той же машине с помощью ffmpeg, используя NVENC, когда это возможно. Во время тестового запуска кодировщик не смог создать свой CUDA-контекст. Сбой возникал и исчезал за секунды: короткий тест NVENC проходил, а следующий за ним рендер падал; при следующем запуске падал сам тест; при запуске после этого и тест, и рендер успешно шли через NVENC.
Почему
vLLM при запуске резервирует фиксированную долю памяти GPU для модели и её кэша. NVENC требует немного собственной памяти для CUDA-контекста каждой сессии. Когда сервер модели и другие задачи не оставляют свободной памяти, кодировщик не может запуститься, хотя это отдельный движок на чипе, который едва задействует вычислительные мощности GPU.
Решение: принимать решение при кодировании, а не при тесте
Тест при запуске говорит лишь о том, что NVENC работал мгновение назад, а не о том, что он сработает для следующего файла. Поэтому Studio пробует NVENC для каждого рендера и, если ffmpeg падает, повторно запускает тот же граф фильтров с libx264. Живой канал перед каждым запуском выполняет тестовое кодирование длительностью полсекунды с текущими настройками и использует libx264, если NVENC не проходит тест; ошибка NVENC или CUDA во время трансляции переключает следующий запуск на libx264. Каждый готовый ролик записывает, какой кодировщик его создал, поэтому откат виден в файле задания, а не проходит незамеченным.
Цена отката
Меньше, чем мы ожидали. На 20-ядерном Arm CPU той же машины libx264 отрендерил 12 секунд видео в 1080p с движениями камеры, вжиганием субтитров и нормализацией громкости за 7,6 секунды. Для коротких роликов, создаваемых раз в день, CPU — вполне подходящий кодировщик. GPU гораздо важнее для модели изображений, чем для кодирования.
Главный вывод
На общей машине считайте GPU-кодер опциональным: используйте его, когда он доступен, и переключайтесь на резервный вариант, когда он недоступен, записывая в журнал, какой из них вы использовали. То же самое относится к любой функции GPU, которой требуется собственная память на машине, где сервер моделей уже занял большую её часть. Studio поставляется с таким поведением, включённым по умолчанию.