Kimi K3:KDA、注意力残差与 Stable LatentMoE

Kimi K3 是 Moonshot AI 在 2026 年 7 月发布的旗舰模型,接在 K2 之后:总参数 2.78T(通常说 2.8T),激活 104B,原生视觉,上下文 1M token,权重全部开源。架构、数据和训练配方的改进合起来,相对 K2 带来约 2.5 倍的整体缩放效率。

和 K2 相比,K3 几乎每个部件都换了:注意力从全 MLA 换成 Kimi Linear 的 KDA–MLA 混合(并对 KDA 做了两处改动);残差连接换成“注意力残差”(AttnRes);MoE 换成 896 个专家、每 token 激活 16 个的 Stable LatentMoE,配上新激活函数 SiTU-GLU 和新的负载均衡方法分位数均衡(Quantile Balancing);优化器变成逐头 Muon。后训练是按领域和推理强度训练 9 个专家再做多教师在线蒸馏,基础设施则围绕“3T 级 MoE + 1M 上下文 Agent RL”重做了一遍。

1. 全貌:K2 与 K3 对照

K3 与 K2 的架构对照:

项目Kimi K2Kimi K3
层数6193
总参数 / 激活参数1.04T / 32.6B2.78T / 104.2B
隐藏维度71687168
Latent MoE 维度—3584(0.5×)
每个专家的 FFN 中间维20483072
路由专家 / 每 token 激活 / 共享专家384 / 8 / 1896 / 16 / 2
注意力头数6496
Dense 层数11
词表160K160K
训练上下文128K1M
注意力层构成61 MLA69 KDA + 24 MLA
激活函数SwiGLUSiTU-GLU
MTP 层11
ViT—27 层,401M,patch 14,12 头

93 层是这样拼出来的:每个 block 是 3 层 KDA + 1 层 Gated MLA,共 23 个 block,得到 69 KDA + 23 MLA;骨干末尾再加一层 Gated MLA,保证最后一层总是全局注意力,合计 24 MLA、93 层。

这些改动可以归结为在三个维度上“扩展信息流”:序列(KDA + Gated MLA 的混合注意力)、深度(注意力残差)、宽度(Stable LatentMoE)。

2. 混合注意力:KDA 的两处改动与 Gated MLA

2.1 KDA 回顾

K3 的大部分层是 KDA(Kimi Delta Attention),一种线性注意力:它不保留所有历史 token 的 KV cache,而是维护一个固定大小的状态矩阵 \(S_t\),每来一个 token 就更新一次(delta 规则、分块算法和 3:1 混合的推导见 Kimi Linear)。递推是(单头,\(d_k=d_v\))

$$S_t = \big(I-\beta_tk_tk_t^\top\big)\operatorname{Diag}(\alpha_t)S_{t-1} + \beta_tk_tv_t^\top,\qquad \tilde o_t = S_t^\top q_t ,$$

\(\alpha_t\in(0,1)^{d_k}\) 是逐通道的一步保留率,\(\beta_t\in(0,1)\) 是 delta 规则的写入强度。\(q,k\) 经过 ShortConv、Swish、L2Norm,\(v\) 经过 ShortConv、Swish,\(\beta_t\) 是 sigmoid。衰减的 logit 由低秩投影加每头的偏置给出:\(z_t^h = W_\alpha^{\uparrow}W_\alpha^{\downarrow}x_t + b_\alpha^h\in\mathbb R^{d_k}\)。训练用分块形式,块内的输出是

$$O_{[t]} = (\Gamma\odot Q_{[t]})S_{[t]} + \operatorname{Tril}\big[(Q_{[t]}\odot\Gamma)(K_{[t]}/\Gamma)^\top\big]\big(U_{[t]}-W_{[t]}S_{[t]}\big).$$

2.2 改动一:有下界的衰减

问题出在 \(K/\Gamma\):\(\Gamma\) 是保留率的累积乘积,它的倒数随块内位置指数增长,有限精度下会溢出。Kimi Linear 的处理是在对数域算相对衰减,再把块切成 16 个 token 的二级小块:非对角的小块可以直接用 Tensor Core 做稠密矩阵乘;对角的小块(相对位置跨度包含 0 的那部分)仍需要按位置对显式计算,这是块内计算的主要瓶颈。

K3 换掉了从 logit 到对数衰减 \(g=\log\alpha\) 的映射:

$$\text{Kimi Linear:}\ g_t^h = -e^{A_h}\operatorname{Softplus}(z_t^h)\in(-\infty,0),\qquad \text{K3:}\ g_t^h = g_{\min}\operatorname{Sigmoid}\big(e^{A_h}z_t^h\big)\in(g_{\min},0),\qquad \alpha_t^h = e^{g_t^h}.$$

\(A_h\) 是可学习的每头对数尺度(初始化为 0),\(g_{\min}=-5\) 固定。于是每个保留率 \(\alpha>e^{-5}\approx 6.7\times10^{-3}\),一个 16-token 小块内的累积对数衰减落在 \((-80,0)\),倒数小于 \(e^{80}\)。BF16 的最大有限值约 \(3.39\times10^{38}\approx e^{88.7}\),所以倒数一定在 BF16 范围内。有了这个有限范围,对角小块也能直接用稠密 Tensor Core 矩阵乘,按位置对计算的路径被整个去掉。

