跳转到主要内容

Kimi K3:架构、训练与推理系统研究

沿一次前向理解 KDA–MLA、AttnRes 与 LatentMoE,再拆解 Prefill、Decode 和混合缓存的真实成本

· 约 22 分钟阅读

本文目录

Kimi K3 把大多数层的历史压进固定状态,又保留周期性的全局注意力。对性能工程来说,关键问题随之变化:长上下文省下了多少 KV,固定 state 每步要搬多少,以及这两类状态如何一起复用。

本文先跟随一个 token 走完前向,再把 KDA、AttnRes、Stable LatentMoE 放回 Prefill、Decode 和缓存管理中分析。架构说明回答“做了什么”,成本拆解回答“什么条件下可能更快”。

30 秒复习
  • 一句话:K3 用 69 层固定状态 KDA 承担大部分长序列混合,用 24 层 Gated MLA 周期性恢复全局逐 token 访问,再用 AttnRes 和 Stable LatentMoE 扩展深度与宽度信息流。
  • 三个判断:KDA state 是固定大小的递推矩阵,与 KV Cache 属于两类对象;层序为 KDA×3 → MLA×1 重复 23 次、末尾再补一层 MLA;MXFP4 的作用范围限于 routed expert 权重。
  • 核心模型:2.78T total / 104.2B activated,93 层,hidden size 7168,96 heads,896 routed experts、top-16、2 shared experts,最大上下文 1,048,576。
  • 边界:报告固定为 2607.24653v1;2026-09-20 复核发布配置与 Transformers 参考实现,版本为 f831ab66。生产系统描述来自报告,本文没有提供独立的 GPU 性能实测。

第一次阅读可按第 1–6 节理解架构,再接第 11–14 节看执行路径;关心训练时补读第 7–10 节。只想评估 serving 成本,可以先看第 3.4、11.4 和 12 节。

Kimi K3 一次前向的架构主线

图 1 · 一次前向中的三条信息通路 依据技术报告整理的机制示意:KDA/MLA 作用于序列,AttnRes 作用于深度,LatentMoE 作用于宽度;箭头不表示实测耗时。

1. 先冻结真实配置

参数规模采用技术报告 Table 1 的统计口径,层数、维度与路由配置对照发布版 config.json。报告中的圆整说法是 2.8T / 104B,表格口径是 2.78T / 104.2B;不能由一个激活参数量直接换算 TTFT 或 TPOT。

维度Kimi K3解释
总参数2.78T大部分位于 routed experts
每 token 激活参数104.2B每 token 只走这条计算路径
Transformer 层数9369 KDA + 24 Gated MLA
Hidden size7168与 Kimi K2 相同
Attention heads96KDA head dim 为 128
Routed experts896每层专家池
Active routed experts16/token稀疏度为 896/16 = 56
Shared experts2每 token 都执行
LatentMoE width3584full width 的 0.5×
Expert intermediate3072routed expert 的 GLU 中间维度
Dense FFN layers1仅第 1 层为 dense,其余层走 MoE
Vocabulary163,840配置中的 vocab_size
最大上下文1,048,576即 1M token
ViT401M / 27 层patch size 14,12 heads
AttnRes block size12 层8 个 layer blocks,另含 embedding source
表 1 · 发布模型的结构参数 参数量来自报告 Table 1;结构字段对照 f831ab66/config.json。上下文单位为 token,参数量不等于驻留显存。

1.1 真实层序

发布配置明确列出全局注意力层:

4, 8, 12, ..., 88, 92, 93

因此前 92 层是 23 个四层混合组:

Layer 1  KDA
Layer 2  KDA
Layer 3  KDA
Layer 4  Gated MLA
...
Layer 89 KDA
Layer 90 KDA
Layer 91 KDA
Layer 92 Gated MLA
Layer 93 Gated MLA   # 额外的最终全局层

这恰好得到 23 × 3 = 69 个 KDA 和 23 + 1 = 24 个 MLA。最后再放一个 MLA,是为了保证 backbone 的最终层一定执行全局注意力。

