深色模式
连续批处理 Continuous Batching
摘要:静态批处理要求整批等长、同速结束,导致短请求被长请求拖死、GPU 利用率仅 30–40%。连续批处理(token-level batching)让请求在任意时刻插入/移出,配合分页显存把 GPU 喂满到 85%+。本文讲原理、调度与 preemption,并给出生产配置。适用版本:vLLM 0.8.x–0.9.x 等主线引擎。
适用版本与前提
- 引擎:vLLM / TGI / SGLang 均支持(概念相通)
- 读者已了解 KV Cache 与 PagedAttention(见本目录
vllm.md、kv-cache.md)
核心概念:静态批处理的致命缺陷
传统(静态)批处理在生成开始时凑齐一批请求,整批必须等到最长那个生成完才能接纳新请求。后果:
- 请求饥饿:短请求排在长请求后,要等整批结束。
- 资源气泡:长请求 decode 时,短请求早已完成的那部分 GPU 算力空转。
- 尾部延迟不可控:后到的请求等待时间无上界。
连续批处理改为 token 级调度:每一步(step)调度器从运行/等待队列里挑请求拼成当前 step,完成的请求立刻移出、新请求立刻插入。GPU 几乎每步都满载。
连续批处理 ≠ 简单"多请求并发"
关键在于每一步都重新组 batch,且可在 decode 步里混入新请求的 prefill(配合 chunked prefill)。这让不同进度、不同长度的请求共享同一个 GPU 时间片。
架构与原理
调度器每步决策:① 从 waiting 取多少新请求进 running(受 --max-num-seqs、--max-num-batched-tokens 约束);② 给 running 里每个请求分配 KV 块;③ 显存不足时抢占低优先请求(swap 到 CPU 内存或丢弃后重算)。
为什么必须配分页显存
连续批处理让请求长度参差不齐、进出频繁。若 KV 是"每请求连续大块",碎片会瞬间拖垮显存。PagedAttention(块表映射)让 KV 可随时增减、碎片趋近于零——两者是搭档(见 vllm.md、kv-cache.md)。
生产配置
bash
# vLLM:连续批处理是默认行为,主要调"batch 边界"旋钮
docker run --gpus all --ipc=host -p 8000:8000 \
-v /mnt/models:/models \
vllm/vllm-openai:latest \
--model /models/Qwen2.5-7B-Instruct \
--max-num-seqs 256 \
--max-num-batched-tokens 8192 \
--enable-chunked-prefill \
--gpu-memory-utilization 0.90
# [版本相关] --enable-chunked-prefill / --max-num-batched-tokens 名称以官方文档为准1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
bash
# chunked prefill:把长 prompt 的 prefill 切成多步,
# 与 decode 请求穿插,避免一个长请求阻塞整批(降低 TTFT 尖刺)
# 验证:压测对比 开/关 chunked prefill 的 P99 TTFT1
2
3
2
3
验证
- 用压测观察:开启连续批处理后,相同硬件下吞吐应明显高于"一次一个请求串行"。vLLM 指标
vllm:num_requests_running/num_requests_waiting反映批内活跃度。 - 看
gpu_cache_usage_sys与preemption计数:健康状态是 KV 利用率高且 preempt 接近 0。
回滚与清理
旋钮不是越大越好
max-num-seqs / max-num-batched-tokens 过大 → 单步耗时变长、TTFT 升、可能 OOM。变更前记录旧值,灰度观察 P99,异常回退。
故障排查
| 现象 | 原因 | 处理 |
|---|---|---|
| 吞吐低、GPU 空闲 | 并发/流量不足 | 提 --max-num-seqs、加压测流量 |
| P99 延迟陡增 | 超过舒适并发 | 降并发上限 / 网关限流 |
| 大量 preempted | KV 池满 | 量化 KV、降 --max-model-len、加卡 |
| TTFT 尖刺 | 长 prefill 阻塞 | 开 chunked prefill、限制输入长度 |
安全与合规
- 成本失控:连续批处理让"加并发"变容易,但也让单用户用大量长请求占满 batch 变容易。网关必须对每用户并发、
max_tokens、输入长度设硬上限。 - 公平性:多租户时调度器应支持优先级/配额,避免大请求饿死小请求。
- 越权:API 鉴权前置,禁止直连。
成本与性能(示意)
以 Qwen2.5-7B、A100 80GB 为例:
| 策略 | GPU 利用率(估) | 吞吐(相对) | 说明 |
|---|---|---|---|
| 串行/静态批 | 30–40% | 1× | 基线,浪费严重 |
| 连续批处理 | 80%+ | 2–4× | 社区常见相对值,非 SLA |
收益来源
连续批处理不靠"更快的 kernel",靠"减少 GPU 空转"。它和分页显存、KV 量化组合,是单卡并发从十位到百位量级提升的核心。先确保连续批处理跑通,再谈量化与并行。