代价是模型不再能在一步之内“完全清空”某个通道(最少保留 0.67%)。不过一个通道连续几步都取下界,几步之后也就几乎清零了(例如 4 步后 \(e^{-20}\approx 2\times10^{-9}\))。这种参数化和 RNN 文献里“有下界的循环门”是同一类思路。

交互演示 · 衰减参数化与 BF16 范围
Kimi Linear:−eA·Softplus(z)K3:gmin·Sigmoid(eAz)gmin
最小保留率 egmin–
小块内最大倒数 e−gmin·tile–
BF16 最大值 ≈ e88.7–
Softplus 映射在 z=20 时一步的 g–

倒数上界 = exp(−gmin×小块长度)。K3 的取值(gmin=−5、小块 16)给出 e80,在 BF16 范围内。把 gmin 调得更负或小块调得更长,就会越界。Softplus 映射没有下界,z 稍大一步就能把 g 推到很负。

2.3 改动二:全秩输出门

输出门决定每个通道读出多少。Kimi Linear 的输出门是低秩的(\(W_g^{\uparrow}W_g^{\downarrow}\)),K3 改成输入相关的全秩投影:

$$y_t = W_o\big[\operatorname{Sigmoid}(W_gx_t)\odot\operatorname{RMSNorm}(\tilde o_t)\big].$$

2.4 Gated MLA

全局注意力层仍是 MLA(只缓存压缩隐向量 \(c_t=W_cx_t\),用上投影重建 key/value)。和 K2、K2.5 不同,K3 按 Kimi Linear 的做法对所有 MLA 层用 NoPE:查询和键都不加位置编码,位置与近因信息完全由 KDA 层提供,MLA 层只负责不受限制的全局内容交互。这样扩展上下文时不用重调 RoPE 底数或 YaRN。

MLA 也加了一个与 KDA 一致的、输入相关的逐通道全秩输出门:

$$y_t = W_o\big[\operatorname{Sigmoid}(W_gx_t)\odot\tilde o_t\big],$$

让每个 token 能调节它从全局注意力读出的通道。另一个细节:flash attention 在低精度下的舍入误差是有偏的,为了消除它,训练时注意力输出保持 FP32。这让输出 tile 的片上占用翻倍,于是他们重新设计了训练 kernel,让输出 tile 与 KV 暂存缓冲区复用(而不是与 query tile 复用),腾出共享内存给更深的 KV 流水线,反而提高了吞吐。

3. 注意力残差:在深度上做注意力

3.1 动机

标准的(PreNorm)残差连接 \(h_{l+1}=h_l+f_l(\cdot)\) 把之前所有层的输出以固定的单位权重累加到一个状态里。可以这样类比:这像是 RNN 在时间上把所有历史压进一个隐状态;Transformer 在序列维上用注意力替代了循环,AttnRes 就在深度维上做同样的事——每层按数据相关的权重,有选择地取用之前各层的输出。均匀累加还有一个具体问题:隐状态随深度不受控地增长,每一层的贡献被逐层稀释(PreNorm dilution)。

3.2 完整形式

第 \(l\) 层有一个可学习的伪查询 \(w_l\in\mathbb R^d\)(不依赖输入),key 和 value 都是之前的层输出:

$$k_i = v_i = \begin{cases} h_1 & i=0\ (\text{token embedding})\\ f_i(h_i) & 1\le i\le l-1\end{cases},\qquad \alpha_{i\to l} = \frac{\exp\big(w_l^\top\operatorname{RMSNorm}(k_i)\big)}{\sum_{j=0}^{l-1}\exp\big(w_l^\top\operatorname{RMSNorm}(k_j)\big)},\qquad h_l = \sum_{i=0}^{l-1}\alpha_{i\to l}\,v_i .$$

RMSNorm 防止输出幅度大的层主导权重。注意权重虽然由固定的 \(w_l\) 打分,但因为 key 是当前 token 在各层的实际输出,所以权重对每个 token 不同(输入相关)。深度不到 100 层,\(O(L^2d)\) 的计算可以接受;真正的开销是要把所有层的输出一直保留(\(O(Ld)\) 显存),在流水线并行下还要跨 stage 传输。

3.3 分块形式(Block AttnRes)

把 \(L\) 层分成 \(N\) 个块。块内的层输出直接求和成一个块表示 \(b_n=\sum_{j\in\mathcal B_n}f_j(h_j)\),\(b_0=h_1\)(embedding 总是一个源)。块 \(n\) 的第 \(i\) 层在以下 value 上做注意力:

$$V = \begin{cases}[b_0,\dots,b_{n-1}] & i=1\\ [b_0,\dots,b_{n-1},\ b_n^{i-1}] & i\ge2\end{cases}$$

其中 \(b_n^{i-1}\) 是块内前 \(i-1\) 层的部分和。显存与通信从 \(O(Ld)\) 降到 \(O(Nd)\)。推理时,“对已完成的块做注意力”可以并行地一次算出,再用 online softmax 与块内顺序累积的部分和合并,显著降低推理开销。经验上 \(N\approx8\) 就能拿回大部分收益。K3 用 8 个 12 层的块(96 > 93,所以最后一块是不满的),算上 embedding 共 9 个源。

