Continuous Batching(コンティニュアスバッチング)
LLM推論において生成が終了したシーケンスを即座にバッチから除去し、新規リクエストを動的に挿入することでGPU利用率を最大化するバッチング戦略。
Continuous Batching
概要
Continuous Batchingは、LLM推論サービスにおいてGPU利用率を最大化するスケジューリング技術。2022年のOSDI論文「Orca: A Distributed Serving System for Transformer-Based Generative Models」(ByteDance/SNU)で提案され、現在ではvLLM、TGI、TensorRT-LLMなど主要推論エンジンの標準機能となっている。
問題:静的バッチングの非効率性
静的バッチングでは、バッチ内の最長シーケンスが完了するまで全スロットを占有する。例えばReq1が20トークンで完了しても、Req2が100トークン生成中はReq1分のGPUスロットが無駄になる。生成長のばらつきが大きいほど、GPU利用率が低下し、リアルタイムサービスでは平均50〜60%のGPU利用率にとどまることも。
Continuous Batchingの動作
各推論ステップ(イテレーション)後に完了シーケンスを除外し、待機リクエストをエンキュー。GPUを常にフル活用する。
イテレーション0-19: バッチ=[Req1, Req2, Req3] イテレーション20: Req1完了 → バッチ=[Req2, Req3, Req4(新規追加)] イテレーション50: Req3完了 → バッチ=[Req2, Req4, Req5(新規追加)]
PagedAttentionとの相乗効果
vLLMではPagedAttentionとContinuous Batchingが連携:
- Continuous Batchingが動的バッチサイズを管理
- PagedAttentionが可変長シーケンスのKVキャッシュを効率管理
- 2技術の組み合わせでHuggingFace比最大24倍スループット(当初発表)
設定例
from vllm import AsyncLLMEngine, AsyncEngineArgs
engine_args = AsyncEngineArgs(
model="meta-llama/Llama-3.1-8B-Instruct",
max_num_seqs=256, # 最大同時バッチサイズ
max_num_batched_tokens=8192, # 1イテレーションあたり最大トークン数
gpu_memory_utilization=0.90,
)
engine = AsyncLLMEngine.from_engine_args(engine_args)
採用状況(2025年)
- vLLM: Iteration-level scheduling
- HuggingFace TGI: Dynamic batching
- NVIDIA TensorRT-LLM: In-flight batching
- SGLang: Continuous batching + RadixAttention
- llama.cpp server: Parallel decoding
Continuous Batchingは2025年現在、商用LLMサービングの標準技術として確立。本番推論インフラ設計において必須の考慮事項となっている。