连续批处理调度
Continuous Batching & Scheduling
解决 LLM 推理中静态批处理导致 GPU 利用率低的问题,通过动态调度实现序列级别的连续批处理
子问题
1.Prefill/Decode 阶段分离
2.序列抢占与重新排队
3.动态 batch 组装约束
4.EOS 检测与序列完成
5.Prefix Caching 与抢占后重调度的交互:被抢占序列重新 prefill 时如何复用已缓存 block
6.跨进程序列序列化优化:decode 阶段只传 last_token 减少 IPC 开销
各项目的解法1 solutions
Signals
横向对比
| 维度 | nano-vllm |
|---|---|
| 调度策略 | Prefill 绝对优先,waiting 非空时不做 decode |
| 批组装约束 | max_num_seqs + max_num_batched_tokens 双约束门控 |
| 抢占机制 | LIFO 抢占 running 队尾序列,deallocate 全部 blocks |
| Prefix Caching | xxhash 链式 block 级内容寻址,allocate 时自动命中 |
| 状态机复杂度 | 3 态(WAITING/RUNNING/FINISHED),无 SWAPPED 状态 |
| 代码规模 | Scheduler 72 行,极简教学级实现 |
最佳实践
1.Prefill 优先调度以降低首 token 延迟
2.内存不足时抢占最后加入的序列(LIFO)
3.被抢占序列 appendleft 到 waiting 头部,确保优先重新调度
4.can_append 精确判断:仅在 token 数 mod block_size == 1 时需要新 block
5.序列 __getstate__ 优化:decode 阶段不传完整 token_ids,只传 last_token