b₀=emb 块 1(12 层)求和 → b₁ 块 2求和 → b₂ 块 n 的第 i 层 softmax(w_l · RMSNorm(·)) 加权 源:b₀…b_{n−1} 与部分和 b_n^{i−1} 块间并行算,块内 online softmax 合并 显存 O(Nd) 而非 O(Ld)
Block AttnRes:每层对“embedding + 已完成块的和 + 本块部分和”做 softmax 加权。

4. Stable LatentMoE

4.1 LatentMoE:路由专家在压缩空间里工作

扩大专家池和每 token 激活的专家数能扩大“专家专门化”的空间。但在普通 MoE 里每个被选中的专家都接收完整的 \(d\) 维表示,通信量和专家权重的读取量随激活专家数线性增长。LatentMoE 的做法是把模型宽度与路由专家的宽度解耦:共享专家保留全宽路径处理通用变换;路由专家在宽度为 \(\ell\) 的压缩空间里工作:

$$u = \sum_{i\in\mathcal T_k(x)}p_i\,E_i^{\text{routed}}\big(W^{\downarrow}x\big)\in\mathbb R^{\ell},\qquad y = \sum_{j=1}^{N_s}E_j^{\text{shared}}(x) + W^{\uparrow}\operatorname{RMSNorm}(u).$$

K3 中 \(d=7168\),\(\ell=3584\),\(N_s=2\),896 个路由专家激活 16 个,稀疏度 56。算一下通信:每 token 发往专家的数据量是 \(16\times3584=57344\) 个数,和 K2 的 \(8\times7168\) 完全相同——激活专家数翻倍,而通信量不变。每个路由专家的参数是 \(3\times3584\times3072\approx33\)M,92 个 MoE 层 × 896 个专家合计约 2.72T,占总参 2.78T 的绝大部分;每 token 激活的路由专家参数约 \(92\times16\times33\text{M}\approx48.6\)B。

4.2 两个失效模式

这么极端的稀疏度放大了原始设计的两个问题:

Stable LatentMoE 用三个部件对付它们:\(W^{\uparrow}\) 之前的 RMSNorm、SiTU-GLU(压激活爆炸),以及分位数均衡(负载均衡)。

4.3 归一化

原始 LatentMoE 直接对聚合后的 \(u\) 做 \(W^{\uparrow}\),而 \(u\) 的尺度随被选中的专家和路由权重变化。K3 在聚合和上投影之间插入 RMSNorm(上面公式里那个),降低路由分支对尺度变化的敏感性,再与全宽的共享分支相加。这不仅稳定了训练,还一致地改善了验证 loss 和下游指标。

4.4 SiTU-GLU

GLU 是 \(\operatorname{Sigmoid}(W_gx)\odot W_ux\);SwiGLU 把门换成 \(\operatorname{Swish}(z)=z\,\sigma(z)\)。SwiGLU 的两个乘数都是无界的,两个大坐标同时出现就会产生激活离群值,在低精度下增加溢出风险。原始 GLU 的 sigmoid 门有界,但失去了 Swish 在正半轴近似线性的响应。K3 的折中是对 Swish 的线性因子和 up 分支都加平滑上限 \(\operatorname{softcap}(z,\beta)=\beta\tanh(z/\beta)\):

$$\operatorname{SiTU\text{-}GLU}(x) = \Big[\beta_1\tanh\!\Big(\frac{W_gx}{\beta_1}\Big)\odot\operatorname{Sigmoid}(W_gx)\Big]\odot\Big[\beta_2\tanh\!\Big(\frac{W_ux}{\beta_2}\Big)\Big],\qquad \beta_1=4,\ \beta_2=25 .$$

它有三条性质:

交互演示 · SwiGLU 与 SiTU-GLU
SwiGLU:x·σ(x)·(c x)SiTU-GLU±β1β2
输出上界 β1β2–
x=1 处相对偏差–
x=100:SwiGLU / SiTU–

横轴是 gate 分支的预激活 x ∈ [−10, 100],up 分支取 c·x(c 可调)。纵轴按对称 log 刻度显示,便于同时看清原点附近和大值。

5. 分位数均衡(Quantile Balancing)

5.1 无辅助损失的偏置均衡

K3 沿用 DeepSeek-V3 式的无辅助损失路由:路由分数 \(s_i=\operatorname{Sigmoid}(W_rx_i)\),选专家时加一个每专家的偏置 \(b_j\),但混合权重不含偏置:

$$\mathcal T_i = \operatorname{argtop}_k(s_i + b),\qquad p_{i,j} = \frac{s_{i,j}}{\sum_{r\in\mathcal T_i}s_{i,r}},\ j\in\mathcal T_i .$$

偏置只影响分派,不影响混合权重和路由器的梯度。原方法每步按负载误差的符号固定步长更新:\(b_j\leftarrow b_j+\gamma\operatorname{sign}(\bar\ell-\ell_j)\)。\(\gamma\) 小则适应慢,大则负载振荡。专家数到 896 时这个权衡很难调。

