Kimi K3 混合线性注意力
Kimi K3 的混合线性注意力能够经受住前沿规模训练的考验,并展现出强大的长程行为表现,同时大幅减少了导致持久化智能体成本高昂的缓存增长。
让我解释为什么。
保存模型注意力历史所需的内存非常昂贵。
对于传统的 Transformer 来说,这段历史就是 KV 缓存。
把对话拉长八倍,在其他条件相同的情况下,KV 缓存大约也会膨胀八倍。
对于智能体系统来说,这是一个硬性约束。
智能体越强大,你越想让它保留更多状态——而 Kimi K3 改变了这笔账。
Kimi K3 在 93 层堆栈中使用了 69 层 Kimi Delta Attention 和 24 层 Gated MLA 全注意力层。
大多数层更新一个固定大小的循环状态,而不是把又一个 token 追加到线性增长的 KV 缓存中。
其余的全注意力层保留了从序列中进行高保真检索的路径。
最抓眼球的说法很诱人:前沿规模的恒定状态注意力。更准确的工程解读则更有用:
Kimi K3 将模型的大部分从逐 token 的 KV 存储迁移到固定的循环状态,只让少数层的缓存继续增长。
正是这种区分让 K3 比又一个基准分数更有意思。
混合线性注意力在 K3 之前就存在。
真正的新信息是:Moonshot 把它扩展到了 2.8T 参数、104B 激活的模型,拥有一百万 token 的上下文窗口,并在编程、智能体、推理和多模态评估中报告了前沿级性能。
1、为什么 KV 缓存成了智能体基础设施问题
在自回归解码过程中,Transformer 会复用之前 token 计算出的键和值。
如果在每个输出 token 上都对完整上下文重新计算,那将是巨大的浪费,因此推理引擎把它们存储在 KV 缓存中。
对于一个简化的全注意力层,缓存内存的规模大致是:
KV bytes ≈ tokens × layers × cached dimensions × bytes per value
确切数值取决于注意力架构、精度、批处理、并行度、分页和实现。
真正关键的变量是 token 数,而且它只会增长。
当一个应用只发送几千个 token 并生成一个简短回复时,这种增长是可控的。
当一个智能体出现以下行为时,它就变成了平台层面的问题:
- 加载大型代码仓库
- 让持久会话持续数小时或数天
- 调用数十或数百个工具
- 接收截图、日志、跟踪信息和文档
- 在选择方案之前探索多个分支
- 维护多个并发工作区
- 复用大型系统提示词和工具目录
在这些工作负载下,上下文长度变成了一种内存预留。
这种预留决定了准入控制、批处理、缓存驱逐、预填充延迟、前缀复用、会话迁移、故障恢复,以及一个集群能容纳多少并发智能体。
如果一个活动会话挤掉了其他所有用户,那么一百万 token 的上下文就毫无用处。
2、线性注意力的承诺
线性注意力用循环状态取代了逐 token 增长的缓存。
一个刻意简化的心智模型:
state_t = decay_t(state_t-1) + write_t(key_t, value_t)
output_t = read(state_t, query_t)
状态有固定的形状。
无论模型处理了一千个 token 还是一百万个 token,它都在不断更新同一个张量,这让这些层的存储与序列长度无关,而不是随序列长度变化。
问题在于,这是一个压缩系统。
固定的状态必须概括一个无界的流,所以有些信息完整保留,有些被混合,有些被丢弃。
- 全注意力的行为更像为每个 token 保留一条可寻址的记录。
- 循环线性注意力的行为更像维护一个学到的、持续更新的数据结构。
失败模式很容易想象。
让模型从一个很长会话的早期找一个具体的变量名、校验和、迁移 ID 或错误字符串——压缩后的状态可能保留了讨论的大意,却丢失了精确的 token。
这就是纯线性注意力模型在历史上难以在前沿取代全注意力的原因。
3、Kimi Delta Attention 增加了什么
Kimi Delta Attention(KDA)扩展了 Gated DeltaNet,对记忆衰减有了更细粒度的控制。
有用的直觉是选择性遗忘。
早期的循环设计对单个头部的记忆施加相对粗糙的衰减,而 KDA 使用逐通道门控,让状态的不同维度可以以不同速率衰减。
概念上:
state_t = D_t ⊙ state_t-1 + delta_write_t
这里,D_t 表示学到的逐通道衰减,而不是整个状态的一个统一遗忘值。
这不是完整的 KDA 方程,但它抓住了工程直觉:更新策略可以保留一些记忆通道,同时激进地回收另一些通道。
K3 公布的配置让状态变得具体:
- 69 层 KDA;
- 96 个注意力头;
- 键维度 128;
- 值维度 128;
- BF16 模型精度。
因此,单个会话的 KDA 状态大约为:
69 layers × 96 heads × 128 × 128 × 2 bytes
= 217,055,232 bytes
≈ 0.22 GB
这个状态实际上与序列长度无关。
KDA 还需要卷积状态和伺服元数据,真实的引擎还会加上分配开销,但占主导地位的循环矩阵绝不会为每个 token 追加一个条目。
Moonshot 已经开源了 FlashKDA,这是 KDA 前向内核的基于 CUTLASS 的实现。
该仓库把状态暴露为一个形状类似 [batch, heads, value_dim, key_dim] 的张量,这让恒定状态属性在代码中可见,而不只是出现在图表里。
**编者按:**如果你想深入钻研本地 LLM 和智能体技术栈,可以加入我们的 Agent Foundry 项目,获取手把手的深度培训。
4、为什么混合部分比线性部分更重要
K3 不是一个纯线性模型。
它以大约 3:1 的模式交织两种层类型:
- KDA,69 层:固定循环状态,承载高效的远距离更新。
- Gated MLA,24 层:随 token 增长的 KV 缓存,提供高保真的全局检索。
- 合计,93 层:一种既买到效率又不放弃精确 token 访问的混合结构。
纯循环堆栈要求有限状态的内存包办一切,而 K3 让大部分序列处理走 KDA,并周期性通过全注意力层路由信息。
你可以把它想成一个有两层存储的数据库:
- KDA 是紧凑、持续维护的索引;
- MLA 是较小的一组可寻址记录,保持可用于精确的全局交互。
这个类比并不完美,但它导向正确的操作结论:K3 节省了大量内存,同时并不声称有损压缩单靠自己就能保留每一个细节。
Moonshot 更早的 Kimi Linear 实验报告称,混合架构可以匹配或超越全 MLA 基线,同时将 KV 缓存使用量降低多达 75%,并提升百万 token 的解码吞吐量。
K3 正是对这条路线的前沿规模验证。
4、128K 和 1M token 下的内存账
让我们把这个主张变成可检验的。
公开的 K3 配置规定了:
num_hidden_layers = 93
KDA layers = 69
full-attention = 24
num_heads = 96
KDA head_dim = 128
kv_lora_rank = 512
qk_rope_head_dim = 64
dtype = bfloat16
对于简化的 MLA 缓存核算,每个 token 每层使用 512 + 64 = 576 个 BF16 值。这代表了压缩后的 KV 潜变量加上 RoPE 分量。
基线:全部 93 层使用 MLA
cache = layers × tokens × 576 × 2 bytes
实际的 K3:24 层 MLA 加上 69 层 KDA
cache = 24 × tokens × 576 × 2 bytes
+ 69 × 96 × 128 × 128 × 2 bytes
换算成十进制 GB,仅用这两个公式:
- 在 128,000 token 时:假设的 93 层 MLA 堆栈为 13.71 GB,而 K3 为 3.76 GB,减少约 72.6%。
- 在 1,000,000 token 时:107.14 GB 对比 27.87 GB,减少约 74.0%。
两种情况下的 KDA 状态都约为 0.22 GB。
混合侧的增长几乎全部来自那 24 层 MLA。
5、"但 KDA 状态不是可加性的"
一个合理的系统级反对意见是:KV 缓存可以在 token 块边界分页和共享,而循环状态依赖产生它的整个前缀。
假设一个智能体处理一百万 token,你想要每 20,000 token 一个可重启的检查点。
那就是 50 个状态快照,每个约 0.22 GB:
50 snapshots × 0.217 GB ≈ 10.85 GB
把它加到活动的混合缓存上:
27.87 GB active state/cache + 10.85 GB snapshots
≈ 38.72 GB
这仍然比简化后的 107.14 GB 全 MLA 对比低了约 64%。
这意味着循环状态的反对意见改变了存储模型,但并没有抹掉架构上的节省。
vLLM 的 K3 实现正是因为这个原因不得不重新设计混合前缀缓存。
全注意力层使用分页的 KV 块,而 KDA 层需要循环状态快照。vLLM 把物理 KDA 状态块大小与细粒度的前缀匹配解耦,这样共享的提示词可以复用两种形式的内存。
K3 迫使一个主流推理引擎把循环状态缓存当作一流的服务原语来对待。
6、子智能体怎么办?
智能体系统常常用一个协调者来启动专门的工人。
一种常见的同步模式:
main agent
├─ spawn code-search subagent
├─ wait for result
├─ discard subagent runtime state
└─ continue main session
子智能体的缓存在它运行期间存在,但不一定会永久地加进协调者的足迹里。
长期存在的状态通常就是协调者会话本身。
更困难的情况是异步工作:
main agent
├─ background migration agent ───────────────┐
├─ background test agent ──────────┐ │
└─ interactive main session │ │
▼ ▼
persistent concurrent state
长期运行的并发子智能体确实会成倍增加状态需求,因为 KDA 无法废除并发。
实用的设计规则很直接:
- 让短命的探索性工人保持瞬时性
- 把紧凑的产物返回给协调者
- 为可恢复性持久化检查点,而不是每个瞬时步骤
- 为并发的长期分支设定预算
- 按工作流测量活动状态,而不只是按请求测量。
混合注意力降低了每个长期分支的成本。它并不会让无限分支变得免费。
7、缩放定律是工程曲线
缩放定律是对某个模型家族、数据体制和训练过程的观察。
它们不是物理常数——改变架构,曲线就会移动。
K3 结合了:
- 更好的有限状态注意力机制
- 周期性的全注意力
- 跨深度的选择性残差路由
- 更高效的专家计算
- 低精度权重
- 定制内核
- 长上下文训练和智能体强化学习
- 面向混合缓存管理的推理引擎改动
结果是一个更有用的东西:
前沿能力并不要求你接受上一代架构的内存斜率。
这就是进步。
8、结束语
Kimi K3 最重要的贡献是证明了:混合线性注意力能够经受住前沿规模训练的考验,并在大幅减少让持久化智能体变昂贵的缓存增长的同时,交付强大的长程行为表现。
你也应该更新自己的假设:
- KV 缓存的增长是一个架构选择。
- "恒定状态"适用于 KDA 层。
- 混合设计可以在简化对比中把内存斜率降低约四分之三,同时保留全注意力检索。
- 循环状态会带来新的检查点、前缀缓存和迁移问题。
- 智能体平台应该像管理存储系统一样管理上下文。
- 最好的第一个实验是 API 级的工作负载测试,而不是自托管 2.8T 参数。
- 值得关注的架构是带有显式服务支持的混合内存。
下一代智能体将变得实用,是因为它们底下的系统学会了更高效地记忆。
原文链接:Kimi K3 Changed the Memory Math for Agentic AI Forever
汇智网翻译整理,转载请标明出处