首页/AI/大模型部署与运维速查/chunked prefill:长输入分块执行
推理参数与优化50 条

chunked prefill:长输入分块执行

把长输入的 prefill 切块,与 decode 步骤交错执行:避免长请求独占一步、阻塞其他请求的解码,降低尾延迟;由 enable_chunked_prefill 与 max_num_batched_tokens 等参数控制。

分块预填充

chunked prefill 把长输入的 prefill 阶段切成若干块,与 decode 步骤交错执行。这样单个长请求不会独占一步、把其他请求的解码全堵住,尾延迟改善明显;代价是调度更碎,块越小调度开销占比越高。由 enable_chunked_prefill 与 max-num-batched-tokens 等参数控制,各版本默认行为不同。

基本信息

解决什么长输入独占导致的尾延迟抬升
主要参数enable_chunked_prefill、max-num-batched-tokens
调小块的收益改善 P99 与请求公平性
调小块的代价调度开销占比上升
默认值随版本变化,需查对应文档

典型使用场景

  • 交互式服务:输入长度参差不齐,要保证短请求不被长请求挡住
  • RAG 场景输入普遍很长,需要控制单步工作量
  • 混合负载(长摘要与短问答)共用同一实例
  • 为 P99 做优化时的首选拨杆之一
  • 长文档问答与短对话混跑时,靠它维持请求之间的公平

启用与调块

启用与调块
vllm serve <模型路径> --enable-chunked-prefill --max-num-batched-tokens 8192
# 各版本默认行为不同,以所用版本文档为准
# 压测对照:同一并发下比较 TTFT、P99 与总吞吐

相关参数分工

参数作用调小的效果
enable_chunked_prefill开关分块预填充关闭后长请求独占一步
max-num-batched-tokens单步处理 token 上限P99 改善、调度开销上升
max-num-seqs在批序列数上限与分块共同决定并发形态
分块大小是延迟与吞吐之间的拨杆:块调小改善尾延迟,但调度开销占比上升,需要按自己的流量结构压测取舍。
参数是否生效要看指标而不是文档:对比开关前后的 TTFT 与 P99,确认改动真的落在服务上,再写进配置基线。
短输入为主的场景收益有限:prefill 本来就占不到多少时间,开启后反而多一层调度开销,先看输入长度分布再决定。
调法上建议按输入长度档位分别验证:短输入档位可能毫无变化,长输入档位才有明显收益,用一个平均值做结论容易误判。

易错点

  • 只奔着吞吐调大:长输入排队把 P99 拉高,交互场景体感明显变差
  • 把块调得极小:调度开销吃掉收益,总吞吐反而下降
  • 忽略版本默认值:以为没开、实际已启用,或反之,对照实验结论失效
  • 只在平均延迟上看效果:这项优化的目标是尾延迟,压测必须看 P95/P99
  • 把它当成显存优化手段:它改善的是调度公平与尾延迟,并不降低显存占用
  • 期待单请求更快:长请求的 TTFT 反而可能变长,因为首步只处理了一部分输入

数据来源与参考

  • vLLM 官方文档:优化与调优(docs.vllm.ai)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