5.2 从最优均衡指派推导

符号更新的问题在于它只知道“该往哪边调”,不知道“该调多少”。要一步调到位,先把均衡路由写成一个指派问题:\(m\) 个 token、\(n\) 个专家,每个 token 选 \(k\) 个,每个专家恰好接 \(q=mk/n\) 个,最大化总分:

$$\max_{x_{ij}\in\{0,1\}}\sum_{i,j}x_{ij}s_{ij}\quad\text{s.t.}\quad\sum_jx_{ij}=k,\qquad \sum_ix_{ij}=\frac{mk}{n}.$$

二部图 b-匹配多面体是整的,所以松弛到 \(x\in[0,1]\) 不损失最优性。对两组等式约束引入乘子 \(\alpha_i\)(token 侧)、\(\beta_j\)(专家侧),交换 max 与 min 后内层可以逐元素求解:\(x_{ij}^*=1\) 当且仅当 \(s_{ij}-\alpha_i-\beta_j\gt0\)。代回得到凸的对偶目标

$$\min_{\alpha,\beta}\ \sum_{i,j}\max\big(0,\ s_{ij}-\alpha_i-\beta_j\big) + k\sum_i\alpha_i + \frac{mk}{n}\sum_j\beta_j .$$

固定 \(\beta\) 对 \(\alpha_i\) 求最小:目标关于 \(\alpha_i\) 分段线性,斜率是 \(k\) 减去“大于 \(\alpha_i\) 的 margin 个数”,所以恰好有 \(k\) 个 \(s_{ij}-\beta_j\) 在 \(\alpha_i\) 之上时最小——取第 \(k+1\) 大的值,也就是 \((1-k/n)\) 分位数。对称地,固定 \(\alpha\) 时

$$\beta_j^* = \operatorname{quantile}_{1-k/n}\big(s_{:,j}-\alpha\big),$$

即专家 \(j\) 的所有 margin 中第 \(q+1\) 大的值。两个更新都是同一个分位数,只是一个沿 token 轴、一个沿专家轴,这就是名字的来源。最优解处,token \(i\) 选中的专家恰是 \(s_i-\beta^*\) 的 Top-\(k\),所以路由只需要专家侧阈值(偏置 \(b=-\beta\)),token 侧的 \(\alpha\) 是与 batch 绑定的中间量,用完即弃。推理时就是带冻结偏置的普通 Top-\(k\)。

5.3 训练中的实际更新

每步只用一次前向:路由时把 Top-\(k\) 改成在 \(s_i+b^{(t)}\) 上取 Top-\((k+1)\),前 \(k\) 个是实际走的路由,第 \(k+1\) 个就是截断值 \(\alpha_i^{(t)}\)(专家要进入 token \(i\) 的 Top-\(k\) 必须超过它),省掉单独的 token 侧分位数计算。然后

$$\hat b_j^{(t+1)} = -\operatorname{quantile}_{1-k/n}\big(s_{:,j}-\alpha^{(t)}\big),\qquad b^{(t+1)} = \hat b^{(t+1)} - \operatorname{mean}\big(\hat b^{(t+1)}\big)\mathbf 1 .$$

第二行去掉一个不影响 Top-\(k\) 的公共偏移。为了因果性,更新只在下一步生效,一个 batch 永远不用由它自己算出的偏置来路由。

和符号更新的关系:对偶目标对 \(\beta_j\) 的次梯度是“目标负载减实际负载”,对它做 SignSGD 正好是原来的固定步长符号更新;QB 则直接跳到这个坐标的精确最小值。这解释了 QB 为什么没有类似学习率的超参,以及为什么近千个专家也能几步就平衡。另一个相关方法 BIP(基于二元整数规划的负载均衡)求解的是不等式约束版本,会多出 \(\max(0,\cdot)\) 截断,只能压制过载专家、不能提拔欠载专家,平衡慢得多。

5.4 直方图估计分位数

一个全局 batch 有数百万 token,分散在各个 rank 和梯度累积步上,收集全部 margin 求精确分位数不可行。做法是给每个专家维护直方图:对“所需偏置” \(r_{ij}=\alpha_i-s_{ij}\) 计数(它的 \(k/n\) 分位数就是 \(\hat b_j\))。因为 sigmoid 分数在 \((0,1)\),截断值 \(\alpha_i\) 在 \((b_{\min},1+b_{\max})\),所以 \(r_{ij}\in[b_{\min}-1,\ b_{\max}+1]\),在这个区间上均匀分 \(B\) 个桶,每步重算区间。各 rank 在所有 micro-batch 上本地累加计数,步末一次整数 all-reduce 得到全局直方图,找到累计计数达到 \(\lceil q\rceil\) 的桶,在桶内线性插值。误差不超过一个桶宽;\(B=1000\) 时最多几个 \(10^{-3}\),没有可测的残余不均衡。通信量只有每层每步 \(nB\) 个整数,与 token 数无关;而且计数可加,结果严格等于全局 batch 的分位数(而不是各 rank 分位数的平均)。再对估计值做 EMA 还能进一步降低批间噪声。

