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