Când NVENC nu pornește: un GPU plin de modele și un randor care revine la soluția implicită
Video
Randorul nostru video rulează pe aceeași mașină cu modelul de limbă care îi scrie scripturile. Într-o seară, encoderul hardware pur și simplu nu s-a deschis: „CUDA_ERROR_OUT_OF_MEMORY: out of memory”, apoi „No capable devices found”.
Ce s-a întâmplat
Mașina este un desktop NVIDIA GB10, al cărui CPU și GPU împart un singur pool de memorie. Acesta servește modelul nostru local prin vLLM, iar Studio randează pe aceeași mașină cu ffmpeg, folosind NVENC când poate. În timpul unei testări fără modificări, encoderul nu a reușit să își creeze contextul CUDA. Eșecul venea și pleca în câteva secunde: o sondă NVENC scurtă trecea, iar randarea imediat după ea eșua; la runda următoare, sonda în sine eșua; la runda de după aceea, atât sonda, cât și randarea treceau prin NVENC.
De ce
vLLM rezervă o parte fixă din memoria GPU-ului la pornire, pentru model și pentru cache-ul său. NVENC are nevoie de puțină memorie proprie pentru contextul CUDA al fiecărei sesiuni. Când serverul de modele și alte joburi nu lasă nimic liber, encoderul nu poate porni, deși este un motor separat pe cip și ar atinge foarte puțin calculul GPU-ului.
Soluția: decideți la codare, nu la sondă
O sondă la pornire vă spune că NVENC a funcționat cu un moment în urmă, nu că va funcționa pentru fișierul următor. Așa că Studio încearcă NVENC pentru fiecare randare și, dacă ffmpeg eșuează, rulează din nou același grafic de filtre cu libx264. Canalul live rulează o testare fără modificări de jumătate de secundă cu setările live înainte de fiecare pornire și folosește libx264 dacă NVENC eșuează; o eroare NVENC sau CUDA în timpul stream-ului comută pornirea următoare la libx264. Fiecare video finalizat înregistrează ce encoder l-a produs, astfel încât o revenire la soluția implicită apare în fișierul jobului în loc să treacă neobservată.
Cât costă revenirea la soluția implicită
Mai puțin decât ne așteptam. Pe CPU-ul Arm cu 20 de nuclee al aceleiași mașini, libx264 a randat 12 secunde de video 1080p, cu mișcări de cameră, subtitrări arse în imagine și normalizare de sonoritate, în 7,6 secunde. Pentru videoclipuri scurte realizate o dată pe zi, CPU-ul este un encoder perfect bun. GPU-ul contează mult mai mult pentru modelul de imagine decât pentru codare.
Concluzia
Pe o mașină partajată, tratează encoderul GPU ca opțional: folosește-l când este disponibil, revino la alternativa software când nu este și înregistrează care variantă a fost utilizată. Același lucru se aplică oricărei funcții GPU care are nevoie de memorie proprie pe un server unde un server de modele a ocupat deja cea mai mare parte din memorie. Studio include acest comportament implicit.