内容提要
LLM长上下文推理成本高,主因是KV缓存随token数线性增长,解码时需逐token读取全部缓存,受内存带宽限制。优化方法包括:分组查询注意力、潜在注意力减少每token存储;量化降低存储精度;驱逐机制减少token数;分页注意力和前缀缓存提升内存管理效率。各方法在质量、工程复杂度间权衡,适合长上下文和高并发场景。
延伸解读
KV缓存是长上下文成本的核心
文章指出,长上下文推理的高成本主要来自KV缓存,而非模型本身。KV缓存存储每个token的键值向量,随上下文长度线性增长。例如,70B模型在128K上下文时缓存约40GB,占满80GB显卡的一半。解码阶段需逐token读取全部缓存,受内存带宽限制,导致生成速度慢。理解这一点有助于定位性能瓶颈,而非盲目增加算力。
优化技术的权衡:从架构到服务
文章介绍了多种优化方法,各有取舍:分组查询注意力(GQA)和潜在注意力(MLA)需在训练时确定,GQA几乎无损,MLA节省更多但工程复杂;量化(如8位)几乎无损,4位可能影响检索任务;驱逐机制(如窗口+锚点)可能丢失关键信息;分页注意力和前缀缓存几乎不影响质量,但前缀缓存有隐私侧信道风险。选择需根据工作负载(如长文档检索避免驱逐)和工程能力。
分页注意力与前缀缓存的实际收益
分页注意力借鉴操作系统内存分页,将缓存分块按需分配,可将碎片化浪费从60-80%降至4%以下,吞吐量提升2-3倍。前缀缓存让相同前缀的请求共享缓存块,OpenAI和Anthropic报告成本与延迟降低50-90%,适合代理循环等重复前缀场景。但共享缓存可能引发时序侧信道,需注意隐私风险。
Q&A
为什么大语言模型处理长提示词时内存成本会急剧上升?
因为模型在生成每个新token时,需要读取KV缓存中所有之前token的键和值向量。KV缓存的大小随输入token数线性增长,因此上下文越长,每次解码需要读取的数据量越大,导致内存带宽成为瓶颈,从而增加延迟和成本。
KV缓存是什么?为什么不能通过重新计算来避免存储?
KV缓存是存储每个输入token的键和值向量的内存块,用于加速注意力计算。如果不缓存,模型在每一步都需要重新计算所有之前token的键和值,这会导致计算量随上下文长度线性增长,效率极低。缓存避免了重复计算,但引入了内存占用和读取开销。
LLM生成回答时,预填充和解码两个阶段分别受什么限制?
预填充阶段处理整个输入,并行计算所有token的键和值,受计算能力限制,称为计算密集型。解码阶段逐token生成,每个token都需要读取整个KV缓存,受内存带宽限制,称为内存密集型。长上下文的成本主要来自解码阶段反复读取缓存。
有哪些优化方法可以减少KV缓存的内存占用?
主要方法包括:分组查询注意力(GQA)和潜在注意力(MLA)减少每个token的存储量;量化降低存储精度(如从16位降到8位或4位);驱逐机制减少缓存中的token数;分页注意力和前缀缓存优化内存管理和共享。
分组查询注意力(GQA)是如何减少KV缓存大小的?
GQA让多个查询头共享一个键值头,从而减少存储的键值对数量。例如,Llama 2/3 70B模型将键值头从64个减少到8个,缓存大小约为原来的八分之一。
量化KV缓存到8位或4位会带来什么质量影响?
8位量化通常精度损失小于1%,对大多数任务影响不大。4位量化节省更多内存,但在多针检索等复杂任务上会出现可测量的性能下降。
驱逐机制(eviction)有哪些风险?
驱逐机制通过丢弃不重要的token来减少缓存大小,但风险在于被丢弃的token可能正是后续生成需要的,导致信息丢失,尤其在检索任务中表现明显。
分页注意力和前缀缓存如何提升内存利用效率?
分页注意力将缓存分成小块,按需分配,减少内存碎片,可将缓存浪费从60-80%降至4%以下,吞吐量提升2-3倍。前缀缓存允许共享相同前缀的请求复用缓存块,显著降低成本和延迟,OpenAI和Anthropic报告成本降低50-90%。
这些优化方法在什么场景下最值得采用?
在长上下文和高并发场景下,KV缓存成为主要成本,这些优化方法收益最大。例如,代理循环频繁复用系统提示词时适合前缀缓存,而长文档检索任务应避免使用驱逐机制。