两种 block 的所指

KDA/MLA 的“四层混合组”描述 token mixing 的排列;AttnRes 的“12 层 block”描述 depth mixing 的缓存和聚合边界。前者作用于 token 维,后者作用于深度维。

2. 沿一次前向过程看 K3

输入首先变成共享 hidden states,然后依次通过 93 个 attention + FFN/MoE 层:

文本 token ───────────────┐
                          ├─> shared embeddings
图像/视频 -> MoonViT-V2 -> MLP projector ┘
  -> AttnRes 选择本层输入
  -> RMSNorm
  -> KDA 或 Gated MLA
  -> 更新当前 AttnRes block 的 prefix sum
  -> AttnRes 再选择 MoE 输入
  -> RMSNorm
  -> Dense FFN(仅首层)或 Stable LatentMoE
  -> 更新 block prefix sum
  -> 下一层
  -> final AttnRes -> RMSNorm -> LM Head

标准 PreNorm Transformer 只有单一 residual stream;K3 的 hidden_states 更像当前 12 层 block 内的部分和,同时保存此前 block 的表示。每个 attention 和 MoE 子层开始前,AttnRes 都会重新决定“从哪些深度取信息”。

3. KDA:把历史写进固定状态

3.1 状态更新公式

对单个 head,令 qt,ktRdkq_t,k_t\in\mathbb{R}^{d_k}vtRdvv_t\in\mathbb{R}^{d_v},状态 StRdk×dvS_t\in\mathbb{R}^{d_k\times d_v}。KDA 的一步更新为:

St=(Iβtktkt)Diag(αt)St1+βtktvt,o~t=Stqt.S_t= \left(I-\beta_t k_tk_t^\top\right) \operatorname{Diag}(\alpha_t)S_{t-1} +\beta_t k_tv_t^\top, \qquad \tilde{o}_t=S_t^\top q_t.

可以把它拆成三个动作:

  1. Diag(α_t):每个 key channel 独立遗忘旧状态;
  2. I - β_t k_t k_tᵀ:先擦除旧状态在当前 key 方向上的内容;
  3. β_t k_t v_tᵀ:再把当前 value 写到该 key 方向。

等价的直觉形式是:

St=DtSt1+βtkt(vtktDtSt1),Dt=Diag(αt).S_t=D_tS_{t-1}+\beta_tk_t\left(v_t^\top-k_t^\top D_tS_{t-1}\right), \qquad D_t=\operatorname{Diag}(\alpha_t).

括号里的量是“希望写入的 value”和“当前状态已经读出的 value”之间的误差。这就是 delta rule:按误差量修正一份有限状态。

3.2 q、k、v、α、β 从哪里来

官方参考实现的主路径是:

x
├─ Wq -> ShortConv(k=4) -> Swish -> L2Norm -> q
├─ Wk -> ShortConv(k=4) -> Swish -> L2Norm -> k
├─ Wv -> ShortConv(k=4) -> Swish          -> v
├─ low-rank decay projection              -> α
└─ Wβ -> Sigmoid                          -> β

ShortConv 给 KDA 一个很短的局部时序感受野;递推状态负责压缩更长历史。βt\beta_t 控制当前 token 的写强度,αt\alpha_t 则是细到每个 key channel 的保留率。

K3 把 log-decay 改为有下界的参数化:

gt=gminSigmoid(eAzt),αt=exp(gt),gmin=5.g_t=g_{\min}\operatorname{Sigmoid}(e^Az_t), \qquad \alpha_t=\exp(g_t), \qquad g_{\min}=-5.

于是每步 retention 都满足 αt,j>e5\alpha_{t,j}>e^{-5}。这项下界同时带来 kernel 收益:16-token tile 的累计 log-decay 被限制在 (80,0)(-80,0),倒数缩放落在 BF16 动态范围内,对角 tile 因此可以直接用 Tensor Core dense matmul 一次算完。

3.3 K3 相比 Kimi Linear 的另一项变化

