Lesson 01 · Architecture map

Kimi K3 不是一种 Cache

本课结束时,你能解释:为什么同一个 Kimi K3 请求里,KDA 和 Gated MLA 必须拥有不同的缓存契约。


先看全局

文本 / 图像
MoonViT-V2 把视觉特征投到共享 embedding 空间。
Attention Residuals
沿深度选择性读取前面 block 的表示。
3 × KDA
线性、递归的 token mixing,维护 state。
1 × Gated MLA
全局内容交互,缓存压缩 latent。
Stable LatentMoE
每个 attention 后做稀疏 channel mixing。

官方摘要给出的关键数字是:2.8T 总参数、104B 激活参数、93 层、896 routed experts 中每 token 激活 16 个,窗口为 1M token。每个 block 的混合注意力是 3 个 KDA 后接 1 个 Gated MLA,最后再保证有一个全局注意力层。

来源:Kimi K3 官方仓库;完整定义见 技术报告第 2 节

两种 Attention,两种状态

1. KDA:把历史压进递归 state

对单个 head,KDA 维护 S_t ∈ R^(d_k × d_v)。当前 token 到来时,先按 channel-wise forget gate 衰减旧状态,再用 delta rule 写入当前 k_t, v_t,最后用 q_t 读取:

S_t = (I - β_t k_t k_tᵀ Diag(α_t)) S_{t-1} + β_t k_t v_tᵀ
o_t = S_tᵀ q_t

所以 decode 阶段不需要把所有历史 K/V 逐 token 存下来;它需要的是“截至某个位置的 state”。这更接近 RNN 的状态快照,而不是普通 Transformer 的 KV 序列。prefill 可以按 chunk 并行,chunk 之间仍按 state 递归。

工程判断: 如果 kernel 以 chunk 为并行和缓存单位,KDA 的 prefix cache 应优先落在合法 chunk 边界;任意 token 位置则需要保存该位置的精确 state,或重算 chunk 尾部。无论哪种方案,都必须带上 state 版本、位置和 dtype;只复制 token 数或 page 指针是不够的。

2. Gated MLA:把历史压成 latent,再重建 K/V

MLA 对每个 token 先得到压缩 latent c_t = W_c x_t,attention 计算时再通过 learned up-projection 重建内容 K/V。K3 的 Gated MLA 还对输出做输入相关的 full-rank gate。

因此它的 cache 单位是 latent token/page:可以借用 PagedAttention 的逻辑页到物理 block 映射、prefix sharing 和 eviction 思路。注意:缓存的是 latent,不是“把 KDA 也塞进同一个 K/V buffer”。

把架构翻译成推理引擎接口

struct LayerCache {
  enum Kind { KdaState, MlaLatent };
  Kind kind;
  uint32_t logical_len;
  uint32_t chunk_boundary;
  DType dtype;
  Device device;
  PageTable pages;      // 仅 MlaLatent 使用
  StateHandle state;    // 仅 KdaState 使用
};

推荐把调度对象拆成两条路径:append_kda_state() 做递归更新,append_mla_latent_page() 做分页追加。请求迁移、prefix reuse、OOM 回收和跨卡传输都必须同时处理这两类对象,并验证它们的逻辑长度一致。

检索练习

问题:一个 decode step 生成 1 个 token。哪种描述最正确?

下一步

先不背公式。请用自己的话回答:如果 prefix cache 在一个 KDA chunk 中间被截断,为什么不能直接从这个快照继续 decode? 下一课会把答案落实为 page/state 生命周期、引用计数和 eviction 协议。

推荐主读物:Kimi K3 Technical Report。遇到任何不清楚的地方,直接追问,我会根据你的回答调整下一课难度。速查表:Kimi K3 架构与缓存契约