模拟器在合成的路由分数上实际运行三种方法。每步随机生成一个新 batch(专家有固定的偏好偏差,且随步数缓慢漂移,模拟路由器在学习),按当前偏置路由、统计负载、再更新偏置。纵轴是 MaxVio = 最大负载 / 目标负载。

交互演示 · 分位数均衡 vs 符号更新
无均衡(b=0)符号更新(γ)QB(精确分位数)QB(直方图,B 个桶)
最后 20 步平均 MaxVio:符号–
最后 20 步平均 MaxVio:QB 精确–
最后 20 步平均 MaxVio:QB 直方图–
QB 首次 MaxVio < 1.5 的步–

每步 2048 个 token;分数 s = sigmoid(专家偏好 + token 噪声),专家偏好按随机游走漂移(数据为示意)。QB 用上一步算出的偏置路由当前 batch(与训练中的因果约定相同),所以剩余的不均衡来自批间采样噪声和分布漂移:目标负载 q = 2048k/n,每个专家的负载有约 √q 的随机波动,取 n 个专家里的最大值就有一个下限,batch 越大这个下限越接近 1。

6. 原生视觉与逐头 Muon

6.1 原生多模态

K3 从训练一开始就联合优化语言和视觉,文本、图片、视频在同一个上下文里由同一个骨干处理,没有事后的模态对齐阶段。这是“视觉在环”的长程行为的基础:模型写代码、看渲染结果的截图或视频帧、再改,全在一个 token 流里,不需要跨模型交接。

6.2 MoonViT-V2:从零开始、用下一个 token 预测训练

和 K2.5 最大的不同是视觉编码器不再用对比学习预训练的模型(如 SigLIP)初始化,而是从零开始、用下一个 token 预测训练。主要理由是稳定性:把预训练编码器接到 LLM 上联合优化时,SigLIP 初始化的 MoonViT-3D 梯度范数持续偏高、频繁尖峰;从零训练的 MoonViT-V2 全程稳定。另一个理由是让编码器的表示直接由语言建模目标塑造,而不是由偏好全局语义的对比损失塑造。MoonViT-V2 在各项视觉评测上与 SigLIP 初始化的基线持平,说明在这个规模下对比预训练作为初始化是不必要的。

结构:27 层 ViT,约 0.4B 参数,用 RMSNorm,去掉线性层和注意力投影的所有 bias(进一步稳定从零训练);图片和视频共享全部参数,注意力分解为帧内空间和帧间时间两步,并在时间维上池化;投影前做 2×2 的 pixel shuffle,视觉 token 数减为 1/4。按 patch 14 算一下最大输入:\(3584\times3584\) 的图是 \(256\times256=65536\) 个 patch,pixel shuffle 后 16384 个 token,在 1M 上下文里放得下几十张。

6.3 逐头 Muon

K3 仍用 Muon(K2 的 QK-Clip 也保留了,两者见 Kimi K2),但对注意力投影做了逐头化:不对整个 \(Q,K,V\) 投影矩阵做 Newton–Schulz,而是把动量矩阵沿头的维度切开,每个头的块单独正交化。直觉是:整体正交化把所有头当成一个耦合的块,梯度/动量大的头主导共同的更新方向,小的头得不到充分归一化;逐头正交化让每个头的更新尺度一致。这让各头的学习动态更均衡、大规模训练更稳定,而且对细长的每头块做 Newton–Schulz 比对整个矩阵更便宜。

7. 预训练:缩放律、配方与 1M 上下文

7.1 数据

文本仍是网页、代码、数学、知识四个领域,沿用 K2 的规则过滤、分类器质量打分、去重和改写(多风格提示、分块自回归改写、忠实度校验)。视觉语料沿用 K2.5 的分类:图像描述、图文交错文档、OCR、感知、视频、视觉编程数据;坐标监督同时给绝对坐标和归一化到 [0,1] 的坐标。新增的是大规模“程序化多模态数据”:把代码片段与它渲染出的视觉结果配对,覆盖 SVG、3D 资产、网页、游戏和 CAD 图纸。

7.2 缩放律与学习率调度

架构、数据和训练的改动也改变了最优训练区间,所以他们重新做了缩放律来调 batch size、学习率、每参数 token 数(TPP)和模型形状。在留出的 OOD 验证集上,这些改动合起来带来约 2.5 倍的整体缩放效率(相对 K2)。

一个和 K2 相反的结论:缩放律研究一致偏向余弦衰减而不是 WSD。他们指出两种调度的最优超参(峰值学习率、batch size)差别很大,用同一组超参比较会偏袒与之更匹配的那个;为公平起见各自独立做缩放律搜索,在各自最优超参下余弦衰减的最终 loss 一致更低。(K2 用的是 WSD。)

7.3 配方

7.4 长上下文

因为没有显式位置编码(MLA 用 NoPE,位置由 KDA 的门控衰减隐式编码),模型直接外推到 1M,不需要 RoPE 缩放或插值。长文档和长视频的数据清洗包括精确与模糊去重(视频还用帧的感知哈希)、启发式与分类器质量过滤、结构校验;真正长且连贯的数据稀缺,所以上采样,避免 cooldown 期长上下文分布被短序列淹没。但长度本身不带来长程能力,所以还合成了长上下文数据:把多模态文档和子任务打乱拼接,使嵌入的任务只有关注散布在整个 1M 上下文里的信息才能解决,防止注意力退化成局部模式。

