大模型推理的两个阶段:Prefill(预填充)和 Decode(解码)
大模型推理的两个阶段:Prefill(预填充)和 Decode(解码)
flyfish
Prefill 阶段:是模型对用户输入的完整 Prompt 进行一次性编码、计算并生成首个 token(词元)的过程,属于批量并行计算阶段。
Prefill 阶段的特征是一次性处理整个 Prompt,所有计算并行完成,耗时主要由 Prompt 的长度决定,与生成的 token 数量无关。
Decode 阶段:是模型以 Prefill 阶段的输出为基础,逐一生成后续每一个 token的过程,属于串行迭代计算阶段
Decode 阶段的特征是串行迭代,每次计算仅针对一个 token,总耗时由生成的 token 数量决定
差异
| 维度 | Prefill(预填充) | Decode(解码) |
|---|---|---|
| 计算方式 | 批量并行计算,一次性处理整个Prompt | 串行增量计算,每次仅处理一个token |
| 注意力范围 | 仅针对原始Prompt序列,无生成token | 原始Prompt+所有已生成的token |
| K/V Cache使用 | 生成并缓存Prompt的K/V向量,为首次构建 | 调用已有缓存,仅追加新token的K/V向量 |
| 输出结果 | 首个生成token+完整的Prompt K/V Cache | 单个新token,持续追加至生成序列 |
| 耗时决定因素 | 原始Prompt的长度 | 生成的token数量 |

🟠 Prefill(预填充)阶段:橙色流程
- 输入与并行计算
模型接收完整的提示词序列济、南、的、冬,对这4个token做并行计算(橙色的4个模块同时处理),为每个token生成对应的KV vectors(键值向量)。 - 缓存填充(fill动作)
这些计算好的KV向量会被缓存(cached),prefill的含义:在生成输出token之前,提前把KV Cache填充好。 - 生成首个输出token
基于缓存的提示词KV向量,模型计算并生成第一个输出token天,这是Prefill阶段的最终输出,也是Decode阶段的起点。
🔵 Decode(解码)阶段:蓝色流程
- 串行迭代生成
每个Decode步骤仅处理一个token,且是串行执行的(先生成天,再生成是,依此类推),图中蓝色的两个模块代表两次Decode迭代。 - 缓存复用与增量追加
生成新token时,模型会复用Prefill阶段缓存的所有提示词KV向量,仅需计算当前新token的KV向量,并将其增量追加到缓存中。
比如生成是时,模型会复用提示词(济、南、的、冬)和上一步生成的天的KV向量,无需重新计算提示词的KV向量。 - 持续生成直到终止
这个串行迭代过程会一直持续,直到生成终止符或达到最大生成长度。
prefill = pre + fill
pre- 是英文前缀,意思是预先、提前;
fill 在这里的动作是填充,特指填充KV Cache(键值缓存)。
prefill的字面含义就是:在生成输出Token之前,预先把KV Cache填充好。
fill对应的就是Prefill阶段中填充KV Cache的动作,具体发生在模型处理输入提示词(Prompt)的过程中:
-
Prefill阶段的fill动作
当模型接收完整的Prompt(比如你的问题或聊天历史)时,会并行计算所有PromptToken的Key(键)和Value(值)向量,然后将这些向量按顺序填充到KV Cache中。这个把K/V向量写入缓存的过程,就是fill。 -
叫pre-fill的原因
一个发生在 Decode 之前的 fill,因为这个填充缓存的动作是在解码阶段(生成输出Token)之前完成的。它为后续的Decode阶段预先准备好了历史上下文的缓存,避免生成每个新Token时都重复计算Prompt的K/V向量。 -
Decode阶段的非fill特征
在Decode阶段,模型不会重新fill整个缓存,而是增量追加新生成Token的K/V向量到已有的KV Cache中。这更像是追加写入,而非预先填充,所以Decode阶段不承担fill的职责
时间的消耗

-
用户输入与Token化(Tokenization)
用户输入的自然语言文本会被切分成模型能理解的最小单位——Token,这是推理的第一步,把人类语言转成模型的输入格式。 -
Prefill(预填充)阶段
模型对所有输入Token做并行计算,一次性处理完整的输入序列,生成第一个输出TokenT0,并将输入Token的KV vectors(键值向量)填充到KV Cache中。这是推理中最耗时的阶段之一,决定了首Token生成时间(TTFT)。为后续解码阶段准备好上下文缓存,避免重复计算。 -
Decode(解码)阶段
模型基于Prefill阶段的缓存,串行迭代生成后续Token(T1→T2→T3…),每一个新Token的生成都依赖前面所有已生成的Token。 Inter Token Latency(ITL,Token间延迟) 是两个连续Token生成的时间间隔(如T0到T1的延迟),这直接决定了用户看到的输出流畅度——ITL越低,文本输出越像“实时打字”,体验越流畅。这是一个自回归过程,每一步都依赖前一步的结果,因此无法并行加速,是推理的串行瓶颈。 -
逆Token化(Detokenization)
每个生成的Token(T0、T1、T2、T3)都会被即时转回自然语言文本,而不是等所有Token生成完再转换。 -
最终输出(Final Output Token)
所有Token生成并逆Token化后,得到完整的自然语言输出,流程结束。
有无KV Cache(键值缓存)的比较

Without KV Cache(无键值缓存)的情况
没有缓存优化的原生推理流程,问题是重复计算
- 计算流程
每生成一个新Token,模型都要对所有历史Token(包括原始提示词和已生成的Token)重新计算Key(键)和Value(值)向量。图中蓝色的Token块重复出现,Slower repeated processing(更慢的重复处理),说明每次新Token生成都要从头再算一遍所有历史序列的注意力交互。
With KV Cache(有键值缓存)的情况
引入KV Cache后的优化流程
- 计算流程
整个流程分为推理的Prefill(预填充)和Decode(解码)阶段:
Prefill阶段:处理原始提示词的所有Token时,一次性计算并缓存每个Token的Key-Value pairs(键值对),存储在右侧的蓝色缓存块中;
Decode阶段:生成新Token时,仅需要计算当前新Token的Query(查询)向量,然后直接复用缓存中所有历史Token的Key、Value向量,无需重复计算历史序列的K、V。Only new computations(仅计算新内容)和Only new token computation(仅计算新Token),绿色的Token块是增量处理,箭头循环指向缓存,表示Prefill(预填充)和Decode(解码)复用缓存 + 增量计算的逻辑。
更多推荐
所有评论(0)