大模型推理的两个阶段: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(预填充)阶段:橙色流程

  1. 输入与并行计算
    模型接收完整的提示词序列 济、南、的、冬,对这4个token做并行计算(橙色的4个模块同时处理),为每个token生成对应的 KV vectors(键值向量)。
  2. 缓存填充(fill动作)
    这些计算好的KV向量会被缓存(cached),prefill的含义:在生成输出token之前,提前把KV Cache填充好。
  3. 生成首个输出token
    基于缓存的提示词KV向量,模型计算并生成第一个输出token ,这是Prefill阶段的最终输出,也是Decode阶段的起点。

🔵 Decode(解码)阶段:蓝色流程

  1. 串行迭代生成
    每个Decode步骤仅处理一个token,且是串行执行的(先生成 ,再生成 ,依此类推),图中蓝色的两个模块代表两次Decode迭代。
  2. 缓存复用与增量追加
    生成新token时,模型会复用Prefill阶段缓存的所有提示词KV向量,仅需计算当前新token的KV向量,并将其增量追加到缓存中
    比如生成 时,模型会复用提示词(济、南、的、冬)和上一步生成的 的KV向量,无需重新计算提示词的KV向量。
  3. 持续生成直到终止
    这个串行迭代过程会一直持续,直到生成终止符或达到最大生成长度。

prefill = pre + fill
pre- 是英文前缀,意思是预先、提前;
fill 在这里的动作是填充,特指填充KV Cache(键值缓存)。
prefill的字面含义就是:在生成输出Token之前,预先把KV Cache填充好。

fill对应的就是Prefill阶段中填充KV Cache的动作,具体发生在模型处理输入提示词(Prompt)的过程中:

  1. Prefill阶段的fill动作
    当模型接收完整的Prompt(比如你的问题或聊天历史)时,会并行计算所有PromptToken的 Key(键)和 Value(值)向量,然后将这些向量按顺序填充到KV Cache中。这个把K/V向量写入缓存的过程,就是fill。

  2. 叫pre-fill的原因
    一个发生在 Decode 之前的 fill,因为这个填充缓存的动作是在解码阶段(生成输出Token)之前完成的。它为后续的Decode阶段预先准备好了历史上下文的缓存,避免生成每个新Token时都重复计算Prompt的K/V向量。

  3. Decode阶段的非fill特征
    在Decode阶段,模型不会重新fill整个缓存,而是增量追加新生成Token的K/V向量到已有的KV Cache中。这更像是追加写入,而非预先填充,所以Decode阶段不承担fill的职责

时间的消耗

在这里插入图片描述

  1. 用户输入与Token化(Tokenization)
    用户输入的自然语言文本会被切分成模型能理解的最小单位——Token,这是推理的第一步,把人类语言转成模型的输入格式。

  2. Prefill(预填充)阶段
    模型对所有输入Token做并行计算,一次性处理完整的输入序列,生成第一个输出Token T0,并将输入Token的 KV vectors(键值向量)填充到KV Cache中。这是推理中最耗时的阶段之一,决定了首Token生成时间(TTFT)。为后续解码阶段准备好上下文缓存,避免重复计算。

  3. Decode(解码)阶段
    模型基于Prefill阶段的缓存,串行迭代生成后续Token(T1T2T3…),每一个新Token的生成都依赖前面所有已生成的Token。 Inter Token Latency(ITL,Token间延迟) 是两个连续Token生成的时间间隔(如 T0T1 的延迟),这直接决定了用户看到的输出流畅度——ITL越低,文本输出越像“实时打字”,体验越流畅。这是一个自回归过程,每一步都依赖前一步的结果,因此无法并行加速,是推理的串行瓶颈。

  4. 逆Token化(Detokenization)
    每个生成的Token(T0T1T2T3)都会被即时转回自然语言文本,而不是等所有Token生成完再转换。

  5. 最终输出(Final Output Token)
    所有Token生成并逆Token化后,得到完整的自然语言输出,流程结束。

有无KV Cache(键值缓存)的比较

在这里插入图片描述

Without KV Cache(无键值缓存)的情况

没有缓存优化的原生推理流程,问题是重复计算

  1. 计算流程
    每生成一个新Token,模型都要对所有历史Token(包括原始提示词和已生成的Token)重新计算 Key(键)和 Value(值)向量。图中蓝色的 Token 块重复出现,Slower repeated processing(更慢的重复处理),说明每次新Token生成都要从头再算一遍所有历史序列的注意力交互。

With KV Cache(有键值缓存)的情况

引入KV Cache后的优化流程

  1. 计算流程
    整个流程分为推理的 Prefill(预填充)和 Decode(解码)阶段:
    Prefill阶段:处理原始提示词的所有Token时,一次性计算并缓存每个Token的 Key-Value pairs(键值对),存储在右侧的蓝色缓存块中;
    Decode阶段:生成新Token时,仅需要计算当前新Token的 Query(查询)向量,然后直接复用缓存中所有历史Token的 KeyValue 向量,无需重复计算历史序列的K、V。Only new computations(仅计算新内容)和Only new token computation(仅计算新Token),绿色的 Token 块是增量处理,箭头循环指向缓存,表示Prefill(预填充)和 Decode(解码)复用缓存 + 增量计算的逻辑。

更多推荐