KDA 输出先做 head-wise RMSNorm,再乘输入相关的 full-rank gate:

yt=Wo[Sigmoid(Wgxt)RMSNorm(o~t)].y_t=W_o\left[\operatorname{Sigmoid}(W_gx_t)\odot \operatorname{RMSNorm}(\tilde{o}_t)\right].

Kimi Linear 使用低秩输出门;K3 改成 full-rank,让每个 token 独立调制读出的各个 channel。

3.4 KDA state 与 KV Cache 的本质区别

对象规模随上下文表示什么Decode 动作
Full/MLA KV Cache线性增长 O(S)O(S)每个历史 token 的可检索表示当前 query 读取历史 entries
KDA recurrent state恒定 O(1)O(1)全部历史压缩后的矩阵状态原地更新一个固定矩阵
ShortConv state恒定 O(1)O(1)最近几个投影 token更新长度 4 的局部窗口
表 2 · 三种历史状态的生命周期 比较单个请求、固定模型结构下随上下文长度 S 的增长;不包含额外 checkpoint 或副本。
K3 配置为 96 heads、$d_k=d_v=128$。单个 KDA 层、单个请求的主 recurrent state 逻辑元素数为: 96×128×128=1,572,864.96\times128\times128=1{,}572{,}864.

若只按 BF16 payload 粗算约为 3 MiB/层;69 层约 207 MiB/请求,此外还有 ShortConv state、对齐、分片、checkpoint 和运行时副本。这是根据公开 shape 的逻辑量推导,生产 resident memory 需以实测为准。

4. 为什么仍然需要 Gated MLA

KDA 的优势与代价同源:状态大小恒定,代价是任意长历史都被压缩进一个有限矩阵,历史 token 因此失去 softmax attention 那种独立寻址入口。

K3 于是保留 24 层 Gated MLA,让它周期性承担全局内容检索:

KDAGated MLA
固定 recurrent state随 token 增长的 latent KV
强于顺序、局部与 recency mixing强于跨长距离的全局内容寻址
Decode 成本与历史长度解耦读取全局历史,缓存表示已压缩
NoPE 下隐式携带位置线索K3 中同样使用 NoPE,位置敏感性由 KDA 层提供
表 3 · 混合层的职责分工 机制层面的对照;全局寻址能力与递推压缩分别保留,不表示单项性能排名。
MLA 先把 hidden state 压缩为 latent: ct=Wcxt,c_t=W_cx_t,

再上投影为各 attention heads 的 content key/value。K3 的 MLA 走 NoPE,在每 3 个 KDA 层之后读取一次全局内容。扩展到 1M context 时因此省去 RoPE base 调整与 YaRN。

MLA 输出也使用 full-rank channel gate:

yt=Wo[Sigmoid(Wgxt)o~t].y_t=W_o\left[\operatorname{Sigmoid}(W_gx_t)\odot\tilde{o}_t\right].

所以“Gated MLA”的 gate 作用在 attention 输出的 channel 维度上,由当前输入决定开合。

4.1 与 Full Attention、MLA、DSA 的对照

机制历史表示每步访问长上下文主要代价
Full Attention完整逐 token K/V全历史KV 容量与 dense attention
MLA逐 token latent KV全历史cache 变小,访问长度仍为 SS
DSA逐 token latent KV + indexer选出的 top-k 历史索引扫描、稀疏 gather 与 cache
KDA固定 recurrent state当前 state状态更新串行依赖与大 state 流量
K3 Hybrid69 层 KDA + 24 层 MLA多数层读 state,周期性读全历史两类 cache、两套 kernel 与一致性管理
表 4 · 历史表示与访问方式 此处的 DSA 指基于 indexer 的稀疏全局访问;复杂度描述不替代具体 kernel 的耗时。
表中 DSA 指 DeepSeek Sparse Attention,此处仅作“稀疏选择历史”的对照,属于 K3 之外的方案。DSA 削减主 attention 参与计算的 token 数,代价留在 indexer 与逐 token cache;KDA 则直接改变历史的表示形式。

