一、 预填充阶段 (Prefill Phase / Prompt Processing)
  1. 这个阶段做什么?

    • 预填充阶段是处理用户输入的提示(Prompt)的过程。 例如,如果用户输入了500个字的提示,模型需要一次性地、并行地计算这500个词(Token)的注意力(Attention)和隐藏状态(Hidden States)。

    • 这个阶段的最终目的是为生成第一个新的Token做好准备,并将输入提示的键(Key)和值(Value)计算出来,存入一个称为“KV缓存(KV Cache)”的缓存中。

  2. 特点是什么?

    • 并行计算:由于输入的提示是已知的,模型可以并行处理所有输入的Token,充分利用GPU的并行计算能力。 这使得这个阶段的计算强度非常高。

    • 计算密集型(Compute-Bound):这个阶段的大部分时间都花在大量的矩阵乘法上,因此它受到GPU计算单元(如Tensor Cores)性能的限制。

    • 对长输入敏感:输入的提示越长,这个阶段的计算量就越大,耗时也越长。

    • 不使用KV缓存(而是生成它):此阶段负责计算并填充KV缓存,为后续的解码阶段服务。

二、 解码阶段 (Decoding Phase / Token Generation)
  1. 这个阶段做什么?

    • 解码阶段是逐个生成新Token的过程。 从预填充阶段生成第一个Token开始,每生成一个新Token,这个新生成的Token就会被加到输入序列的末尾,然后模型再根据这个更新后的序列来预测下一个Token。

    • 这个过程会一直循环,直到生成一个结束符(End-of-Sequence token)或达到预设的最大长度。

  2. 特点是什么?

    • 串行(自回归)计算:这个过程是高度串行的,因为要生成第N个Token,必须先等待第N-1个Token生成完毕。 这使得GPU的并行计算能力无法被充分利用。

    • 访存密集型(Memory-Bound):在每一步解码时,模型需要从GPU内存中读取整个KV缓存(包含了所有前面Token的信息),然后只进行一次相对较小的计算(新Token与缓存的注意力计算)。 因此,性能瓶颈在于GPU内存的带宽,而不是计算单元的速度。

    • 严重依赖KV缓存:这个阶段会大量且频繁地读写KV缓存。KV缓存的大小和访问速度直接决定了解码的效率。这也是为什么量化KV缓存等优化技术非常重要。

    • 生成速度较慢:由于其串行和访存密集型的特性,解码阶段通常比预填充阶段要慢得多,生成每个Token都需要固定的时间。我们常说的“每秒生成多少个Token”(Tokens/sec)这个指标,衡量的就是解码阶段的性能。

总结与对比
特征 预填充 (Prefill) 阶段 解码 (Decoding) 阶段
处理对象 整个用户输入提示 (Prompt) 逐个生成新的词 (Token)
计算模式 并行计算,一次性处理 串行(自回归)计算,逐个处理
性能瓶颈 计算密集型 (Compute-Bound) 访存密集型 (Memory-Bound)
资源利用 充分利用GPU的计算单元 瓶颈在于GPU的内存带宽
KV缓存 生成并写入KV缓存 读取并更新KV缓存
耗时 耗时与输入长度成正比,但通常是一次性的 每个Token耗时相对固定,总耗时与生成长度成正比
Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