vLLM 集成 PyNvVideoCodec,用 GPU 硬件解码加速多卡视频描述
Scaling Multi-GPU Video Captioning with PyNvVideoCodec and vLLM
vLLM 宣布支持 NVIDIA GPU 内置的硬件视频解码,通过集成 PyNvVideoCodec(NVDEC 的 Python 接口)把视频解码从 CPU 转移到 GPU,缓解此前多卡 VLM 推理的 CPU 瓶颈。
vLLM 接入 GPU 硬件解码后,视频描述任务在 8 卡节点上吞吐翻倍,读者可据此评估自身多卡推理的 CPU 瓶颈。

我们很高兴地宣布支持内置于 NVIDIA GPU 的硬件视频解码,使此前受 CPU 瓶颈限制的视频字幕生成和标注任务能够在数据中心级多 GPU 节点上扩展吞吐量。
视频字幕生成是许多行业中的常见任务,用于描述视频中正在发生的事情。这使自动驾驶(AV)训练系统能够描述和分类危险场景,生成人类可读且可搜索的元数据,以及用于其他用例。
此前,vLLM 处理这些数据集时,需要发送只能通过基于 CPU 的 OpenCV+FFMPEG 后端解码的视频。在多 GPU 节点上运行此类视觉语言模型(VLM)(每个 GPU 一个 vLLM 服务器)对 CPU 提出了更高的要求,需要在任何 VLM 推理工作开始之前解码视频帧。特别是在视频字幕生成的情况下,输出相对较短(100-200 个 token),解码视频所花费的时间占比要大得多,基于 CPU 的视频解码很快就会成为瓶颈,即使只有 2 或 4 个 GPU 也会占满 CPU 核心。
通过集成 PyNvVideoCodec——一个面向 NVIDIA 硬件视频解码器(也称为“NVDEC”)的基于 Python 的接口——vLLM 能够将这一视频解码工作负载从 CPU 转移出去,消除上述瓶颈,即使扩展到 8 个 GPU 也能实现出色的扩展性。
请参阅以下该任务的输入提示/输出示例(实际提示更加详尽且结构化):
示例输入提示
分析这段前向行车记录仪视频。简要描述驾驶环境、相关道路使用者和交通控制设施,以及自车的动作。仅报告清晰可见的细节,避免推测。
示例输出
自车在白天沿多车道城市道路行驶,能见度良好。同车道和相邻车道前方有几辆车,可见一个信号灯路口。自车保持在本车道内,在接近车流时减速,并在与前车保持距离的情况下继续行驶。
在 vLLM 中使用 NVIDIA 硬件视频解码
安装前置依赖
PyNvVideoCodec 提供的功能已包含在标准 CUDA vLLM 发行版中!对于使用自定义安装 vLLM 的用户,请确保你的项目包含对 PyNvVideoCodec==2.0.4 的 PyPi 依赖。
启用 PyNvVideoCodec 视频解码器启动 vLLM
# First launch CUDA MPS Daemon
nvidia-cuda-mps-control -d
# Launch vLLM with pynvvideocodec video backend
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}}'CUDA MPS 对于多进程高并发工作(如批量 VLM 推理)获得良好性能至关重要。在 vllm serve 之前,我们建议确保 MPS 守护进程已启动。
--mm-ipc-gpu-memory-gb 用于为视频解码预留 VRAM。你可以在不同取值下测试吞吐量,只预留不影响吞吐量的最小量。有关 PyNvVideoCodec 解码器后端相关参数的更多文档,请参阅 相关的 vLLM 文档。
扩展到多个 GPU 时,我们通常建议每个 vLLM 服务器副本运行一个容器,并向每个容器暴露单个 GPU。或者,使用 CUDA_VISIBLE_DEVICES 向每个 vLLM 副本暴露单个 GPU。我们使用反向代理在 vLLM 副本之间分发请求。
视频字幕生成任务中的多 GPU 扩展

图 1:使用 H100 GPU 改进的多 GPU 扩展性。在 8xH100 下,基于 GPU 的视频解码提供的吞吐量是基于 CPU 的视频解码器的两倍以上。8 个 vLLM 副本,每个副本使用单个 GPU。
作为该方法优势的一个示例,我们来看 NVIDIA AV 组织内使用的视频字幕任务。这些系统负责为数十万小时的视频片段生成字幕,包含数亿次视频字幕请求。这些任务通常需要相对轻量级的模型(例如 Qwen/Qwen3-VL-8B-Instruct),具有指定所需描述类型的输入提示,并且输出大约在 100-200 个 token 的量级。

图 2. 此前利用多达 8 个 GPU 的大型工作负载会在 4 个 GPU 之前就受限于 CPU 利用率。现在,借助基于硬件的视频解码支持,CPU 瓶颈已被消除。数据在基准测试稳态期间采集。
注意事项
值得注意的是,视频解码确实需要预留一些 VRAM:如果您的用例已经用整个 VRAM 占满了 KV 缓存,那么您可能会看到一些影响。在实际测试中,我们尚未见到使用 PyNvVideoCodec 会带来性能下降的情况。
致谢
感谢所有为将硬件视频解码支持引入 vLLM 做出贡献的人。
- NVIDIA:
- NVCV 团队:Brandon Pelfrey、Benjamin Chislett、Dhaval Suthar、Jeremy Bottleson、Ernesto Zamora Ramos、David Lesage
- PyNvVideoCodec 团队:Rohit Naskulwar、Jayant Mukundam、Hareshkumar Borse
- vLLM 团队与社区:Roger Wang、Nick Hill、Cyrus Leung、Zifeng Mo
来源:vLLM Blog · vllm.ai