vLLMのPyNvVideoCodecを用いたマルチGPU動画キャプションのスケーラビリティ向上

vLLMは、PyNvVideoCodecライブラリを介してNVIDIAハードウェア動画デコード(NVDEC)のサポートを統合し、CPUからGPUにデコードワークロードを移行することで、マルチGPUノードにわたる動画キャプションおよびラベル付けタスクを効率的にスケーリング可能にしました。

動画キャプションにおけるCPUボトルネックの除去

自律走行車(AV)のトレーニングで危険なシナリオを分類し、検索可能なメタデータを生成するなど、動画キャプションタスクは、通常、Qwen/Qwen3-VL-8B-Instructのような軽量なビジョン言語モデル(VLM)を活用します。これらのタスクは通常、短い出力(100〜200トークン)を生成するため、動画フレームのデコードに要する時間が全体の処理時間の大部分を占めます。

以前は、vLLMはCPUベースのOpenCV+FFMPEGバックエンドに依存していました。マルチGPU構成(1GPUあたり1つのvLLMサーバー)では、CPUがしばしばボトルネックとなり、2〜4GPUでもコアが最大限に使用されることがありました。PyNvVideoCodecを活用することで、vLLMはこのデコード処理をGPUのハードウェアデコーダーに移行し、システムが最大8GPUまでスループットを線形にスケーリングできるようになりました。

マルチGPUノードにおけるパフォーマンス向上

ハードウェアベースの動画デコードは、大規模なキャプションワークロードにおけるスループットを大幅に向上させます。H100 GPUを用いたベンチマークでは、8つのvLLMレプリカ(それぞれが1GPUを割り当て)を用いた場合、GPUベースの動画デコードはCPUベースのデコーダーと比べてスループットが2倍以上になりました。

この移行により、従来のスケーリングを制限していたCPU利用率の上限が解消されました。CPUベースのデコードでは4GPUに到達する前にシステムがボトルネックに陥っていましたが、NVDECを活用したアプローチでは、CPUが飽和することなく、すべての8GPUで安定したパフォーマンスを維持できます。

実装と設定

前提条件とインストール

PyNvVideoCodec機能は、標準のCUDA vLLMリリースに含まれています。カスタムインストールを行うユーザーは、PyNvVideoCodec==2.0.4をPyPiの依存関係として含める必要があります。

デプロイ設定

ハードウェア動画デコードを有効にするには、vLLMをmedia-io-kwargspynvvideocodecバックエンドを指定して起動する必要があります。推奨されるデプロイ手順は以下の通りです:

  1. CUDA MPSデーモンの起動:高並行性での大規模VLM推論においてパフォーマンスを維持するには、nvidia-cuda-mps-control -dコマンドが不可欠です。
  2. VRAMの予約--mm-ipc-gpu-memory-gbフラグを使用して、動画デコード専用のVRAMを予約します。ユーザーはこの値を調整し、スループットを維持するために必要な最小量を見つける必要があります。
  3. GPUの隔離:マルチGPUスケーリングのためには、1つのvLLMサーバーレプリカごとに1つのコンテナを実行し、各コンテナに1つの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領域が必要です。もし既にKVキャッシュに利用可能なVRAMのすべてを消費しているユースケースでは、パフォーマンスに影響が出る可能性があります。しかし、vLLMの実際のテストでは、PyNvVideoCodecを使用したことでパフォーマンスが低下した事例は一切見つかりませんでした。

Sources