5. AttnRes:沿网络深度做 Attention

普通 residual connection 把所有前层信息累加进一个 hidden state。层数增加后,早期表示容易被连续归一化和残差累加稀释。AttnRes 把深度看成另一条可检索序列。

5.1 Full AttnRes

ll 层使用一个可学习 pseudo-query wlw_l,对 embedding 与所有前层输出计算 softmax 权重:

αil=exp(wlRMSNorm(vi))j<lexp(wlRMSNorm(vj)),hl=i<lαilvi.\alpha_{i\to l}= \frac{\exp\left(w_l^\top\operatorname{RMSNorm}(v_i)\right)} {\sum_{j<l}\exp\left(w_l^\top\operatorname{RMSNorm}(v_j)\right)}, \qquad h_l=\sum_{i<l}\alpha_{i\to l}v_i.

它的 depth arithmetic 只有 O(L2d)O(L^2d)L=93L=93 时开销很小;真正的瓶颈是保存所有层输出带来的 O(Ld)O(Ld) activation 和 pipeline communication。

5.2 Block AttnRes

K3 每 12 层形成一个 block,将 block 内输出累加为一个 prefix_sum,跨 block 只保存 block representation。对每个 attention/MoE 子层:

历史 block representations + 当前 block prefix_sum
  -> RMSNorm keys
  -> 本层 pseudo-query 打分
  -> softmax over depth
  -> 加权合成为本子层输入

93 层形成 8 个 layer blocks,其中最后一个为 9 层;再把 embedding 作为第 0 个 source,共得到 9 个 block-level sources。内存与通信从 O(Ld)O(Ld) 降为 O(Nd)O(Nd)

6. Stable LatentMoE:沿宽度扩展专家空间

6.1 一次 routed path

对每个 token xR7168x\in\mathbb{R}^{7168}

x
├─ two shared experts at full width ----------------------┐
└─ router: Sigmoid(Wr x)                                  │
   -> bias-corrected top-16 of 896                        │
   -> W_down: 7168 -> 3584                                │
   -> dispatch to 16 latent experts                       │
   -> weighted combine -> RMSNorm -> W_up: 3584 -> 7168  │
                                                          ├─> add
shared path ----------------------------------------------┘

LatentMoE 的关键是:router 仍看 full-width hidden state,routed expert 则只处理 3584 维 latent。EP payload 与每个专家的权重流量都按 latent 宽度计费,active expert 数因此可以放到 16。

6.2 三个“Stable”控制点

  1. Normalized LatentMoE:16 个 routed expert 聚合后先 RMSNorm,再做 W_up,压住各种路由组合造成的尺度漂移。
  2. SiTU-GLU:对 gate branch 和 up branch 分别 soft-cap,K3 使用 β1=4\beta_1=4β2=25\beta_2=25,把 SwiGLU 两个无界分量的乘积约束在有限范围。
  3. Quantile Balancing:用专家 bias 调整下一批 token 的 top-k 选择,使每个专家接近目标负载;bias 只影响选择,mixture weight 仍取原始 router 分数,推理时冻结。

SiTU-GLU 为:

[β1tanh(Wgxβ1)Sigmoid(Wgx)][β2tanh(Wuxβ2)].\left[\beta_1\tanh\left(\frac{W_gx}{\beta_1}\right) \odot\operatorname{Sigmoid}(W_gx)\right] \odot \left[\beta_2\tanh\left(\frac{W_ux}{\beta_2}\right)\right].

Quantile Balancing 用直方图近似全局 quantile:每个 expert 维护一份 histogram,各 rank 的 bin counts 做一次 all-reduce 即可,省去收集全部 margin。

7. 原生视觉路径

K3 从预训练第一步就联合优化文本 backbone 与 MoonViT-V2,视觉编码器与语言模型同期成长。

  • MoonViT-V2:27 层、约 401M 参数、12 heads、patch size 14;
  • 从随机初始化开始直接用 next-token prediction 训练;
  • 图像和视频共享参数,attention 分为空间与时间两部分;
  • 投影前做 2×2 pixel shuffle,视觉 token 数减少 4 倍;
  • 支持最高 3584×3584 输入;
  • 轻量 MLP projector 将视觉特征映射到 LLM embedding space。

