Skip to content

将 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.pyModelRunner 在 prepare inputs 时区分 prefill chunk 和 decode token。
  • vllm/config.pySchedulerConfigchunked_prefill_enabledmax_num_batched_tokens 参数。
  • vllm/attention/backends/ — 各注意力后端需处理跨 chunk 的 partial attention。

相关概念