vLLM 使用 PyNvVideoCodec 在多 GPU 上擴展影片字幕生成
vLLM 已整合透過 PyNvVideoCodec 庫支援 NVIDIA 硬體影片解碼 (NVDEC),使影片字幕生成與標記任務能透過將解碼工作負載從 CPU 轉移到 GPU,高效地在多 GPU 節點上擴展。
移除影片字幕生成中的 CPU 瓶頸
影片字幕生成任務——例如用於自動駕駛 (AV) 訓練中分類危險場景並產生可搜尋的元資料——通常會使用輕量級視覺語言模型 (VLM),如 Qwen/Qwen3-VL-8B-Instruct。由於這些任務通常產生短輸出(100-200 個詞元),解碼影片畫格所花的時間佔總處理時間的顯著比例。
過去,vLLM 依賴 CPU 基礎的 OpenCV+FFMPEG 後端進行影片解碼。在多 GPU 組態中(每 GPU 執行一個 vLLM 伺服器),CPU 常成為瓶頸,即使僅有 2 到 4 個 GPU,CPU 核心也經常達到滿載。透過使用 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 會導致效能下降的情況。