@_avichawla: LLM推理中的预填充与解码。你是否注意到,LLM的第一个令牌总是需要片刻才出现…
摘要
解释LLM推理的两个阶段——预填充和解码,详细说明GPU瓶颈如何从预填充时的计算受限转变为解码时的内存受限,以及KV缓存的重要性。
查看缓存全文
缓存时间: 2026/06/29 10:26
LLM推理中的预填充与解码。
你是否注意到,LLM的第一个token总是需要一点时间才能出现?但后续的token却流畅地流出?
这种停顿并非网络延迟,而是LLM根本工作方式的结构性特性。
推理分为两个阶段,它们共享相同的模型和代码路径,但每个阶段的工作负载截然不同,瓶颈也不同。
预填充阶段在你提交提示时开始。
模型在一次并行过程中处理所有输入token,一次性计算它们的Q、K和V。
注意力以矩阵乘法运行,GPU芯片以高利用率运行,进行快速计算。
预填充是计算密集型的,其衡量指标是首token耗时(TTFT)。
解码阶段在第一个token输出后开始。
为了生成下一个token,模型仅针对这一个新token计算Q、K和V,因为之前的所有内容都已被缓存。
因此,模型每次前向传播循环处理一个token,将一个查询与缓存的键相乘,而不是完整的矩阵。由于计算量很小,这使得推理速度很快。
但GPU仍然必须从内存中加载每个权重和每个缓存条目来执行这个微小的计算,因此瓶颈发生转变,计算单元空闲,而内存带宽成为限制因素。
解码是内存密集型的,其衡量指标是token间延迟(ITL)。
GPU利用率在预填充期间达到峰值,在解码期间急剧下降,因为在第二阶段,瓶颈是内存而不是计算。
向流式传输缓慢的模型投入更多计算往往无济于事,因为对于内存密集型工作负载的解决方案是更快的内存或更小的缓存,而不是更多的FLOPs。
长上下文会显得异常缓慢,因为KV缓存随着每个token而增长,并且每个解码步骤都必须读取所有缓存。
但维护缓存是一个重要的优化,因为它使解码变得可行。
- 如果没有KV缓存,每个新token都会强制对整个增长序列重新计算注意力。
- 使用KV缓存,缓存会在预填充期间一次性构建,然后每个解码步骤恰好增加一个条目,现有条目被重用而不是重新计算。
缓存位于GPU内存中,并随序列长度线性增长,因此一个13B的模型每个token大约需要1 MB,这意味着4K的上下文仅缓存就消耗4 GB的显存。
整个领域现在都在围绕这一限制进行优化,采用量化缓存、滑动窗口、分组查询注意力和PagedAttention,而DeepSeek的V4系列更进一步,重新设计了注意力机制本身,使缓存从一开始就保持较小。
实际的经验是,当有人说他们的模型很慢时,第一个问题是它是启动缓慢还是流式传输缓慢。
启动缓慢意味着预填充和计算瓶颈,而流式传输缓慢意味着解码和内存瓶颈。
下面的文章是一本从基本原理出发的LLM推理指南,全面介绍了从提示到流式响应之间的所有内容,涵盖tokenization、嵌入、注意力、预填充与解码的分离、KV缓存和量化。
它将让您对推理的实际工作机制有一个完整的认知模型。
请在下方阅读。
相似文章
@_avichawla: 一个棘手的LLM面试题:你在vLLM上部署推理模型,长序列时GPU内存总是不够用。于是你加入KV缓存压缩,驱逐了90%的缓存token。显存占用依旧,GPU仍然内存不足。为什么?
解释了为什么在vLLM上部署推理模型时,驱逐90%的KV缓存token无法释放GPU内存,原因是分页注意力碎片化。同时介绍了NVIDIA的TriAttention解决方案,可实现2.5倍加速和10.7倍内存缩减。
KV缓存正成为推理的内存层级结构
文章讨论了KV缓存如何演变为LLM推理的内存层级结构,优化解码过程中的内存管理。
@divaagurlxw: 如果我想让LLM响应低于一秒,我会研究的推理优化方法:1.KV-Caching 2.Speculative Decoding 3.FlashAtte…
一条推文列出了16种推理优化技术,用于实现低于一秒的LLM响应,包括KV缓存、推测解码、FlashAttention和各种并行化方法。
@pallavishekhar_: 大语言模型中的 KV Cache,阅读链接:https://outcomeschool.com/blog/kv-cache-in-llms…
本文解释了大语言模型中 KV Cache 的概念,详细阐述了其通过存储和复用键值对以避免推理过程中的冗余计算,从而优化文本生成的原理。
@CyrusHakha:我们在大规模服务LLM的客户中反复看到一种模式:预填充-解码分离常被当作一根魔杖……
基于客户模式,讨论大规模LLM服务中预填充-解码分离的微妙现实,并在AMD + vLLM上进行了验证。