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 後端。建議的部署步驟包括:

  1. 啟動 CUDA MPS 守護程序nvidia-cuda-mps-control -d 命令對於在高併發批量 VLM 推理期間維持效能至關重要。
  2. VRAM 預留:使用 --mm-ipc-gpu-memory-gb 標記來預留專用 VRAM 用於影片解碼。使用者應調整此值,以找到維持吞吐量所需的最小量。
  3. 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 會導致效能下降的情況。

Sources