报告的消融显示,从头训练的 MoonViT-V2 相比 SigLIP 初始化的 MoonViT-3D 具有更低、更少尖峰的 gradient norm,同时视觉评测相当。该结论的适用范围限于 K3 的训练方案。

8. 架构是怎样确定的

公开证据可以支持三层结论:

  1. 前身实验:Kimi Linear 在相同训练 recipe 下比较 KDA–MLA hybrid 与 full MLA,报告 hybrid 在短上下文、长上下文和 RL scaling 中都有质量优势,并在 1M context 展示更低 KV 占用和更高 decode throughput。
  2. K3 scaling law:团队为新架构重新搜索 batch size、learning rate、tokens-per-parameter 和 model shape;cosine 与 WSD 各自寻优后再比较。
  3. 最终联合收益:K3 技术报告披露的口径是“架构、数据与训练 recipe 合计约 2.5× scaling efficiency”,模块级归因留给后续消融。

所以合理的表述是:K3 建立在小模型与缩放实验之上,2.5× 属于整体收益。

9. 训练系统

9.1 预训练 recipe

  • 文本、图像和视频从训练开始就在同一 next-token objective 下联合优化;
  • matrix parameters 使用 Per-Head Muon,attention 的 Q/K/V momentum 按 head 分块正交化;
  • cosine learning-rate decay,1% linear warmup,weight decay 0.1;
  • 预训练先使用 8K context,随后扩到 64K;
  • long-context cooldown 再按 256K → 1M 扩展。

K3 全 backbone 使用 NoPE,位置信息由 KDA 的卷积、递推门控和 decay 隐式提供,扩到 1M 时因此省去位置编码的重新标定。训练数据侧通过长文档/视频清洗、去重、感知哈希、质量过滤和合成长程依赖任务,把长程依赖压进训练信号。

9.2 3T MoE 并行与 MoonEP

报告公开的训练并行组合包括:

PP + virtual pipeline stages
+ EP
+ ZeRO-1 data parallelism
+ Pipeline ZeRO-2 gradient sharding
+ Context Parallelism

具体并行度属于内部配置。MoE 侧使用 MoonEP:根据当前 micro-batch 路由结果动态复制少量热点 experts,使每个 EP rank 精确接收相同的 sequence × top-k token 数。平衡后每层 shape 静态已知,host 逐层读取 expert token count 的同步随之省去。

MoonEP 还将 token 直接送到远端 expert-grouped buffer,路径上省去中间 copy;routed expert GEMM 使用 workload-aware 调度,共享 expert 放到独立 stream 与其他工作重叠。

9.3 KDA Context Parallelism

普通 linear attention 的 additive state 可以直接对 rank 局部结果求前缀和;KDA 的 token-dependent transition 会改变传入 state,各 rank 从零算出的状态因此需要先乘上累计 transition 再组合。

KDA Context Parallelism(KCP)让每个 rank 独立计算两项:

  1. 本段 token 对输入 state 的累计 transition;
  2. 从零状态出发生成的本地 state。

这些 rank-level updates 可结合,因而通过一次固定大小的 all-gather 和有序 prefix scan,精确恢复各 rank 的输入 state。KCP 同步的是固定大小 transition/state fragments;softmax CP 传输的 KV blocks 则随序列增长。

9.4 MXFP4 QAT 的准确边界

MXFP4 的生效区间是 post-training:从 SFT 开始贯穿全程,预训练仍走高精度。

