Když se NVENC nespustí: GPU plné modelů a renderer, který přepne na zálohu

Video

Náš video renderer běží na stejném stroji jako jazykový model, který píše jeho skripty. Jednoho večera se hardwarový enkodér prostě nechtěl otevřít: "CUDA_ERROR_OUT_OF_MEMORY: out of memory", poté "No capable devices found".

Co se stalo

Stroj je desktop NVIDIA GB10, jehož CPU a GPU sdílejí jednu paměťovou pool. Obsluhuje náš lokální model přes vLLM a Studio renderuje na stejném boxu s ffmpeg, používá NVENC, když to jde. Během testovacího běhu se enkodéru nepodařilo vytvořit jeho CUDA kontext. Chyba přicházela a odcházela během sekund: krátká NVENC sonda prošla a render hned po ní selhal; při dalším běhu selhala samotná sonda; při běhu po dalším prošly sonda i render oba přes NVENC.

Proč

vLLM si při startu vyhradí pevný podíl paměti GPU pro model a jeho cache. NVENC potřebuje trochu vlastní paměti pro CUDA kontext každé relace. Když server s modelem a další úlohy nic nenechají, enkodér se nespustí, i když je to samostatný engine na čipu a výpočet GPU by téměř nezatížil.

Oprava: rozhodnout při enkodování, ne při sondě

Sonda při startu vám řekne, že NVENC fungoval před chvílí, ne že bude fungovat pro další soubor. Studio proto zkouší NVENC pro každý render a pokud ffmpeg selže, spustí stejný filtr graf znovu s libx264. Živý kanál spustí půlsekundový testovací enkod s živými nastaveními před každým startem a použije libx264, pokud NVENC selže; chyba NVENC nebo CUDA během streamu přepne další start na libx264. Každé dokončené video si zaznamená, který enkodér ho vytvořil, takže přepnutí na zálohu se objeví v souboru úlohy místo aby prošlo bez povšimnutí.

Co stojí přepnutí na zálohu

Méně, než jsme čekali. Na 20jádrovém Arm CPU stejného stroje vykreslil libx264 12 sekund videa 1080p s pohyby kamery, vypálenými titulky a normalizací hlasitosti za 7,6 sekundy. Pro krátká videa tvořená jednou denně je CPU naprosto dobrý enkodér. GPU je mnohem důležitější pro obrazový model než pro enkodování.

Shrnutí

Na sdíleném počítači berte GPU enkodér jako volitelný: použijte ho, když je dostupný, jinak přejděte na náhradu a zaznamenejte, kterou cestu jste použili. To samé platí pro libovolnou funkci GPU, která potřebuje vlastní paměť na stroji, kde server s modelem už většinu paměti zabral. Studio má toto chování ve výchozím nastavení zapnuté.

Aktualizováno: