ダイナミックバッチング(ダイナミックバッチング)
到着タイミングの異なるリクエストを推論エンジンがリアルタイムでまとめてバッチ処理する技術。
ダイナミックバッチング(Dynamic Batching)
ダイナミックバッチング(Dynamic Batching)は、LLM推論サーバーが複数のリクエストを動的にグループ化してGPUで一括処理する技術。固定バッチと異なり、リクエストの到着タイミングに応じてリアルタイムでバッチを構成する。
なぜ必要か
GPUはバッチ処理が得意で、1件ずつ処理するよりN件まとめて処理する方がスループットが高い。しかしユーザーリクエストは不規則に到着するため、固定バッチサイズを設定すると「バッチが埋まるまで待つ」か「小さいバッチで処理する」かのトレードオフが生じる。
ダイナミックバッチングはこの問題を解消し、到着したリクエストを即座にバッチに追加しながら処理を継続する。
主要パラメータ
max_batch_size 最大同時処理リクエスト数
max_wait_time バッチ待機タイムアウト(ms)
preferred_batch 推奨バッチサイズ(到達したら即実行)
フレームワーク別実装
vLLM
vllm serve mistralai/Mistral-7B-Instruct-v0.3 \
--max-num-seqs 256 \
--max-num-batched-tokens 4096
Text Generation Inference (TGI)
docker run ghcr.io/huggingface/text-generation-inference \
--max-batch-size 32 \
--waiting-served-ratio 1.2
SGLang
runtime = sgl.Runtime(
model_path="meta-llama/Llama-3.1-8B-Instruct",
max_running_requests=512,
)
Continuous Batching との関係
ダイナミックバッチングは広義の概念で、LLMに特化した実装が Continuous Batching(反復レベルスケジューリング)。Continuous Batchingは1トークン生成ごとにバッチを再構成し、完了したシーケンスを即座に次のリクエストで置き換える。
| 方式 | バッチ更新タイミング | 空き席の扱い |
|---|---|---|
| 従来固定バッチ | リクエスト完了後 | 次バッチまで空白 |
| ダイナミックバッチング | 一定時間/件数 | 次バッチで埋める |
| Continuous Batching | 毎トークン生成後 | 即座に新リクエスト挿入 |
スループット vs レイテンシ
大きいバッチほどGPU利用率が上がりスループットは増加するが、小さいリクエストも大きいバッチの完了を待つためレイテンシが増加する。
本番環境ではSLO(例: P99レイテンシ2秒以下)を設定し、バッチサイズを動的に調整するアダプティブバッチングが採用される。
実測パフォーマンス例
A100 80GB / Llama-3.1-70B-Instruct:
- バッチサイズ1: ~15 tokens/sec
- バッチサイズ8: ~80 tokens/sec(5.3倍)
- バッチサイズ32: ~220 tokens/sec(14.7倍)
バッチサイズ増加によるスループット向上はGPUメモリ上限で頭打ちになる。vLLMのPagedAttentionはこのメモリ制約を緩和し、より大きな有効バッチサイズを実現する。