PyNvVideoCodec ve vLLM: přes 2× vyšší propustnost na 8 H100

NVIDIA přesunula dekódování videa z CPU na NVDEC. Její test ukazuje, proč multi-GPU video captioning potřebuje vlastní VRAM a MPS.

18. září 2026 Redakce aidevelopers.cz

NVIDIA Computer Vision Team popsal integraci PyNvVideoCodec do vLLM, která přesouvá dekódování videa z CPU na hardwarové dekodéry NVDEC v GPU. V testu na osmi H100 dosáhla GPU varianta více než dvojnásobné propustnosti proti původnímu backendu OpenCV a FFmpeg běžícímu na CPU. Jde o výsledek NVIDIA na její konkrétní konfiguraci, ne o nezávislý benchmark všech video workloadů.

Proč CPU přestalo stačit

Při video captioningu musí systém nejprve dekódovat snímky a teprve potom je předat vision-language modelu. Výstup bývá podle autorů krátký, přibližně 100 až 200 tokenů, takže dekódování tvoří větší část celkového času než u dlouhého textového generování. Pokud na jednom uzlu běží jedna vLLM replika pro každou GPU, tlak na CPU roste s počtem replik.

NVIDIA uvádí, že CPU jádra se v tomto scénáři mohou vytížit už při dvou až čtyřech GPU. Její graf pro osm vLLM replik na osmi H100 ukazuje u PyNvVideoCodec více než dvojnásobnou propustnost proti CPU dekodéru. Zdroj ale nepublikuje přesné absolutní hodnoty ani srovnání na jiném typu GPU, takže výsledek nelze převést na obecné pravidlo pro libovolný uzel.

Co je potřeba nastavit

PyNvVideoCodec je podle blogu už součástí standardních CUDA distribucí vLLM. U vlastní instalace je potřeba závislost PyNvVideoCodec==2.0.4. Pro více procesů a vysokou souběžnost autoři doporučují před spuštěním serveru zapnout CUDA MPS:

nvidia-cuda-mps-control -d

Video backend se vybírá v --media-io-kwargs. Příklad NVIDIA používá dva hardwarové dekodéry a omezuje každý vstup na 16 snímků:

vllm serve Qwen/Qwen3-VL-8B-Instruct \
  --api-server-count 4 \
  --renderer-num-workers 4 \
  --async-scheduling \
  --mm-ipc-gpu-memory-gb 2 \
  --media-io-kwargs \
  '{"video":{"backend":"pynvvideocodec","min_frames":16,"max_frames":16,"hw_decoders":2}}'

Parametr --mm-ipc-gpu-memory-gb rezervuje VRAM pro dekódování. Autoři doporučují vyzkoušet několik hodnot a ponechat nejmenší rezervu, při které už propustnost neklesá. Pro škálování přes více GPU používají jednu vLLM repliku v samostatném kontejneru na každé GPU a požadavky mezi repliky rozdělují reverzní proxy.

Cena za přesun na GPU

Dekódování na NVDEC šetří CPU, ale spotřebuje část VRAM, která by jinak mohla sloužit KV cache modelu. Pokud inference už využívá téměř všechnu paměť GPU, rezervace pro video může snížit prostor pro dávky nebo délku kontextu. NVIDIA uvádí, že ve vlastních testech nezaznamenala výkonnostní propad způsobený PyNvVideoCodec; bez zveřejněných výsledků pro zaplněnou VRAM to ale není záruka pro jinou konfiguraci.

Popsaný přístup dává největší smysl tam, kde dekódování skutečně vytěžuje CPU dříve než samotná inference GPU. Před nasazením je proto vhodné měřit zvlášť vytížení CPU, čas dekódování, spotřebu VRAM a propustnost celé pipeline. Samotné přepnutí backendu nemusí pomoci workloadu, jehož úzké hrdlo leží v modelu nebo přenosu dat.