首页/AI/大模型部署与运维速查/prefill 与 decode:两阶段性能特征
推理参数与优化50 条

prefill 与 decode:两阶段性能特征

推理分两阶段:prefill 一次并行处理整段输入(计算密集,决定首字延迟),decode 逐 token 生成(访存与带宽密集,决定每 token 延迟);两阶段特征不同,优化手段也不同。

prefill 与 decode 是什么

自回归推理分两个阶段:prefill 一次并行处理整段输入,属于算力密集;decode 逐 token 生成,每一步都要把权重与 KV 读一遍,属于显存带宽密集。prefill 的耗时决定首 token 何时出现(TTFT),decode 的步时决定后面出字有多快(TPOT)。两阶段资源特征不同,优化手段也不同,混在一起谈「推理慢」往往得不出可执行的结论。

基本信息

prefill 处理方式整段输入并行计算,可用大 batch 吃满算力
decode 处理方式逐 token 串行生成,受权重与 KV 读取速度制约
分界点第一个输出 token 产生之前是 prefill,之后进入 decode
对应指标prefill 影响 TTFT,decode 影响 TPOT 与生成速率
输入的算力开销随输入长度增长,注意力部分是非线性增长

典型使用场景

  • 长输入短输出(文档问答、摘要、分类):首字延迟由 prefill 主导,优化重点在前缀缓存与输入长度
  • 短输入长输出(写文章、代码补全):总时长由 decode 主导,优化重点在量化与解码效率
  • 容量规划:两类请求分开估算,避免把长短请求混成一个平均值
  • 混部调度:长输入的 prefill 会占用算力,需要避免它长时间挡住其他请求的解码
  • 压测设计:按输入长度与输出长度分档造数据,才能看出瓶颈落在哪一段

两阶段的观测入口

两阶段的观测入口
# 引擎侧指标:分别对应两阶段(指标名随版本微调,先看实际输出)
curl -s http://127.0.0.1:8000/metrics | grep -E 'time_to_first_token|time_per_output_token'

# 现场对照:同一模型分别跑「1K 输入 + 短输出」与「短输入 + 1K 输出」
# 前者看 TTFT,后者看总时长,两者结论不会互相印证

# 若 TTFT 高而 TPOT 正常:问题在输入侧(排队或 prefill),不要在解码上使劲

两阶段对照

阶段处理方式资源瓶颈对应指标
prefill整段输入并行计算算力(矩阵计算)TTFT 首字延迟
decode逐 token 串行生成显存带宽(读权重与 KV)TPOT 每 token 延迟
混批调度两阶段交错执行调度策略与显存两者同时受影响
分块 prefill(chunked prefill)把长输入切成小块,与解码交错执行,减少长前缀请求对其他请求解码的阻塞;具体开关与默认值随推理框架版本演进,以版本文档为准。
压测时按阶段看指标:长输入场景只看总时长会误判成「模型慢」,实际可能只是 prefill 在排队前吃了算力。

易错点

  • 用一个平均延迟覆盖所有请求:长输入与长输出表现差异大,混合平均会把真实瓶颈抹平
  • 只做量化优化 decode,却抱怨首字慢:TTFT 由 prefill 与排队决定,加量化对它帮助有限
  • 让超长输入一次性灌满窗口:prefill 抢占算力,同批其他请求的 TTFT 明显抖动
  • 按短输入压测结论规划长上下文容量:输入变长后算力开销非线性上升,实例数会明显不足

数据来源与参考

  • vLLM 官方文档:性能与调优(docs.vllm.ai)
  • NVIDIA 开发者博客:LLM 推理(developer.nvidia.com/blog)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