8. 后训练:9 个专家与多教师在线蒸馏

三阶段:SFT 建立基础 agent 能力;RL 在不同推理强度下训练各领域专家;多教师在线蒸馏(MOPD)把它们合并成一个模型。

8.1 SFT 与聊天模板

在 K2/K2.5 的 SFT 数据上大幅扩充复杂 agent 任务:用之前 Kimi 系列的领域模型合成轨迹,经多阶段验证和人工参与标注。所有数据用新的 XTML 聊天模板序列化,并且从 SFT 开始就做量化感知训练(MXFP4 权重、MXFP8 激活,见 8.5)。

XTML(eXtensible Token Markup Language)是一种类 XML 标记,但尖括号语法换成三个保留特殊 token:[open]、[sep]、[close],外加停止符 [end_of_msg]。每个结构边界都是一个显式特殊 token,消除了元素边界处的分词歧义,也简化约束解码。几个设计点:

8.2 RL:三个领域 × 三档强度

不为单个任务训练专门的 RL 模型,而是在三个大领域上扩展 RL,每个领域在每档推理强度下各训练一个专家:(i) 通用任务(通用体验、视觉、推理、忠实度、搜索、知识工作);(ii) 通用 agent(长程助手任务、深度研究、段落级写作);(iii) 编码 agent(软件工程、编码体验、kernel 任务、Web 开发)。三个领域 × {low, high, max} = 9 个专家。随 RL FLOPs 增加,工具调用步数持续上升,各项能力全面提高。

算法:在同步 RL 框架的 partial rollout 上扩展。每轮对 \(N\) 个提示各采 \(K\) 条,保持 \(N\times K\) 条在跑;当一个比例 \(\lambda\in(0,1)\) 的轨迹完成(\(\lambda NK\) 条)就暂停生成,进入策略优化,不等长尾。暂停的 rollout 排队,在下一轮开始时优先恢复(靠第 12 节的沙箱基础设施保存环境状态)。一个提示的 \(K\) 条都完成就立即送去优化,优化算法沿用 K2.5。这样一条长轨迹会跨越多轮,带来数据陈旧(off-policy)问题;他们的算法用逐 token 的正则把策略更新限制在局部邻域内,能容忍高度陈旧的数据。

8.3 推理强度 RL 与生成式奖励模型

逐题预算:每题 \(x\) 有一个由冷启动模型估计的初始预算 \(b_0(x)\);轨迹总 token 数 \(T(y)\) 超过 \(\tau\cdot b_0(x)\) 时,任务奖励直接改为 \(-1\)。通用任务的 \(T(y)\) 只算思考 token;agent 任务算全部输出 token(含推理和工具调用参数)。按 \(\tau\) 做分阶段课程:先用较大的 \(\tau\) 训练 max 档(仍封顶以压制过度思考),再把 \(\tau\) 退火到更小值得到 high 和 low 档。\(\tau\) 的调整按领域、在人工指导下进行。各档专家的轨迹再一起用于 SFT 和 MOPD。

Agentic GRM:不可验证的通用任务沿用 K2.5 的锦标赛式成对比较组奖励,但评审是一个 agent,必须遵守固定流程:(1) 阅读结果、产物或文本;(2) 生成 rubric;(3) 按 rubric 给每个候选打分;(4) 把分数记到计分板。为防止奖励被“越来越长”的输出 hack,类比预算控制:冷启动模型估计初始长度 \(\ell_0\),乘子 \(\sigma\),输出超过 \(\sigma\ell_0\) 的候选在成对比较里自动判负。

8.4 多教师在线蒸馏(MOPD)

训练学生时,对领域 \(d\) 和采样的强度 \(e\),由对应的教师 \(\pi^{(d,e)}_{\text{teacher}}\)(9 个之一)指导。学生自己生成(on-policy),每个 token 的奖励是教师与学生的对数概率差:

$$r_{\text{opd}}^d(y_t\mid e,x,y_{\lt t}) = \operatorname{clip}\Big(\operatorname{sg}\Big(\log\frac{\pi_{\text{teacher}}^{(d,e)}(y_t\mid x,y_{\lt t})}{\pi_\theta(y_t\mid e,x,y_{\lt t})}\Big),\ -R_{\max},\ R_{\max}\Big).$$

\(\operatorname{sg}\) 是 stop-gradient,裁剪到 \(\pm R_{\max}\) 是为了避免极端的优势值。这个奖励在期望上等于负的逐 token 反向 KL:把它当作稠密奖励放进 RL 框架,就是在学生自己的分布上最小化 \(\mathrm{KL}(\pi_\theta\,\|\,\pi_{\text{teacher}})\)。好处是它和 RL 用同一套基础设施(包括 partial rollout)。注意教师的条件里没有 \(e\):每个教师本身就是某一档强度的专家。更细粒度的 top-\(k\) 蒸馏目标也试过,收敛速度和最终效果都没有明显优势。

8.5 面向部署的后训练