模块部署/后训练精度
Routed expert weightsMXFP4,group size 32
Routed expert input activationsMXFP8
Attention projections更高精度
LatentMoE down/up projections更高精度
Shared experts更高精度
Router、LM Head、Vision更高精度
表 5 · MXFP4 的作用范围 来自 K3 报告的后训练与部署精度说明;不能把 routed experts 的格式推广到整个模型或 recurrent state。
RL rollout 与训练共用同一量化方案,让 train 与 inference 的数值路径保持一致。发布配置的 `ignore` 规则同样把 attention、shared experts、非 routed-expert MLP、LM Head、vision tower 和 projector 留在高精度。

10. Agentic RL

K3 先用 SFT 建立 agent cold start,再按三个领域与三个 reasoning effort 训练九个专家策略:

general tasks × {low, high, max}
general agents × {low, high, max}
coding agents × {low, high, max}

随后用 Multi-Teacher On-Policy Distillation 合并回一个模型。长任务使用 partial rollout:一部分轨迹完成后先进入更新,其余轨迹暂停并在后续 iteration 恢复,更新节奏因此与长尾任务解耦。

1M agentic trajectory 的系统重点落在跨 iteration 的状态保存:

  • active decode blocks 留在 GPU;
  • GPU 驱逐的可复用 prefix 以 write-back 方式进入 CPU DRAM;
  • KDA states 与对应 MLA KV blocks 一起 offload/prefetch;
  • scheduler 根据 active/queued requests 和 KV utilization 动态限流;
  • AgentENV 用 microVM 保存工具环境,支持 pause/resume、fork 和增量 snapshot。

11. 推理系统:Prefill 与 Decode 分别做什么

11.1 Prefill

Prefill 处理本轮未命中的 prompt/视觉 tokens:

  1. MoonViT-V2 编码图像/视频并投影到共享 embedding;
  2. KDA 层生成 q/k/v、ShortConv state、decay 和 write gate;
  3. FlashKDA 在 chunk 内并行,在 chunk 间传播 recurrent state;
  4. MLA 层对完整可见 prefix 执行 global attention 并写入 MLA cache;
  5. 每层执行 AttnRes 与 Dense/Stable LatentMoE;
  6. 保存最终 KDA states、ShortConv states 和 MLA KV 供 decode 使用。

KDA kernel 的 chunk 是算子内部的并行单位,与 serving scheduler 的 chunked prefill 分属两个层面。超长 prefill 时纯 TP 只切 heads,递推链长度保持原样;K3 因此叠加 device 内与跨设备 context parallelism 来切 sequence。

11.2 Decode

Decode 每步只推进新 token:

  1. KDA 读取并原地更新固定 recurrent state;
  2. MLA 把新 latent KV 追加进 cache,并读取历史做 global attention;
  3. AttnRes 从缓存的 block representations 与当前 block partial sum 选择输入;
  4. Stable LatentMoE 为 token 选择 16 个 routed experts,加上 2 个 shared experts;
  5. LM Head 产生 logits,采样后进入下一步。

所以 K3 的 cache 是混合形态:69 个 KDA 层持有固定 state,24 个 MLA 层持有随上下文增长的 KV。

11.3 MTP / EAGLE-3 与 KDA 回滚

报告称 K3 预训练了一个与 backbone block 同结构的 MTP layer,post-training 时将它微调为 EAGLE-3-style draft model,训练时展开 7 steps。

投机验证给 KDA 带来一条额外约束:state 随每个 draft token 原地推进,reject 后需要重建,而 KV Cache 只需截断。生产方案只缓存体积更小的 projected inputs;验证结束后在片上 replay 被接受的 token,重建正确 state,再写回 verified/bonus token 状态。

发布的目标模型 config.jsonnum_nextn_predict_layers=0,即公开 target checkpoint 把 next-N layer 留在配置之外;报告中的 draft serving 路径应视为独立的 draft artifact 与系统能力,实际开启状态需另行确认。

11.4 从结构推到成本:先数状态,再找关键路径

第 3.4 节得到的 207 MiB 是单请求、69 层、BF16 主 recurrent state 的逻辑容量。把它放进混合模型,只能得到下面这个有条件的缓存模型:

