Appearance
将 prompt 的 prefill 计算拆分为多个 chunk 分步执行,避免长 prompt 独占 GPU 导致其他序列停滞。
为什么需要 Chunked Prefill
无 chunking 时,一个长 prompt 的 prefill 会独占整个 iteration,期间所有 decode 请求被阻塞,造成延迟飙升(TTFT 增大)。Chunked Prefill 将长 prompt 分成固定大小的 chunk,每次 iteration 只处理一个 chunk 并穿插 decode step,使新生成的 token 延迟不受 prompt 长度影响。
核心原理
- Chunk 大小:由
max_num_batched_tokens控制,每个 iteration 最多处理这么多 token 的 prefill。 - 混合调度:一个 iteration 可同时包含 prefill chunk 和 decode token,兼顾首 token 延迟与吞吐。
- KV Cache 增量写入:每个 chunk 的 KV 结果增量写入对应 sequence 的 KV Cache block。
- Attention Mask:chunk 内部使用 causal mask,跨 chunk 的 attention 通过已缓存的 KV 实现。
在源码中的实现
vllm/core/scheduler.py— Scheduler 在schedule()中将长 prompt 拆分为 chunk,每次调度一个 chunk。vllm/worker/model_runner.py—ModelRunner在 prepare inputs 时区分 prefill chunk 和 decode token。vllm/config.py—SchedulerConfig的chunked_prefill_enabled和max_num_batched_tokens参数。vllm/attention/backends/— 各注意力后端需处理跨 chunk 的 partial attention。
相关概念
- continuous-batching — Chunked Prefill 是 continuous batching 调度策略的关键优化
- kv-cache — 每个 chunk 的结果增量写入 KV Cache
- paged-attention — 增量分配 block 以支持分块 prefill
- prefix-caching — 缓存已 prefill 的前缀以避免重复计算