vLLM 通过 PyNvVideoCodec 实现多 GPU 视频字幕生成的扩展
vLLM 已通过 PyNvVideoCodec 库集成对 NVIDIA 硬件视频解码(NVDEC)的支持,使视频字幕生成和标注任务能够通过将解码工作负载从 CPU 转移到 GPU,高效地在多 GPU 节点上扩展。
移除视频字幕生成中的 CPU 瓶颈
视频字幕生成任务——例如用于自动驾驶(AV)训练以分类危险场景并生成可搜索元数据的任务——通常使用轻量级视觉语言模型(VLM),如 Qwen/Qwen3-VL-8B-Instruct。由于这些任务通常生成较短的输出(100-200 个 token),解码视频帧所花费的时间占总处理时间的很大一部分。
此前,vLLM 依赖基于 CPU 的 OpenCV+FFMPEG 后端进行视频解码。在多 GPU 配置中(每个 GPU 运行一个 vLLM 服务器),CPU 通常会成为瓶颈,即使只有 2 到 4 个 GPU 也会使核心达到满载。通过使用 PyNvVideoCodec,vLLM 将此解码过程转移到 GPU 的硬件解码器上,使系统能够线性扩展吞吐量,最高支持 8 个 GPU。
多 GPU 节点上的性能提升
基于硬件的视频解码显著提高了大规模字幕生成工作负载的吞吐量。在使用 H100 GPU 的基准测试中,8 个 vLLM 实例(每个实例分配一个 GPU)的 GPU 基于解码的性能比基于 CPU 的解码高出两倍以上。
这一转变消除了此前限制扩展性的 CPU 利用率上限。虽然基于 CPU 的解码在达到 4 个 GPU 之前就会成为系统瓶颈,但基于 NVDEC 的方法可在所有 8 个 GPU 上实现稳定性能,而不会导致 CPU 过载。
实现与配置
先决条件与安装
PyNvVideoCodec 功能包含在标准 CUDA vLLM 发行版中。自定义安装的用户必须将 PyNvVideoCodec==2.0.4 作为 PyPi 依赖项添加。
部署配置
要启用硬件视频解码,vLLM 应在 media-io-kwargs 中指定 pynvvideocodec 后端。推荐的部署步骤包括:
- 启动 CUDA MPS 守护进程:
nvidia-cuda-mps-control -d命令对于在高并发批量 VLM 推理期间保持性能至关重要。 - VRAM 预留:使用
--mm-ipc-gpu-memory-gb标志为视频解码专门预留 VRAM。用户应调整此值,以找到维持吞吐量所需的最小内存。 - GPU 隔离:对于多 GPU 扩展,推荐方法是为每个 vLLM 服务器实例运行一个容器,每个容器仅暴露一个 GPU(或使用
CUDA_VISIBLE_DEVICES)。然后使用反向代理将请求分发到这些实例。
示例启动命令
vllm serve Qwen/Qwen3-VL-8B-Instruct \
--dtype bfloat16 \
--max-model-len 32768 \
--max-num-seqs 1024 \
--max-num-batched-tokens 32768 \
--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}}' \
--mm-processor-kwargs '{"size":{"shortest_edge":65536,"longest_edge":9437184}}'
技术注意事项
硬件视频解码需要占用一部分专用 VRAM。如果某个用例已将全部可用 VRAM 用于 KV 缓存,则可能会对性能产生影响。然而,vLLM 报告称,在实际测试中,未发现使用 PyNvVideoCodec 导致性能下降的情况。