Mhistory(S)207MiB+24ScMLA+Mother.M_{\mathrm{history}}(S) \approx 207\,\mathrm{MiB}+24S\,c_{\mathrm{MLA}}+M_{\mathrm{other}}.

这里 SS 是该请求保留的上下文 token 数,cMLAc_{\mathrm{MLA}} 是一个 MLA 层每 token 的实际缓存字节数;MotherM_{\mathrm{other}} 包含 ShortConv、checkpoint、元数据等。公式没有计入权重、临时工作区,也没有指定 TP 分片或复制方式。尤其不能把参考实现展开后的 K/V 大小填成生产 latent cache 的大小。

固定容量也不等于零流量。如果一次单 token Decode 把全部主 state 从 HBM 读入、更新后完整写回,则仅这部分逻辑流量就是:

Dstate,step2×207=414MiB/request.D_{\mathrm{state,step}}\approx 2\times207=414\,\mathrm{MiB/request}.

这是一次完整读写的条件估算,不含其他算子。融合多个验证 token、片上驻留、分片和副本都会改变实际 HBM 流量。它解释了为什么 K3 的 kernel 优化特别在意 state 往返,而不是仅仅追求更少的 FLOPs。

阶段首先确认什么再判断什么
长输入 PrefillKDA chunk kernel 与 24 层 MLA 各占多少时间序列增长后,瓶颈是否转移到全局 attention 或 MoE
单步 Decodestate 实际读写量、expert 权重读取、MLA 历史读取每个 rank 的有效带宽、EP 通信及串行依赖
Prefix 命中所有 KDA group 与 MLA 是否在同一边界可用少算的 Prefill 是否超过 checkpoint 恢复和传输成本
投机验证每轮提交的正确 token 数和 replay 成本每个输出 token 摊到的 target、draft 与回滚耗时
表 6 · 将架构判断转成可验证的性能问题 分析清单,不是测量结果;比较时固定输入/输出长度、并发、硬件、精度和并行配置。

因此,K3 的收益应分别在长输入 TTFT、稳定 Decode TPOT、相同 SLO 下吞吐三个口径上验证。不能用“69 层是线性 attention”推出整网线性 Prefill,也不能用更低的 KV 容量推出同比例的速度提升。

12. 混合 Cache 与 Prefix Reuse

K3 prefix 只有在同一 token 边界同时具备 MLA KV 和全部 KDA state checkpoint 时才可复用。

12.1 统一 paged pool

生产系统把两种数据放进同一 paged block pool:

  • MLA pages:逐 token 增长;
  • KDA pages:每请求固定 state,heads 连续存放;
  • allocation、reference count、eviction 使用同一实现;
  • P/D 两端 TP 规模有差异时,在 transfer path 做 re-layout。

“统一 pool”统一的是生命周期与分配器,两种 payload 各自保留自己的形态。

12.2 hash 粒度与物理页解耦

KDA checkpoint 体积很大,保存粒度因此比 token block 粗。报告把物理页扩大到 1024–6144 tokens,把 prefix hash endpoint 保持在更细粒度,例如 512 tokens:

6144-token physical page
  └─ 12 × 512-token hash endpoints
       └─ 只在部分 endpoint 保存 KDA checkpoint

查找先匹配 MLA hash,再要求每个 KDA cache group 在同一边界都有 checkpoint;最终命中二者共同满足的最长边界。conversation-turn boundaries 是保留 KDA checkpoint 的自然位置。

并发下还必须保证:命中块先统一 pin;正在分配或复制中的块推迟到完成后才参与匹配;任一 KDA group 驱逐 checkpoint 时,其 sibling checkpoints 一起失效。

13. FlashKDA 与专用 Kernel

13.1 Training / Prefill kernel

公开的 FlashKDA 是 CUTLASS chunkwise kernel,面向 SM90+、CUDA 12.9+。K3 版本使用 16-token chunk:

  • 16-token 累计 decay 可安全落在 BF16 范围;
  • 16×1616\times16 inverse 可以用较便宜的 Neumann-series;
  • token-parallel K1 与 head-parallel recurrent K2 拆成两个 kernel,各自匹配自己的并行维度;
  • state 在片上以 BF16 保存,state update 使用 FP32 FMA;
  • K2 用寄存器内 transpose,减少 shared-memory round trip。