MXFP4 QAT:MoE 专家权重占了绝大部分参数内存,所以把它们量化成 MXFP4(激活用 MXFP8),而注意力投影、latent MoE 投影、共享专家和路由器保持高精度。整个后训练(SFT 和 RL)都做量化感知训练;RL 中 rollout 与训练用同一量化方案,消除训练–推理不一致。

草稿模型:K3 预训练时就带一个结构与骨干 block 相同的 MTP 层。EAGLE-3 的草稿模型是单个解码层,结构与 MTP 层一致,所以把预训练的 MTP 层微调成 EAGLE-3 式草稿:目标模型冻结,只训草稿层和特征融合投影。训练时按 EAGLE-3 的“训练时测试”协议展开 7 步,除第一步外草稿都吃自己之前的输出。草稿输入融合目标模型的低、中、高层特征,分别取第 1、第 4 和最后一个 AttnRes 块的输出;拼接后用无偏置矩阵 \(W_{E3}\) 投影回隐藏维,\(W_{E3}\) 初始化为 \([0\ 0\ I]\),使融合表示一开始就等于 MTP 层预训练时看到的高层特征,再逐渐学会用低、中层特征。

损失直接优化接受率。无损的投机采样中,草稿分布 \(q\) 的 token 被接受的概率是 \(\sum_x\min(p(x),q(x))\)(\(p\) 为目标分布)。对容量有限的草稿模型,最小化 KL 并不保证最大化这个接受率,所以用 LK 损失——接受率的负对数:

$$\mathcal L_{\text{LK}} = -\log\sum_{x\in\mathcal V}\min\big(p(x),q(x)\big),$$

\(p,q\) 都在温度 1 下计算,不加真实标签的交叉熵项。草稿微调同样用 MXFP4/MXFP8 的 QAT 配置。

9. RL 环境与任务合成

RL 的上限取决于任务和环境的质量。K3 在这方面做了七类工作:

10. 基础设施(一):KDA 的 kernel 与上下文并行

10.1 不同场景的 kernel

10.2 KDA 上下文并行(KCP)

跨卡的上下文并行里,softmax 注意力要交换随长度增长的 KV 块;线性注意力只需要传固定大小的状态。普通线性注意力的递推是加法的,每个 rank 从 \(S=0\) 算出本地状态,再对前面的 rank 求和即可。KDA 不行:记 \(M_t=(I-\beta_tk_tk_t^\top)\operatorname{Diag}(\alpha_t)\),\(S_t=M_tS_{t-1}+\beta_tk_tv_t^\top\),一段 token 的效果依赖于进入这段时的状态。

KCP 把每段的效果拆成两个能本地算出的量:累积转移 \(\mathbf M_{[i]} = M_{T_i}\cdots M_1\)(\(d_k\times d_k\))和从零开始的本地状态 \(\tilde S_{[i]}\)(\(d_k\times d_v\))。线性性给出

$$S_{[i+1]}^{t} = \tilde S_{[i+1]}^{t} + \mathbf M_{[i+1]}^{t\leftarrow1}\,S_{[i]}^{T_i},\qquad S_{[i]}^{T_i} = \sum_{j=1}^{i}\Big(\prod_{l=j+1}^{i}\mathbf M_{[l]}\Big)\tilde S_{[j]} .$$

二元组 \((\mathbf M,\tilde S)\) 的组合 \((\mathbf M_2,\tilde S_2)\circ(\mathbf M_1,\tilde S_1) = (\mathbf M_2\mathbf M_1,\ \tilde S_2+\mathbf M_2\tilde S_1)\) 满足结合律,所以可以用前缀扫描恢复每个 rank 的入口状态。实现上每个 rank 先本地算出两者,用一次 all-gather 交换,然后 rank \(i+1\) 从 \(S=0\) 开始依次执行 \(S\leftarrow\mathbf M_{[j]}S+\tilde S_{[j]}\) 处理同一文档的前序片段。通信量固定(每头一个 128×128 的 \(\mathbf M\) 和一个 128×128 的 \(\tilde S\)),计算线性扩展。

11. 基础设施(二):3T 级预训练

并行组合:带虚拟 stage 的流水线并行、专家并行、ZeRO-1 数据并行、Pipeline ZeRO-2 梯度分片和上面的上下文并行。共享专家在 EP rank 间复制;专家分派和合并的 all-to-all 与计算重叠。三个难题:EP rank 间 token 负载不均;激活、梯度、优化器状态超出显存;视觉编码器高度可变的计算暴露在关键路径上。

11.1 MoonEP:完美均衡的专家并行

传统 EP 的 token 负载在 rank 间不均,计算失衡拖慢吞吐,动态变化的形状还造成显存碎片。MoonEP(已开源)在 DeepEP 的计算流上增加了冗余专家的在线规划与迁移:前向时根据当前 micro-batch、当前层的路由结果规划冗余专家并在专家计算前预取;反向时把冗余专家的梯度先放本地 reduce 缓冲,算完再归约回原 rank 的梯度缓冲。

