1M 上下文撞上的那堵墙
长上下文的第一瓶颈不是算力而是显存——KV 缓存随序列长度线性膨胀,一次 1M token 的对话要占掉多少显存,以及为什么「压缩」和「稀疏」是仅有的两条出路。
1M 上下文撞上的那堵墙
在讲 K3 怎么解之前,先把题目摆清楚。长上下文真正难的地方,从来不是「模型能不能理解那么长」,而是「机器能不能装得下」。
两笔账:算力与显存
标准 softmax 注意力有两笔开销,随序列长度 的增长方式不同:
- 算力:每个 token 要和前面所有 token 算一次相关度,总量是 。
- 显存:每个 token 的键(key)和值(value)必须被缓存下来,供后续所有 token 查阅——这就是 KV 缓存,大小是 。
直觉上 更吓人。但在推理阶段,先撑爆的是那个 。原因是:算力可以拆时间慢慢算,显存不能——它必须同时在卡上。
把数字代进去
拿一个常规配置估一下。设隐藏维度 7,168、96 层、按 BF16 存(2 字节),每 token 的 KV 缓存约是:
也就是每 token 约 2.75 MB(两个 2 分别来自 K 和 V、以及 BF16 的字节数;实际会因 GQA/MLA 的共享与压缩而小很多,这里先算最朴素的上界)。
那么 1M token 的缓存是 。
一次对话的中间状态,比模型权重本身还大一个量级。 这就是那堵墙。GQA、MLA 这些手段能把它压到几十分之一,但压缩比是常数因子——只要缓存仍然随 线性增长,把 推到 100 万就总会撞上。
这也解释了一个常见困惑:为什么很多模型宣称支持 128K 甚至 1M 上下文,实际用起来又慢又贵,或者在长文中间「失忆」。宣称长度 ≠ 可用长度。 前者是位置编码能外推到哪,后者是显存和吞吐允许你真的塞多少。
只有两条出路
面对线性增长的缓存,架构层面的解法就两类:
出路一:让缓存不再随长度增长。 把「保存全部历史」换成「维护一个固定大小的状态」。RNN 就是这么干的——一个隐状态,读多少 token 都不变大。代价是表达力:固定大小的状态装不下无限历史,早期信息必然被覆盖。线性注意力(linear attention)是这条路的现代形态,Mamba、DeltaNet、Gated DeltaNet 都在这条线上。K3 的 KDA 属于这一类。
出路二:让缓存变小、但保持线性。 不改变增长的阶,只改常数——MQA、GQA 共享 KV 头,MLA 把 KV 压进低秩潜空间,滑动窗口只保留最近一段。这条路稳妥、不损表达力,但如前所述,推到 1M 就不够用。DeepSeek V4 的 CSA/HCA 是把这条路推到极致的代表(本站另有一整个专栏拆它)。
K3 的答案:两条一起走
K3 没有二选一,而是分层混用:
- 69 层用 KDA(出路一)—— 这些层的状态大小与序列长度无关;
- 24 层用 Gated MLA(出路二)—— 保留 softmax 注意力的精确检索能力,同时用 MLA 压缩 KV;
- 外加 1 层 dense。
于是整个模型的 KV 缓存,只由那 24 层贡献——相当于把缓存账单打了个约 1/4 的折,同时保住了「精确回看历史某一处」的能力。
这个混合比例不是拍脑袋定的,背后有 Kimi Linear 一整篇论文的实验支撑。下一章先讲清 KDA 这个零件本身是什么。👉 Kimi Delta Attention
参考文献
- [1] Moonshot AI. “Kimi Linear: An Expressive, Efficient Attention Architecture.” 2025. arXiv:2510.26692. —— KDA 的原始论文与混合比例实验。
- [2] Moonshot AI. “Kimi K3: Open Frontier Intelligence.” 2026. arXiv:2607.24653.
- [3] 本站《AI 大模型解构》注意力:从 MHA 到 MQA、GQA、MLA —— 出路二的完整演进。