FlashKDA 仓库暴露的 state shape 是 [B, H, V, K],当前要求 K=V=128,与 K3 发布配置一致。

13.2 Decode kernel

生产 decode kernel 把 ShortConv、输入归一化、gate、KDA recurrence 和输出归一化放进一个 recurrent loop;投机解码还把 replay、bonus token 与下一 draft window 合并。优化目标是压低大 state 的 HBM 往返次数,token 维并行度维持原样。

13.3 AttnRes 与 MoE kernel

  • AttnRes Prefill:TP all-reduce 拆成 reduce-scatter + all-gather,在中间对 sequence-sharded hidden states 执行 intra-block kernel,让每个 TP rank 只持有自己分片的 block representations;
  • AttnRes Decode:inter-block pass 放 side stream,与主流独立工作重叠;intra-block merge、partial sum 和 RMSNorm 融进 TP all-reduce;
  • LatentMoE:down-projection 与 router 合成一个 GEMM;latent weights 跨 rank 切分,all-gather 融入 GEMM epilogue;小 batch expert decode 使用 token-centric weight streaming。

14. 官方参考实现与生产实现的边界

发布在 Hugging Face 的 modeling_kimi_linear.py 很适合核对控制流:

  • q_len > 1chunk_kda,cached single-token decode 调 fused_recurrent_kda
  • KimiDynamicCache 同时维护 KDA recurrent/conv states 与 attention cache;
  • layer 依据配置在 KimiDeltaAttentionKimiMLAAttention 间切换;
  • AttnRes 确实在 attention 前、MoE 前和最终输出处执行。

这份 Transformers 代码的定位是可读参考路径,与技术报告中的生产 serving engine 分属两条实现:参考 MLA path 先展开 head-specific K/V 再交给通用 cache,生产路径缓存 latent 表示并统一管理 KDA/MLA pages。评估某个开源部署时,应以实际运行的路径统计显存和性能,不能直接套用报告中生产路径的容量数字。

15. 目前能下的结论

  1. K3 的核心是 KDA state + 周期性 global MLA + depth attention + latent experts 的组合,单个 KDA 算子只是其中一环。
  2. KDA 把大多数层的历史从逐 token cache 变为固定状态,而每请求状态本身很大,系统优化重点也从“扫描长 KV”转向“少搬大 state”。
  3. Gated MLA 承担有限状态之外的全局内容检索,属于架构必需项。
  4. Stable LatentMoE 用 0.5× latent width 支撑 top-16/896 极稀疏路由;RMSNorm、SiTU-GLU、QB 分别控制尺度、激活和负载。
  5. K3 的 1M context 能力由 NoPE/KDA、渐进长上下文训练、KCP、混合 prefix cache 和 fleet scheduling 共同支撑,attention 公式只是其中一层。
  6. 公开资料足以建立结构和成本模型;生产 TP/EP 配置、端到端 TTFT/TPOT 以及各模块对 2.5× scaling efficiency 的独立贡献,需要进一步实测。

后续验证问题

  • 发布权重是否另有官方 EAGLE-3 draft artifact,其接受率和实际 speculative window 是多少?
  • 生产 MLA page 的真实 bytes/token、KDA checkpoint dtype 与每请求 resident state 是多少?
  • KDA/MLA cache group 如何映射到 TP、P/D 节点和跨节点 transfer heads?
  • FlashKDA、production recurrent decode kernel 与开源 vLLM/SGLang 路径之间有哪些功能和性能差距?
  • 在相同质量、硬件和并行配置下,K3 hybrid 相对 full MLA / DSA 的 FLOPs、HBM 和端到端收益各是多少?

这些问题适合进入下一阶段仿真与 Trace 验证;本文先冻结架构和执行语义。

相关页面

主要来源

修改历史3 次提交