Appearance
在每次推理迭代中动态插入新请求、移除已完成请求的批处理策略,也称 iteration-level batching。
为什么需要 Continuous Batching
静态批处理(Static Batching)要求同一 batch 内所有序列同时开始、同时结束。短序列完成后必须等待最长序列,导致 GPU 大量空闲。Continuous Batching 在每次迭代(iteration)粒度上调整 batch 组成,新请求无需等待当前 batch 完成,完成的请求立即释放资源,显著提升吞吐量。
核心原理
- Iteration-level 调度:每次 forward 前由 Scheduler 决定本次 batch 包含哪些 sequence。
- Preemption & Swap:显存不足时可抢占(preempt)低优先级序列,将其 KV Cache swap 到 CPU。
- Slot 复用:已完成的 sequence 释放的 slot 立即分配给等待中的新请求。
- 与 PagedAttention 协同:block 级别的 KV Cache 管理使 sequence 的加入和移除几乎零开销。
在源码中的实现
vllm/core/scheduler.py—Scheduler核心调度循环,每次schedule()返回当前 iteration 的SchedulerOutput。vllm/core/scheduling_policy.py— 调度策略(FCFS、优先级等)决定请求的调度顺序。vllm/engine/engine_core.py—EngineCore在主循环中调用 scheduler.step() 驱动 continuous batching。vllm/worker/worker.py— Worker 接收调度结果,执行模型 forward。
相关概念
- paged-attention — 使序列动态加入/移除成为可能
- kv-cache — 调度器管理的核心资源
- chunked-prefill — 控制 prefill 阶段对 batch 资源的占用
- speculative-decoding — 与 continuous batching 结合提升解码效率