交互演示 · LatentMoE 通信与 MoonEP 冗余专家
稀疏度 E/k–
每 token 分派的数(k·ℓ)–
相对 K2(8×7168)–
路由专家参数(92 层,专家维 3072)–
每 rank 本地专家 E/R–
冗余专家上界 E/R;最坏下界–
免拷贝缓冲:DeepEP 最坏 / MoonEP–

d = 7168、专家 FFN 中间维 3072、92 个 MoE 层(93 层减 1 层 dense)都是 K3 的实际配置;每个专家有 gate、up、down 三个矩阵,参数按 3·ℓ·3072 计。冗余专家的上界是 E/R,紧的下界是 ⌈E(R−1)/R²⌉。缓冲大小以“S×K 个 token”为单位。

11.2 显存

11.3 多模态编码器

12. 基础设施(三):1M 上下文的 Agent RL

沿用 K2 的共置 RL,让每个 1M 上下文的 K3 RL 实验控制在几百张 GPU 内,并用 partial rollout 降低超长轨迹的尾延迟。新问题是长上下文 rollout 需要额外的 DRAM 来保留 KV cache,与训练侧状态竞争。

12.1 沙箱:AgentENV

多种沙箱运行时并用(容器、GPU 沙箱,以及新的基于 microVM 的 AgentENV,与合作方共同开发并开源)。AgentENV 的三个设计目标:

整个 K3 训练和评测共创建了 51,219,741 个沙箱、涉及 1,505,678 个镜像。

13. 基础设施(四):推理与线上服务

13.1 KDA 感知的前缀缓存

混合架构让前缀缓存变复杂:KDA 的递推状态和 MLA 的 KV cache 大小与生命周期完全不同,而一个缓存的前缀只有当两者能在同一边界一起恢复时才可复用。

13.2 kernel

13.3 集群级调度

14. 评测与案例

对比对象是 Claude Fable 5、GPT-5.6 Sol、Claude Opus 4.8、GPT-5.5 和开源的 GLM-5.2,都在最大推理强度下(GPT-5.5 用 xhigh)。K3 的评测用 max 强度、温度 1.0,单步任务 top-p 0.95,agent 任务 top-p 1.0。总体上,K3 略逊于最强的两个闭源模型 Claude Fable 5 和 GPT-5.6 Sol,但一致领先其余被评测的开源和闭源模型。部分结果如下:

类别基准Kimi K3备注
推理/知识GPQA Diamond93.5与前沿相当
HLE-Full(有工具 / 无工具)56.0 / 43.5落后 Fable 5 与 GPT-5.6 Sol
CritPt23.4落后 Fable 5、GPT-5.6 Sol、GPT-5.5
编码ProgramBench77.8最高
SWE-Marathon(GPU kernel 向)42.0领先 Fable 5 7 个点
Terminal-Bench 2.188.3GPT-5.6 Sol 88.8
FrontierSWE81.2第二,Fable 5 为 86.6
DeepSWE(mini-SWE-agent 官方榜)67.3
AgentBrowseComp91.2300K 处触发上下文压缩;不做上下文管理、用满 1M 为 90.4
DeepSearchQA (F1)95.0
ResearchRubrics / MCPMark-Verified76.2 / 94.5
AutomationBench / SpreadsheetBench 230.8 / 34.8
τ³-Banking / Harvey Lab-AA33.4 / 94.6后者为 criterion pass rate
GDPval-AA v2 / AA-Briefcase (Elo)1686 / 1548分别第三、第二,均由 Fable 5 领先
CorpFin v2 / OSWorld-Verified71.6 / 84.8Fable 5 为 71.8 / 85.0
视觉Math-Vision(+Python 工具)94.3(97.8)
ZeroBench-main pass@5(+Python)23.0(41.0)与 Fable 5 并列
OmniDocBench / WorldVQA91.1 / 51.0前者最高;后者第二

成本:BrowseComp 上 K3 以每题 2.03 美元拿到最高分,约为 GPT-5.6 Sol(90.4)的一半成本,比最大强度的 Claude 便宜一个数量级;Kimi Code Bench 2.0 上落后 Fable 5 4.0 分,成本为其 38%;GDPval-AA v2 上与 GPT-5.6 Sol 相差不到 50 Elo、成本低 13%,比 Fable 5 便宜 2.6 倍。

案例:GPU kernel 优化,每个模型在相同沙箱里最多 24 小时,K3 把 AttnRes kernel 从 283.6 ms 降到 114.4 ms,DSA 和 KDA 的运行时间分别减少 55.1% 和 73.6%,MLA(头维 512)达到峰值 TFLOPS 的一半以上;开发了一个小型 Triton 类编译器 MiniTriton(自定义 tile 级 Python 前端、MLIR 注解与优化层、PTX 代码生成),在 L20 上张量核矩阵乘在最大尺寸接近 cuBLAS(约 90% 实测 roof);在 48 小时的自主运行中用开源 EDA 工具和 Nangate45 库为一个同架构的纳米模型设计了推理芯片原型(4 mm² 面积预算内 100 MHz 时序收敛,RTL 仿真解码吞吐超过 8700 token/s,146 万个标准单元)。

15. 小结

参考与延伸阅读

K3 报告很长,推荐先读 §2(架构)和附录 C(分位数均衡的推导),再按兴趣看 §5 的系统部分。