摘要
本文解读 NeurIPS 2023 论文《H2O: Heavy-Hitter Oracle for Efficient Generative Inference of Large Language Models 》。该论文提出H2O(重型命中者预言机)KV Cache 驱逐策略 ,通过融合注意力稀疏性观测 、累加注意力分数幂律分布 与动态子模最大化理论 ,只保留重型命中者和最近 token,即可用 20% 的 KV 缓存预算 实现 5--10 倍内存缩减、最高 29 倍吞吐提升,且精度与全缓存持平甚至反超。实验覆盖 OPT(6.7B--175B)、LLaMA、GPT-NeoX 三族模型,并证明 H2O 可增强其它稀疏注意力基线、兼容 4-bit 量化、支持 400 万 token 流式输入,为 KV Cache 管理这一长上下文推理核心问题提供了奠基性方案。
视频讲解 :点击观看 B 站视频
- 摘要
- 论文基本信息
- [背景与动机:KV Cache 为什么成为 LLM 生成的第一内存瓶颈](#背景与动机:KV Cache 为什么成为 LLM 生成的第一内存瓶颈)
- 研究主线:从问题到结论
- [基准/方法设计:H2O 的两条经验观测](#基准/方法设计:H2O 的两条经验观测)
- [分类全景:KV Cache 优化策略的三种思路](#分类全景:KV Cache 优化策略的三种思路)
- 方法细节:贪心驱逐算法与动态子模理论
- 实验设计与结果:三族模型、八个任务、四种预算
- 结果对比总结
- 关键发现
- 局限性
- 常见问题(FAQ)
- [H2O 的全称和核心思想是什么?](#H2O 的全称和核心思想是什么?)
- [H2O 和 StreamingLLM 是什么关系?](#H2O 和 StreamingLLM 是什么关系?)
- [H2O 需要重新训练模型吗?](#H2O 需要重新训练模型吗?)
- [为什么 Local(只留最近 token)策略会崩?](#为什么 Local(只留最近 token)策略会崩?)
- [H2O 的理论贡献是什么?](#H2O 的理论贡献是什么?)
- [H2O 的开源代码在哪里?](#H2O 的开源代码在哪里?)
- 参考链接
论文基本信息
| 项目 | 内容 |
|---|---|
| 标题(英文) | H2O: Heavy-Hitter Oracle for Efficient Generative Inference of Large Language Models |
| 标题(中文) | H2O:重型命中者预言机------大模型高效生成式推理的 KV Cache 驱逐策略 |
| 作者 | Zhenyu Zhang, Ying Sheng, Tianyi Zhou, Tianlong Chen, Lianmin Zheng, Ruisi Cai, Zhao Song, Yuandong Tian, Christopher Ré, Clark Barrett, Zhangyang Wang, Beidi Chen |
| 机构 | 德克萨斯大学奥斯汀分校 · 斯坦福大学 · 加州大学 · Meta AI (FAIR) · 卡内基梅隆大学 |
| 会议 | NeurIPS 2023 |
| arXiv | https://arxiv.org/abs/2306.14048 |
| 项目网站 | https://github.com/FMInference/H2O |
背景与动机:KV Cache 为什么成为 LLM 生成的第一内存瓶颈
大语言模型的部署成本长期被三个瓶颈主导:模型参数量、注意力计算的二次方复杂度,以及生成阶段的 KV Cache 显存占用 。前两个被广泛研究,而 KV Cache 的问题在长序列、大 batch 场景下尤为尖锐:一个 300 亿参数的模型,输入 batch 为 128、序列长度 1024 时,KV Cache 就要消耗 180GB 显存------比模型权重本身还大,且随序列长度和 batch 大小线性膨胀。
已有的稀疏注意力方法(Reformer、Performer)主要解决训练/预填充阶段的计算复杂度,缓存依然很大;Sparse Transformer、Multi-Query Attention 虽然能缩小缓存,但直接套用到预训练 LLM 上会显著掉精度;模型压缩路线(SparseGPT、GPTQ)解决的是参数瓶颈,与 KV Cache 是两条独立的线。因此「生成阶段能否只保留一小部分 KV 而保住全部精度」成为一个开放问题。
H2O 的回答来自一条结构洞察:注意力矩阵在推理时超过 95% 稀疏 ,且 token 的累加注意力分数服从幂律分布 ------少数被称为重型命中者(Heavy Hitters)的 token 贡献了绝大部分注意力价值。基于此,H2O 把「驱逐哪些 KV」重新表述为动态子模最大化问题,用贪心驱逐策略在零训练成本下保住精度,并能与量化、offloading 等正交优化叠加。从技术脉络看,H2O 是 KV Cache 驱逐这一研究线的起点:它之后是 StreamingLLM(注意力汇)、SnapKV(逐头投票聚合)、PyramidKV(跨层预算再分配),KV 管理由此成为长上下文推理的标配组件,并进入智能体记忆系统(Agent Memory Survey 将 H2O 归入 Latent Memory-Transform 类)。
研究主线:从问题到结论

图 8:H2O 研究主线(Mermaid 流程图):问题 → 稀疏性/幂律观测 → 重型命中者设计 → 动态子模理论 → 实验验证 → 29× 吞吐结论。
基准/方法设计:H2O 的两条经验观测
H2O 的设计建立在两条可复现的观测上。观测一(稀疏性) :尽管模型是密集训练的,推理时各层注意力矩阵超过 95% 的位置都接近零,这意味着生成下一个 token 不需要访问全部历史 KV。观测二(幂律) :把每个 token 在所有注意力头收到的分数累加,分布服从幂律,少数重型命中者承担绝大部分价值;把它们从注意力中移除,模型精度断崖式下跌(OPT-30B 的 COPA 从 85.00 掉到接近随机水平)。更关键的发现是:局部统计 = 全局统计------只用历史 token 的注意力累加分数选择重型命中者,效果与「看到未来」的全局贪心一致,这让在线驱逐成为可能。

图 1:H2O 框架总览。上排为不同 KV Cache 策略下的注意力图符号示意;左下为 H2O 系统框架;右下为精度-内存权衡曲线,H2O 在 5--10 倍内存缩减下精度几乎不掉。
分类全景:KV Cache 优化策略的三种思路

图 9:KV Cache 优化策略分类(Mermaid 分类图):全缓存基线、稀疏注意力近似(掉点最高 35%)、仅最近 token(同样掉点),H2O 用重型命中者+最近 token 在 20% 预算下持平全缓存。
方法细节:贪心驱逐算法与动态子模理论
H2O 的核心算法非常朴素:缓存预算 k 均分为两部分,一部分放重型命中者、一部分放最近 token;每一步最多驱逐一个 KV。设 S_{i-1} 为当前缓存集合,价值函数 F_{\\mathrm{score}}(T) := \\sum_{s \\in T} o_s(o_s 为 token s 的累加注意力分数),新 token i 到来时按 u \\gets \\arg\\max_{v} F_{\\mathrm{score}}(S_{i-1} \\cup {i} \\setminus {v}) 驱逐价值最低者。被驱逐的 KV 在后续解码步中不可再访问------这正是驱逐必须谨慎的原因。

图 2:四条关键观测。(a) 各层注意力 >95% 稀疏;(b) 累加注意力分数(红点)呈幂律且与词共现次数(灰线)相关;(c) 移除重型命中者精度崩坏;(d) 局部/全局 H2O 在 20% 预算下均匹配全缓存,仅留最近 token 的 Local 策略大幅退化。
论文把带预算的生成过程形式化为动态子模最大化 (每个时间步价值函数相对当前缓存集合是子模的),并证明贪心构造的集合满足 f(\\tilde{S}*i) \\geq (1-\\alpha)(1-1/e)\\max*{\|S\|=k} f(S) - \\beta------这是经典的 (1-1/e) 型近似保证,为后续所有 KV 驱逐算法提供了统一分析语言。系统实现上,H2O 基于 FlexGen:缓存内存预分配,前 K 槽放重型命中者、后 K 槽放最近 token(循环队列更新),驱逐时直接覆写、零内存搬运;预填充阶段序列长度 \\geq 2K 时即完成首次筛选。

图 3:驱逐算法执行示意。第 4 步生成时新 token 进入候选集合,累加注意力分数最低的第 3 个 token 被驱逐,其 KV 在后续步骤不可再访问。
实验设计与结果:三族模型、八个任务、四种预算
实验覆盖 OPT(6.7B/13B/30B/66B/175B)、LLaMA(7B/13B)、GPT-NeoX-20B,在单张 A100-80GB 上评测;任务横跨 HELM(XSUM、CNN/Daily Mail 摘要)与 lm-eval-harness(COPA、MathQA、OpenBookQA、PiQA、RTE、Winogrande),KV 预算从 4% 扫到 100%。基线包括全缓存、仅最近 token 的 Local 策略、strided/fixed 两种 Sparse Transformer,以及 DeepSpeed ZeRO-Inference、Hugging Face Accelerate、FlexGen 三个推理系统。
主精度结果(OPT-30B,5-shot,20% 预算):
| 方法 | PiQA | COPA | OpenBookQA | Winogrande |
|---|---|---|---|---|
| Full(全缓存) | 80.09 | 81.00 | 44.80 | 71.51 |
| Local(仅最近 20%) | 57.94 | 56.00 | 28.40 | 51.30 |
| H2O(20% 预算) | 79.22 | 85.00 | 43.80 | 71.67 |
| 0-shot Full | 78.89 | 76.00 | 41.40 | 70.00 |
H2O 在 20% 预算下与全缓存差距全部在 1 个百分点以内 ,COPA 甚至反超 4 个点(正则化效应);Local 策略最多掉 37 个百分点 。系统吞吐上,T4 平台 H2O 相比 FlexGen、DeepSpeed、Accelerate 分别提升 3×、29×、29×;A100 上同批量延迟降低 1.1--1.9 倍:
| 设置(Seq+模型) | 指标 | FlexGen | H2O(20%) |
|---|---|---|---|
| 7000+1024, OPT-30B, bs=1 | 延迟 (s) | 57.0 | 50.4 |
| 5000+5000, OPT-13B, bs=4 | 延迟 (s) | 214.2 | 155.4 |
| 2048+2048, OPT-6.7B, bs=24 | 延迟 (s) | 99.5 | 53.5 |
| 2048+2048, OPT-6.7B, bs=24 | 吞吐 (tok/s) | 494.1 | 918.9 |
| 2048+2048, OPT-6.7B, bs=64 | 吞吐 (tok/s) | OOM | 1161.0 |
省下的显存把 batch 从 24 推到 64(FlexGen 已 OOM),吞吐翻倍以上。

图 4:主结果曲线。H2O 在 20% 预算附近与全缓存几乎重合;Local 在 60% 预算以下塌缩(LLaMA-13B@XSUM、LLaMA-7B@CNN/Daily Mail 尤其明显)。
附录中的扩展实验进一步证明 H2O 的鲁棒性:无限长输入 上 H2O 可流式处理 400 万 token (PG-19 困惑度优于 StreamLLM,因为重型命中者保住了中段关键信息,而 StreamLLM 只保首 token 和局部窗口);4-bit 量化 兼容实验中 H2O+Quant 精度不降反升(COPA 84.00、PiQA 78.80),T4 吞吐从 52.1 再涨到 62.3 token/s;TopK 基线增强 实验中叠加 H2 后最高再涨 2 个百分点;生成多样性上 Self-BLEU 从 0.0057 降到 0.0051(LLaMA-7B,XSUM 100 样本),重复更少、更富创造力。

图 5:(上)H2O 流式处理 4M token 输入;(下)PG-19 首个样本上 H2O 困惑度始终低于 StreamLLM。

图 6:生成质量示例。全缓存模型重复冗余句式,Local 策略在极端预算下退化为重复标点,H2O 生成更连贯、更多样的文本。

图 7:零样本与一样本推理下 H2O 在 20% 预算匹配全缓存,Local 显著退化;短序列(100--300 token)任务需 30--40% 预算。
结果对比总结

图 10:结果对比总结(Mermaid 流程图):H2O 相比 DeepSpeed/Accelerate 提升 29×、相比 FlexGen 提升 3×,20% 预算与全缓存差 <1pp,Local 策略掉 37pp。
关键发现
- 20% 预算即顶满性能:H2O 在 20% KV 预算下 8 个任务与全缓存差距 <1pp,COPA 反超 4 个点,实现 5--10 倍内存缩减。
- 最高 29 倍吞吐:相比 DeepSpeed ZeRO-Inference 与 Hugging Face Accelerate 提升 29 倍、相比 FlexGen 提升 3 倍(OPT-6.7B/30B,T4);同批量延迟低 1.1--1.9 倍。
- 更大 batch:省出的显存把 OPT-6.7B 的 batch 从 24 推到 64,吞吐 494.1 → 1161.0 token/s(FlexGen 在该配置 OOM)。
- 增强而非替代:strided/fixed Sparse Transformer 在 20% 预算下掉点最高 35%,叠加 H2 后全部回升至与全缓存持平;TopK 基线叠加 H2 最高再涨 2pp。
- 理论保证:KV 驱逐被形式化为动态子模最大化,贪心算法获得 (1-\\alpha)(1-1/e)\\max - \\beta 型近似界,实测局部贪心 = 全局贪心。
- Oral 信号(ResearchStudio-Idea 框架):命中 P6 重新表述为可解对象(最干净 Oral 信号 \\Delta_{\\mathrm{OR}}=+2.9pp)、P10 异构分解差异化处理(NeurIPS 偏好 +4.7pp)、P2 替换算子三个模式------理论、结构洞察、系统执行三线闭环。
局限性
- 参数瓶颈未解决:生成吞吐仍受 MLP 权重加载制约,仅优化 KV Cache 收益有上限;作者展望利用重型命中者在 MLP 块中同样存在的规律设计参数 offloading。
- 重要性偏差:累加注意力分数天然偏向更早的 token,作者用平均分数替代的实验反而掉点。
- 驱逐不可逆:一旦误驱逐关键 KV,后续生成无法恢复;短序列、高信息密度任务需要 30--40% 预算才能完全保精度。
常见问题(FAQ)
H2O 的全称和核心思想是什么?
H2O 全称 Heavy-Hitter Oracle(重型命中者预言机)。核心思想是:注意力分数服从幂律分布,少数「重型命中者」token 贡献绝大部分注意力价值,因此 KV Cache 只需保留重型命中者 + 最近 token,用 20% 预算即可匹配全缓存精度。
H2O 和 StreamingLLM 是什么关系?
两者同源(共享作者 Beidi Chen)但机制不同:StreamingLLM 固定保留首 token(注意力汇)+ 局部窗口,适合中段无关键信息的场景;H2O 动态按累加注意力分数识别重型命中者,能在关键信息分散于长文本中段时保住性能,流式实验(4M token)中困惑度优于 StreamLLM。
H2O 需要重新训练模型吗?
不需要。H2O 是纯推理期策略,直接作用在已训练模型的 KV Cache 上,零训练、零微调,可与量化、权重 offloading 等正交优化直接叠加。
为什么 Local(只留最近 token)策略会崩?
生成时当前 token 往往依赖早期出现的关键信息(如任务指令、实体定义),只留最近 token 会把这些信息驱逐;而重型命中者恰恰是历史上被高频注意的 token,保留它们相当于保留了「长期记忆」。
H2O 的理论贡献是什么?
论文把带预算的生成过程形式化为动态子模最大化问题,证明贪心驱逐达到 (1-\\alpha)(1-1/e)\\max_{\|S\|=k} f(S) - \\beta 的近似保证,为后续 KV 驱逐算法提供了统一分析框架。
H2O 的开源代码在哪里?
代码在 https://github.com/FMInference/H2O ,实现基于 FlexGen,可复现 OPT/LLaMA/GPT-NeoX 上的全部实验。
参考链接
- 论文:https://arxiv.org/abs/2306.14048 (H2O, NeurIPS 2023)
- 代码:https://github.com/FMInference/H2O
- 系统基座 FlexGen:https://github.com/FMInference/FlexGen (ICML 2023)
- 后续工作 StreamingLLM:https://arxiv.org/abs/2309.17453 (ICLR 2024)
- 后续工作 SnapKV:https://arxiv.org/abs/2404.14469 (ACL 2024)
- 综述定位(Agent Memory Survey 将 H2O 归入 Latent Memory-Transform 类):https://arxiv.org/abs/2512.13564
给大家推荐一款自用写文献综述、无虚构文献的 AI:
🌟 复旦大学 FudanNLP 团队自研 切问学术
覆盖 3.6 亿篇可溯源真实中英文文献,能自动整合文献观点生成规范综述
还能挖掘研究创新点、复现实验,配合视频教学,新手快速上手文献综述写作
🍀后记🍀
博客的关键词集中在编程、算法、机器人、人工智能、数学等等,持续高质量输出中。
🌸讨论QQ群 :白拾的小屋 (750365700)
⭐B站账号 :白拾的物理AI组会(活跃于知识区和动画区)
✨GitHub主页 :YhbCode000(工程文件)