大模型再推理时分哪两个阶段,每个阶段的特点是什么呢
一、 预填充阶段 (Prefill Phase / Prompt Processing)
-
这个阶段做什么?
-
预填充阶段是处理用户输入的提示(Prompt)的过程。 例如,如果用户输入了500个字的提示,模型需要一次性地、并行地计算这500个词(Token)的注意力(Attention)和隐藏状态(Hidden States)。
-
这个阶段的最终目的是为生成第一个新的Token做好准备,并将输入提示的键(Key)和值(Value)计算出来,存入一个称为“KV缓存(KV Cache)”的缓存中。
-
-
特点是什么?
-
并行计算:由于输入的提示是已知的,模型可以并行处理所有输入的Token,充分利用GPU的并行计算能力。 这使得这个阶段的计算强度非常高。
-
计算密集型(Compute-Bound):这个阶段的大部分时间都花在大量的矩阵乘法上,因此它受到GPU计算单元(如Tensor Cores)性能的限制。
-
对长输入敏感:输入的提示越长,这个阶段的计算量就越大,耗时也越长。
-
不使用KV缓存(而是生成它):此阶段负责计算并填充KV缓存,为后续的解码阶段服务。
-
二、 解码阶段 (Decoding Phase / Token Generation)
-
这个阶段做什么?
-
解码阶段是逐个生成新Token的过程。 从预填充阶段生成第一个Token开始,每生成一个新Token,这个新生成的Token就会被加到输入序列的末尾,然后模型再根据这个更新后的序列来预测下一个Token。
-
这个过程会一直循环,直到生成一个结束符(End-of-Sequence token)或达到预设的最大长度。
-
-
特点是什么?
-
串行(自回归)计算:这个过程是高度串行的,因为要生成第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耗时相对固定,总耗时与生成长度成正比 |
更多推荐

所有评论(0)