长上下文记忆与KV-Cache压缩:原理、边界与动态策略
目标导向:快速掌握 Hierarchical KV-Cache、StreamingLLM、LoRA-FA 三类内存管理策略的核心原理;推导注意力稀疏化后的信息损失上界;建立动态驱逐策略的理论框架。全文以中文成段讲述为主,仅在必要处给出关键公式。
1. 问题背景与核心挑战
1.1 长上下文推理的内存瓶颈
自回归大语言模型(LLM)在解码阶段需缓存历史 token 的 Key 与 Value 张量,即 KV-Cache。其内存占用随序列长度 TTT 线性增长:
MemKV=2⋅nlayer⋅nhead⋅dhead⋅T⋅byteselem \text{Mem}_{\text{KV}} = 2 \cdot n_{\text{layer}} \cdot n_{\text{head}} \cdot d_{\text{head}} \cdot T \cdot \text{bytes}_{\text{elem}} MemKV=2⋅nlayer⋅nhead⋅dhead⋅T⋅byteselem
以 LLaMA2-7B 为例,处理 100K tokens 需超过 50 GB 显存,远超单卡容量。因此,KV-Cache 压缩成为长上下文部署的首要瓶颈。
1.2 “Lost in the Middle” 现象
Liu 等人在 2023 年的研究中指出,LLM 对 prompt 中不同位置信息的利用能力呈 U 型分布:首尾信息利用充分,中段信息严重衰减。该现象被称为 “Lost in the Middle”,其本质与注意力分布的位置偏置相关——模型倾向于将注意力权重分配给序列两端,导致中段 token 的 KV 对在语义传递中被弱化。这一发现为后续基于注意力的动态驱逐策略提供了关键依据:既然中段信息天然易被忽略,驱逐策略应优先保护高注意力权重的 token,而非简单按时间顺序淘汰。
2. 总体架构:三层模型与系统分解
长上下文推理系统的内存管理可抽象为三层架构,每层承担不同的压缩与调度职责。
物理层负责原始张量的存储优化,包括量化(4-bit/8-bit)、低秩分解与分层内存分配。信号层处理注意力机制中的动态稀疏化、KV 驱逐决策与位置编码重映射。应用层面向多轮对话、流式生成与多任务 LoRA 切换,提供接口封装。三层之间通过标准 KV-Cache 张量接口交互,确保策略可插拔。
3. 知识图谱:核心概念层级
4. Hierarchical KV-Cache:分层压缩框架
4.1 分层动机
不同层、不同头对历史 token 的依赖程度存在显著差异。Elhoushi 等人的研究表明:知识型问答任务仅需前几层即可达到高准确率,而复杂推理(数学、代码)需要更深层的参与。这意味着统一的缓存预算分配是次优的,应按层级动态调整保留 token 数量。
4.2 三层分级结构
Hierarchical KV-Cache 在三个维度实施分级:
| 维度 | 分级依据 | 策略 |
|---|---|---|
| 层间 | 任务类型与层深度 | 浅层多保留,深层少保留(金字塔型)或波浪型 |
| 头间 | 注意力集中度 | 高集中头多保留,低集中头少保留 |
| Token 间 | 累积注意力分数 | 保留 Heavy Hitter,驱逐尾部 token |
4.3 典型实现:PyramidKV 与 DynamicKV
PyramidKV 采用固定金字塔模式:浅层保留较多 token,深层保留较少。其假设信息随层数增加而浓缩,深层只需关键摘要即可。
DynamicKV 则进一步引入任务自适应机制。通过离线分析不同任务在各层的 token 保留率分布,发现:
- 合成任务与摘要任务呈金字塔型;
- 代码完成呈波浪型(中间层保留率出现峰值)。
DynamicKV 在推理前根据任务类型加载对应的层间预算曲线,实现更精细的内存节省。
5. StreamingLLM:Attention Sinks 与流式推理
5.1 核心发现:Attention Sink 现象
Xiao 等人在 2023 年的研究中发现,自回归 Transformer 存在一个惊人的训练涌现现象:无论当前生成位置多远,模型始终将异常高的注意力权重分配给序列最开始的几个 token。这些 token 被称为 Attention Sinks。
其成因在于 Softmax 的归一化约束——注意力权重必须和为 1。当序列增长时,模型需要某些"吸收器"来承接多余的注意力质量,而位置 0 附近的 token 因始终可见,在训练中被自发地塑造为稳定的注意力汇点。
5.2 朴素窗口注意力的崩溃
若仅使用滑动窗口(Sliding Window)丢弃旧 token,当序列长度超过窗口大小时,初始 sink token 被驱逐,模型性能立即崩溃。原因在于 Softmax 分母失去了 sink 项的"锚定",注意力分布偏离训练分布,导致输出分布偏移。
5.3 StreamingLLM 双区缓存策略
StreamingLLM 的解决方案极为简洁:将 KV-Cache 划分为两个区域——
- Sink 区:固定保留前 kkk 个 token 的 KV(通常 k=4k=4k=4),永不被驱逐;
- 窗口区:循环缓存最近 LLL 个 token 的 KV,新 token 覆盖最旧者。
总缓存大小恒定为 k+Lk + Lk+L,与序列长度无关,实现常数内存的无限流式生成。
注意力权重的计算变为:
αt,i=exp(st,i)∑j∈sinksexp(st,j)+∑j∈windowexp(st,j) \alpha_{t,i} = \frac{\exp(s_{t,i})}{\sum_{j \in \text{sinks}} \exp(s_{t,j}) + \sum_{j \in \text{window}} \exp(s_{t,j})} αt,i=∑j∈sinksexp(st,j)+∑j∈windowexp(st,j)exp(st,i)
其中分母结构完整保留了训练时的分布特征,sink token 吸收多余权重,窗口 token 承载实际语义依赖。
5.4 位置编码处理
StreamingLLM 使用缓存内位置而非原始文本位置进行 RoPE 编码。即窗口区 token 的位置编号随滑动连续更新,避免位置编号爆炸导致的分布外推问题。
6. LoRA-FA:低秩适配下的缓存共享
6.1 多任务场景的缓存冗余
当多个 LoRA 适配器共享同一基座模型处理相同上下文时,每个适配器独立维护完整 KV-Cache,造成 NNN 倍的内存冗余。观察发现:同一上下文经基座模型产生的激活高度相似,差异主要来自 LoRA 引入的低秩扰动。
6.2 基缓存与低秩残差分离
LoRA-FA(Frozen Attention)将 KV-Cache 解耦为两部分:
- Base Cache(基缓存):由预训练权重计算,所有任务共享;
- Adapter Output(适配输出):由 LoRA 权重引入的残差,具有低秩结构。
具体而言,LoRA 的前向传播为 W+BAW + BAW+BA,其中 B∈Rd×rB \in \mathbb{R}^{d \times r}B∈Rd×r,A∈Rr×dA \in \mathbb{R}^{r \times d}A∈Rr×d,秩 r≪dr \ll dr≪d。在中间激活层面,可仅存储低维投影后的结果(LR Cache),在需要时通过右乘 BBB 恢复全维贡献。
6.3 Flash-LoRA-Attention
为避免运行时频繁将低秩缓存重构为全维张量,Flash-LoRA-Attention 重新排序计算图:将查询与基缓存的注意力计算、与低秩重构的注意力计算分离调度,并在 FlashAttention 内核层面融合,避免显式物化中间结果。最终内存占用从 N×FullKVN \times \text{FullKV}N×FullKV 降至 SharedBase+N×LR\text{SharedBase} + N \times \text{LR}SharedBase+N×LR,压缩比随任务数 NNN 线性增长。
7. 注意力稀疏化的信息损失上界
7.1 线性高斯抽象模型
为严格分析驱逐损失,将注意力计算抽象为线性高斯通信信道。设查询 qqq 服从高斯分布 q∼N(μQ,ΛQ)q \sim \mathcal{N}(\mu_Q, \Lambda_Q)q∼N(μQ,ΛQ),每个 KV 对构成一个等效信道,将查询映射到输出空间。驱逐问题转化为:在预算约束 ∣C∣=B|C| = B∣C∣=B 下,选择信道子集 CCC 以最大化查询与输出间的互信息。
7.2 驱逐损失的 L1 上界
设完整缓存的注意力输出为 ooo,驱逐后缓存的输出为 o^\hat{o}o^。定义驱逐损失为两者间的 L1 距离:
Levict=∥o−o^∥1 \mathcal{L}_{\text{evict}} = \| o - \hat{o} \|_1 Levict=∥o−o^∥1
对于 Top-K 保留策略,可证明其上界满足:
Levict≤∑i∉C∣αi∣⋅∥vi∥1+∣1−∑j∈Cαj∣⋅maxk∈C∥vk∥1 \mathcal{L}_{\text{evict}} \leq \sum_{i \notin C} |\alpha_i| \cdot \| v_i \|_1 + \left| 1 - \sum_{j \in C} \alpha_j \right| \cdot \max_{k \in C} \| v_k \|_1 Levict≤i∈/C∑∣αi∣⋅∥vi∥1+1−j∈C∑αj⋅k∈Cmax∥vk∥1
其中 αi\alpha_iαi 为注意力权重,viv_ivi 为对应 value 向量。该上界揭示了两个关键量:被驱逐 token 的注意力权重绝对值之和,以及保留 token 的权重归一化缺口。Top-K 策略通过最大化保留集合的权重和,同时最小化缺口,从而最小化该上界。
7.3 信息瓶颈视角
从信息瓶颈(Information Bottleneck)角度,缓存驱逐的目标函数可写为:
LC=I(q;Y∣ZC) \mathcal{L}_C = I(q; Y \mid Z_C) LC=I(q;Y∣ZC)
其中 ZCZ_CZC 为保留的 KV 集合,YYY 为注意力输出。最大化 LC\mathcal{L}_CLC 等价于在固定预算下保留具有最高统计杠杆分数(Leverage Score)的 token。该分数由简化容量矩阵的特征结构决定,与启发式的累积注意力分数不同,它显式考虑了 token 间的方向冗余——即使某 token 注意力分数高,若其 value 方向已被其他保留 token 覆盖,则其边际信息增益低。
7.4 互信息下界与容量最大化
将每个 KV 对视为向量信道,其方向代表对输出空间的贡献,模长编码查询对齐强度。给定预算 BBB,有效容量最大化的条件是保留信道方向尽可能正交。由此导出信息损失上界:
I(q;Y)−I(q;Y^)≤∑i∉Cλi+O(ϵ2) I(q; Y) - I(q; \hat{Y}) \leq \sum_{i \notin C} \lambda_i + O(\epsilon^2) I(q;Y)−I(q;Y^)≤i∈/C∑λi+O(ϵ2)
其中 λi\lambda_iλi 为被驱逐 token 对应信道在容量矩阵中的特征值。该式表明,驱逐损失由被移除信道的信息容量之和主导,为动态驱逐提供了可计算的理论边界。
8. 动态驱逐策略
8.1 基于注意力分数的驱逐:H2O 与 SnapKV
H2O(Heavy-Hitter Oracle) 维护每个 token 的累积注意力分数,贪心驱逐分数最低者。其假设是:历史注意力低意味着未来被查询的概率低。
SnapKV 在预填充阶段通过观察最后几层注意力分布,识别关键位置并在全局统一保留,实现任务无关的压缩。
8.2 基于信息容量的驱逐:CapKV
CapKV 不依赖启发式分数,而是直接基于线性高斯模型计算每个 token 的统计杠杆分数:
scorei=∥U⊤ki∥2/∥ki∥2 \text{score}_i = \| U^\top k_i \|^2 / \| k_i \|^2 scorei=∥U⊤ki∥2/∥ki∥2
其中 UUU 为容量矩阵的顶部特征向量集合。该分数衡量 token 在输出空间中的不可压缩贡献,贪心保留高分 token 可确定性逼近最优信息保留目标。
8.3 分层自适应驱逐:HAE
HAE(Hierarchical Adaptive Eviction)针对多模态场景,引入双注意力剪枝(DAP)与动态解码驱逐(DDES):
- DAP 区分视觉 token 与文本 token 的注意力模式,分别设定驱逐阈值;
- DDES 在解码阶段根据生成长度自适应扩展历史窗口,短生成时保持小窗口,长生成时渐进扩容。
理论保证:HAE 的误差传播有界,实验表明在 41% KV-Cache 压缩下平均精度损失仅 0.3%。
8.4 自适应预算分配:Ada-KV
Ada-KV 的核心洞察是:不同注意力头的集中度差异巨大。某些头(如检索头)高度聚焦在少数关键 token,而另一些头分布均匀。若在所有头间均匀分配预算,则集中度高的头因预算不足而损失关键信息,集中度低头的预算则被浪费。
Ada-KV 为每层每头独立计算预算,依据注意力熵或有效秩进行分配。理论上可证明:自适应分配的驱逐损失上界始终不劣于均匀分配。
9. 协同设计:模块交互与数据流
预填充阶段一次性计算全量 KV,并执行初始稀疏化评估。各策略模块根据配置保留不同子集。解码阶段每步生成后,动态驱逐模块触发信息容量重估,若窗口满则执行驱逐与缓存重分配。LoRA-FA 模块在解码阶段仅更新低秩残差,基缓存只读共享。
10. 接口对接图:输入输出定义
| 接口 | 类型 | 维度 | 说明 |
|---|---|---|---|
| Token 序列 | 输入 | (T,d)(T, d)(T,d) | 原始文本经嵌入后的张量 |
| 任务类型 | 输入 | 标量 | 控制 Hierarchical 预算曲线选择 |
| LoRA ID | 输入 | 标量 | 决定低秩残差分支 |
| 压缩后 KV | 输出 | (B,nh,dh)(B, n_h, d_h)(B,nh,dh) | BBB 为预算长度,已驱逐无关 token |
| 注意力权重 | 输出 | (Twin,)(T_{\text{win}},)(Twin,) | 当前步对缓存内各 token 的注意力分布 |
| 驱逐日志 | 输出 | 列表 | 记录被驱逐 token 的位置与信息容量分数 |
11. 完整三层架构总览图
12. 实验边界与性能验证
12.1 Needle-in-Haystack 验证
在 32K 上下文中插入关键信息(Needle),测试不同压缩策略的检索能力。DynamicKV 在 64 长度预算下仍保持 90% 原始性能,相比 StreamingLLM、PyramidKV 分别提升 57%、37%。这表明分层自适应策略在极端压缩下具有显著优势。
12.2 吞吐量与内存对比
| 方法 | 内存复杂度 | 每步计算 | 适用场景 |
|---|---|---|---|
| Dense Attention | O(T)O(T)O(T) | O(T)O(T)O(T) | 短上下文 |
| Window Attention | O(W)O(W)O(W) | O(W)O(W)O(W) | 中等长度,但会崩溃 |
| StreamingLLM | O(k+W)O(k+W)O(k+W) | O(k+W)O(k+W)O(k+W) | 无限流式,常数内存 |
| Hierarchical | O(Blayer)O(B_{\text{layer}})O(Blayer) | O(Blayer)O(B_{\text{layer}})O(Blayer) | 任务敏感型长上下文 |
| LoRA-FA | O(Base+N⋅r)O(\text{Base} + N \cdot r)O(Base+N⋅r) | O(Base+N⋅r)O(\text{Base} + N \cdot r)O(Base+N⋅r) | 多任务共享上下文 |
StreamingLLM 相比滑动窗口重计算基线可实现高达 22.2 倍加速,同时困惑度接近全量缓存。
13. 结论与展望
本文系统梳理了长上下文 KV-Cache 压缩的三条技术路线:
- Hierarchical KV-Cache 利用层间与头间的结构差异,通过任务自适应预算分配实现精细压缩;
- StreamingLLM 基于 Attention Sink 现象,以极简的 Sink+Window 双区策略实现常数内存的无限生成;
- LoRA-FA 通过基缓存共享与低秩残差分离,解决多任务场景下的缓存冗余问题。
在理论层面,通过线性高斯信道模型将驱逐问题纳入信息瓶颈框架,导出 Top-K 策略的 L1 损失上界与互信息损失上界,为动态驱逐策略提供了可量化的理论依据。
未来方向包括:端到端可学习的稀疏化机制、跨层联合优化驱逐决策,以及面向硬件对齐的原生稀疏注意力架构。
参考文献
- Xiao, G., Tian, Y., Chen, B., Han, S., & Lewis, M. (2023). Efficient Streaming Language Models with Attention Sinks. arXiv preprint arXiv:2309.17453.
- Liu, N. F., Lin, K., Hewitt, J., Paranjape, A., Bevilacqua, M., Petroni, F., & Liang, P. (2023). Lost in the Middle: How Language Models Use Long Contexts. arXiv preprint arXiv:2307.03172.
- Zhang, Z. et al. (2023). H2O: Heavy-Hitter Oracle for Efficient Generative Inference of Large Language Models. NeurIPS 36.
- Li, Y. et al. (2024). SnapKV: LLM Knows What You are Looking for Before Generation. arXiv preprint.
- Liu, Z. et al. (2024). DynamicKV: Task-Aware Adaptive KV Cache Compression for Long Context LLMs. ACL 2025.
- Tiwari, R. et al. (2025). Rethinking KV Cache Eviction via a Unified Information-Theoretic Objective. arXiv preprint.
- Xi, H. et al. (2025). LRAgent: Efficient KV Cache Sharing for Multi-LoRA LLM Agents. arXiv preprint.

249

被折叠的 条评论
为什么被折叠?



