Kimi K3 混合线性注意力

Kimi K3 的混合线性注意力能够经受住前沿规模训练的考验,并展现出强大的长程行为表现,同时大幅减少了导致持久化智能体成本高昂的缓存增长。

Kimi K3 混合线性注意力
AI模型价格对比 | AI工具导航 | ONNX模型库 | Vibe Coding教程 | PLC在线仿真器 | Tripo 3D | Meshy AI | ElevenLabs | KlingAI | ArtSpace | Phot.AI | InVideo

Kimi K3 的混合线性注意力能够经受住前沿规模训练的考验,并展现出强大的长程行为表现,同时大幅减少了导致持久化智能体成本高昂的缓存增长。

让我解释为什么。

保存模型注意力历史所需的内存非常昂贵。

对于传统的 Transformer 来说,这段历史就是 KV 缓存。

把对话拉长八倍,在其他条件相同的情况下,KV 缓存大约也会膨胀八倍。

对于智能体系统来说,这是一个硬性约束。

智能体越强大,你越想让它保留更多状态——而 Kimi K3 改变了这笔账。

Kimi K3 在 93 层堆栈中使用了 69 层 Kimi Delta Attention 和 24 层 Gated MLA 全注意力层

大多数层更新一个固定大小的循环状态,而不是把又一个 token 追加到线性增长的 KV 缓存中。

None

其余的全注意力层保留了从序列中进行高保真检索的路径。

最抓眼球的说法很诱人:前沿规模的恒定状态注意力。更准确的工程解读则更有用:

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 表示学到的逐通道衰减,而不是整个状态的一个统一遗忘值

None

这不是完整的 KDA 方程,但它抓住了工程直觉:更新策略可以保留一些记忆通道,同时激进地回收另一些通道。

K3 公布的配置让状态变得具体:

  • 69 层 KDA;
  • 96 个注意力头;
  • 键维度 128;
  • 值维度 128;
  • BF16 模型精度。

因此,单个会话的 KDA 状态大约为:

69 layers × 96 heads × 128 × 128 × 2 bytes
= 217,055,232 bytes
≈ 0.22 GB
None

这个状态实际上与序列长度无关。

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%。

None

这意味着循环状态的反对意见改变了存储模型,但并没有抹掉架构上的节省。

vLLM 的 K3 实现正是因为这个原因不得不重新设计混合前缀缓存。

全注意力层使用分页的 KV 块,而 KDA 层需要循环状态快照。vLLM 把物理 KDA 状态块大小与细粒度的前缀匹配解耦,这样共享的提示词可以复用两种形式的内存。

K3 迫使一个主流推理引擎把循环状态缓存当作一流的服务原语来对待。

6、子智能体怎么办?

智能体系统常常用一个协调者来启动专门的工人。

一种常见的同步模式:

main agent
  ├─ spawn code-search subagent
  ├─ wait for result
  ├─ discard subagent runtime state
  └─ continue main session
None

子智能体的缓存在它运行期间存在,但不一定会永久地加进协调者的足迹里。

长期存在的状态通常就是协调者会话本身。

更困难的情况是异步工作:

main agent
  ├─ background migration agent  ───────────────┐
  ├─ background test agent       ──────────┐    │
  └─ interactive main session               │    │
                                             ▼    ▼
                                  persistent concurrent state

长期运行的并发子智能体确实会成倍增加状态需求,因为 KDA 无法废除并发。

None

实用的设计规则很直接:

  • 让短命的探索性工人保持瞬时性
  • 把紧凑的产物返回给协调者
  • 为可恢复性持久化检查点,而不是每个瞬时步骤
  • 为并发的长期分支设定预算
  • 按工作流测量活动状态,而不只是按请求测量。

混合注意力降低了每个长期分支的成本。它并不会让无限分支变得免费。

7、缩放定律是工程曲线

缩放定律是对某个模型家族、数据体制和训练过程的观察。

它们不是物理常数——改变架构,曲线就会移动。

K3 结合了:

  • 更好的有限状态注意力机制
  • 周期性的全注意力
  • 跨深度的选择性残差路由
  • 更高效的专家计算
  • 低精度权重
  • 定制内核
  • 长上下文训练和智能体强化学习
  • 面向混合缓存管理的推理引擎改动

结果是一个更有用的东西:

前沿能力并不要求你接受上一代架构的内存斜率。

这就是进步。

8、结束语

Kimi K3 最重要的贡献是证明了:混合线性注意力能够经受住前沿规模训练的考验,并在大幅减少让持久化智能体变昂贵的缓存增长的同时,交付强大的长程行为表现。

你也应该更新自己的假设:

  1. KV 缓存的增长是一个架构选择。
  2. "恒定状态"适用于 KDA 层。
  3. 混合设计可以在简化对比中把内存斜率降低约四分之三,同时保留全注意力检索。
  4. 循环状态会带来新的检查点、前缀缓存和迁移问题。
  5. 智能体平台应该像管理存储系统一样管理上下文。
  6. 最好的第一个实验是 API 级的工作负载测试,而不是自托管 2.8T 参数。
  7. 值得关注的架构是带有显式服务支持的混合内存

下一代智能体将变得实用,是因为它们底下的系统学会了更高效地记忆。

原文链接:Kimi K3 Changed the Memory Math for Agentic AI Forever

汇智网翻译整理,转载请标明出处