读透 Kimi K3:当架构选择开始为 Tensor Core 让路
一份 2.8T 参数、104B 激活、1M 上下文、原生多模态的开源模型,最值得读的不是它的分数,而是它把"算法"和"系统"当成同一个设计问题来解。
一、这篇报告为什么值得认真读
过去很多年,LLM 的进步基本沿着一条轴走——把模型做大、把数据喂多,在部署之前砸更多算力。推理模型出现之后,出现了第二条轴:把算力砸在推理时(test-time),用强化学习、更长的思维链、更长的多轮交互去换质量。
Kimi 这份报告开篇提出了一个很尖锐的观察:开源社区这两年几乎只在第二条轴上狂奔,第一条轴几乎停滞。 你会发现绝大多数近期开源模型都卡在"1T 参数上下"这个量级,然后拼命在上面叠更精巧的 RL 和 agentic 方法。问题在于:当所有人都在同一个参数规模的底座上加 RL,开源之间会迅速同质化,而与最强闭源系统的差距只会越拉越大——因为闭源在偷偷把第一条轴也往上推。
Kimi K3 的赌注就是:两条轴一起推到前沿。 把预训练底座推到"3T 级"这个开源从没到过的参数量级,同时把 RL、推理努力(reasoning effort)、长程交互一起拉到 1M 上下文。
这就引出了读这篇报告最重要的一个判断——
这不是一篇"我们又发了个更大的模型"的报告,而是一篇彻头彻尾的协同设计(co-design)报告。 3T 参数 + 1M 上下文 + 原生多模态 + agentic RL,这四件事任何一件单独做都不轻松,四件事同时做、还要在几百张 GPU 的预算内跑起来,靠的绝不是某一个孤立的巧思,而是"每一个架构选择都预先考虑了它的系统后果,每一个系统方案又都由某个架构选择所使能"。你在读每一节的时候,都可以反复用这把尺子去量:这个改动,到底是为了模型质量,还是为了让硬件/通信/显存活下来? 你会惊讶地发现,很多最漂亮的改动,答案是后者。
二、读懂全篇的那把钥匙:沿三个维度组织"信息流"
报告用一句话把整个架构串了起来:Kimi K3 的架构被设计成沿三个互补的维度扩展信息流——序列长度、网络深度、模型宽度。
- 序列维度(token mixing):混合注意力 = 3 层 KDA(Kimi Delta Attention,线性注意力)+ 1 层 Gated MLA(全局注意力),3:1 交替。
- 深度维度(layer mixing):Attention Residuals(注意力残差),让每一层可以有选择地从所有前置层"取"表示,而不是像标准残差那样一路累加。
- 宽度维度(channel mixing):每个注意力层后面跟一个 Stable LatentMoE,896 个路由专家里激活 16 个。
这个"三维信息流"的框架不是事后包装,它是真正的组织原则:token 之间、层之间、通道之间,各用一套机制去做"有选择的信息路由"。而三套机制的共同底色,就是上一节说的 co-design。
先把两代之间的账摆清楚(复现自报告 Table 1):
| Kimi K2 | Kimi K3 | Δ | |
|---|---|---|---|
| 架构 | MoE | MoE | – |
| 层数 | 61 | 93 | ↑52% |
| 总参数 | 1.04T | 2.78T | ↑167% |
| 激活参数 | 32.6B | 104.2B | ↑220% |
| Hidden 维度 | 7,168 | 7,168 | = |
| Latent MoE 维度 | – | 3,584(0.5×) | – |
| 每专家 MoE 隐维度 | 2,048 | 3,072 | ↑50% |
| 路由专家数 | 384 | 896 | ↑133% |
| 每 token 激活专家 | 8 | 16 | ↑100% |
| 共享专家 | 1 | 2 | ↑100% |
| 注意力头 | 64 | 96 | ↑50% |
| 训练上下文长度 | 128K | 1M | 8× |
| 注意力机制 | MLA | Hybrid KDA–MLA | – |
| 激活函数 | SwiGLU | SiTU-GLU | – |
| 注意力层组成 | 61 MLA | 69 KDA + 24 MLA | – |
| ViT | – | 401M / 27 层 / patch 14 | – |
有几个数字要特别拎出来看:hidden 维度没变(7168),但总参数翻了 2.7 倍。 这说明 K3 的膨胀主要来自"更多层 + 更多专家",而不是"更宽的模型"。这是个很关键的取向选择——把容量放进稀疏的专家池和更深的网络,而不是放进稠密的宽度里,这样激活参数才能压在 104B 这个还能负担的量级(激活率约 3.7%)。
三、序列维度:KDA,一次为 Tensor Core 让路的改动
线性注意力(linear attention)之所以诱人,是因为它把 softmax attention 那个"随序列长度增长的 KV cache"换成了一个固定大小的循环状态 SSS。这对 1M 上下文是决定性的:状态不随长度膨胀,传输和复用都便宜。代价是循环有串行依赖,不好并行。KDA 就是 Kimi 在这条路线上的当前答案,它建立在 Kimi Linear、DeltaNet、Gated DeltaNet 这一脉之上。
3.1 delta rule + 通道级遗忘门(Eq 1–2)
单头的状态更新是:
St=(I−βtktkt⊤) Diag(αt) St−1+βtktvt⊤,o~t=St⊤qt S_t = \big(I - \beta_t k_t k_t^\top\big)\,\mathrm{Diag}(\alpha_t)\,S_{t-1} + \beta_t k_t v_t^\top,\qquad \tilde{o}_t = S_t^\top q_t St=(I−βtktkt⊤)Diag(αt)St−1+βtktvt⊤,o~t=St⊤qt
这条式子里其实叠了两种"记忆管理"手段,要分开看:
- Diag(αt)\mathrm{Diag}(\alpha_t)Diag(αt) 是通道级遗忘门。αt∈(0,1)dk\alpha_t \in (0,1)^{d_k}αt∈(0,1)dk,它对状态矩阵的每一个 key 通道单独乘一个衰减因子。这是"gated"的部分——按通道地、有选择地忘掉旧信息。
- (I−βtktkt⊤)\big(I - \beta_t k_t k_t^\top\big)(I−βtktkt⊤) 是 delta rule。它在写入新关联之前,先把状态里沿 ktk_tkt 方向的旧关联"擦掉",βt∈(0,1)\beta_t \in (0,1)βt∈(0,1) 控制擦除/写入的强度。这是"delta"的部分——纠错式写入,让模型能覆盖、更新陈旧关联,而不是一味累加。
- 最后 +βtktvt⊤+\beta_t k_t v_t^\top+βtktvt⊤ 写入新的键值关联。
为什么要把这两者叠在一起? 纯门控(如 Mamba-2)只能"整体变淡",纯 delta rule(如 DeltaNet)只能"定向覆盖",但真实的长上下文既需要按通道地淡忘无关信息,又需要在检测到冲突时定向纠错。把二者组合,状态演化的表达力就比任何一个单独用都强。式 (2) 里的参数化也很讲究:q、k 走 ShortConv→Swish→L2Norm,其中 L2Norm 对 q、k 做归一化是线性注意力稳定性的关键(约束状态增长,防止爆炸);衰减 logit zzz 用低秩投影 Wα↑Wα↓W^\uparrow_\alpha W^\downarrow_\alphaWα↑Wα↓ 产生,既细到每个 key 通道,又不让参数量失控。
3.2 神来之笔:下界衰减(Eq 5)——算法-硬件协同的教科书案例
这是我认为整篇报告里最值得单独拎出来讲的一个改动,因为它把"改激活函数"这件小事,变成了一次纯粹为硬件让路的设计。
先说清楚 KDA 是怎么在 GPU 上高效算的。它用的是"块间循环、块内并行"(chunkwise)的形式:状态在 chunk 之间串行传播,chunk 内部用矩阵乘并行。式 (4) 里有一步 K[t]/Γ[t]1→C\mathbf{K}_{[t]} / \Gamma_{[t]}^{1\to C}K[t]/Γ[t]1→C——用累积衰减的倒数去重标定 key。麻烦就出在这里:Γ[t]1→C\Gamma^{1\to C}_{[t]}Γ[t]1→C 是一堆 (0,1)(0,1)(0,1) 区间因子的连乘,它的倒数可以无界地涨大,在有限精度(BF16)里直接溢出。
Kimi Linear 的老办法是:在 log 空间算相对衰减,把 chunk 再切成 16-token 的小 tile。非对角 tile 能直接上 Tensor Core 做稠密矩阵乘,但对角 tile 因为数值范围问题,只能退回到逐位置对(position-pair)显式计算——这一条对角路径就是块内的主要瓶颈。
Kimi K3 的做法,是把衰减对数从下方限住。老的映射是负 Softplus,无界向下:gth=−eAh Softplus(zth)∈(−∞,0)g_t^h = -e^{A_h}\,\mathrm{Softplus}(z_t^h)\in(-\infty, 0)gth=−eAhSoftplus(zth)∈(−∞,0)。K3 换成一个缩放 sigmoid:
gth=gmin Sigmoid (eAhzth)∈(gmin,0)dk,αth=exp(gth)∈(egmin,1)dk g_t^h = g_{\min}\,\mathrm{Sigmoid}\!\big(e^{A_h} z_t^h\big)\in(g_{\min},0)^{d_k},\qquad \alpha_t^h = \exp(g_t^h)\in(e^{g_{\min}},1)^{d_k} gth=gminSigmoid(eAhzth)∈(gmin,0)dk,αth=exp(gth)∈(egmin,1)dk
固定 gmin=−5g_{\min}=-5gmin=−5,AhA_hAh 是每头可学习的 log-scale,初始化为 0。
这个 −5-5−5 才是整件事的关键。 有了下界,每个保留因子都满足 αt,j>e−5≈6.7×10−3\alpha_{t,j} > e^{-5}\approx 6.7\times10^{-3}αt,j>e−5≈6.7×10−3;在一个 16-token tile 上,累积对数衰减落在 (−80,0)(-80, 0)(−80,0),对应的倒数重标定因子小于 e80e^{80}e80——正好还在 BF16 的动态范围之内。于是对角 tile 和非对角 tile 就都能用稠密 Tensor Core 矩阵乘了,那条逐位置对的对角路径被彻底消灭。
值得停下来品一品这里的思维方式:这个改动不是为了模型更聪明,而是为了让整块 chunk 的计算都能落到 Tensor Core 上。 缩放 sigmoid 相对负 Softplus 在建模上几乎不带来任何"能力",它换来的是硬件利用率。代价是你不再能有比 e−5e^{-5}e−5 更强的单步衰减——但经验上这完全够用(几步累积下来衰减已经很强了)。一个顶尖系统工程师看到这里应该会心一笑:当你发现瓶颈是"某条路径进不了 Tensor Core",最优雅的解法往往不是去优化那条路径,而是回到算法层面,把产生它的数值范围给约束掉。 Fig. 3 把这件事画得很清楚。
3.3 全秩输出门与 FP32 attention(Eq 6)
KDA 的输出门也从 Kimi Linear 的低秩参数化,换成了输入相关的全秩投影。先对循环输出做 head-wise RMSNorm,再做数据相关的门控:
yt=Wo[Sigmoid(Wgxt)⊙RMSNorm(o~t)] y_t = W_o\big[\mathrm{Sigmoid}(W_g x_t)\odot \mathrm{RMSNorm}(\tilde{o}_t)\big] yt=Wo[Sigmoid(Wgxt)⊙RMSNorm(o~t)]
为什么要全秩? 全秩门让每个 token 能独立地调制它从循环记忆里读出的每一个通道,控制粒度更细;RMSNorm 先把循环输出的幅度稳住,再让门控上去。这条思路和"门控注意力有助于非线性、稀疏性、消除 attention sink"的近期工作是一脉的。
另外报告提了一个很工程的细节:为了修正 flash attention 里有偏的舍入误差,训练时把注意力输出保持在 FP32。这会让输出 tile 的片上占用翻倍,于是他们重新设计了训练 kernel,把这块开销和 KV 暂存缓冲区重叠,而不是和 query tile 重叠,从而腾出共享内存做更深的 KV 流水线。这类"为了数值正确性付出显存代价、再用调度把代价藏起来"的操作,全篇比比皆是。
3.4 Gated MLA + NoPE:让位置和全局内容各司其职
混合注意力里那 1/4 的全局层用的是 Gated MLA(Multi-head Latent Attention,来自 DeepSeek-V2),它把 KV 压成一个低维潜向量缓存起来,用的时候再上投影重建,省 KV cache 又保住全局的 token-to-token 注意力。K3 同样给它加了全秩输出门(式 7)。
真正漂亮的是这一句:K3 对所有 MLA 层用 NoPE(No Position Encoding),完全不加显式位置编码。 理由是分工——中间那些 KDA 层通过循环门控和衰减,天然提供了位置敏感、近因敏感的序列混合;MLA 层就专心做无位置约束的全局内容交互。这个分工带来一个巨大的工程红利:没有 RoPE,就没有扩展上下文时的一切麻烦——不用重调频率基、不用 YaRN、不用插值。这正是 K3 敢说"直接外推到 1M、不做任何位置编码修改"的底气所在。把"位置信息"和"全局内容"解耦到两种不同的层里,是这套混合架构最省心的地方。
四、深度维度:Attention Residuals,把 Transformer 那一招用到"层"上
这一节的立意,我个人觉得是全篇最"漂亮"的一个类比。
4.1 标准残差的 RNN-over-depth 瓶颈(Eq 8–9)
标准残差连接 hl=hl−1+fl(hl−1)h_l = h_{l-1} + f_l(h_{l-1})hl=hl−1+fl(hl−1) 有一个常被忽视的问题:它把所有前面的信息压进单一的一个状态 hlh_lhl 里沿深度往下传。报告一针见血地把它类比成"深度方向上的 RNN"——就像 RNN 在时间维上把历史压成一个隐状态那样,标准残差在深度维上把所有层的历史压成一个隐状态,这是个信息瓶颈。
当年 Transformer 是怎么解决序列维上这个 RNN 瓶颈的?用注意力,让每个位置能有选择、按数据相关的权重去访问所有历史位置。Attention Residuals 就是把这一招原样搬到深度维:每一层不再只读上一层,而是对所有前置层的输出(加上 embedding)做一次注意力,用一个学习到的伪查询 ql=wlq_l = w_lql=wl 去加权:
ki=vi={h1i=0fi(hi)1≤i≤l−1,αi→l=ϕ(ql,ki)∑jϕ(ql,kj),hl=∑i=0l−1αi→l⋅vi k_i = v_i = \begin{cases} h_1 & i=0 \\ f_i(h_i) & 1\le i\le l-1\end{cases},\qquad \alpha_{i\to l}=\frac{\phi(q_l,k_i)}{\sum_{j}\phi(q_l,k_j)},\quad h_l=\sum_{i=0}^{l-1}\alpha_{i\to l}\cdot v_i ki=vi={h1fi(hi)i=01≤i≤l−1,αi→l=∑jϕ(ql,kj)ϕ(ql,ki),hl=i=0∑l−1αi→l⋅vi
其中核 ϕ(q,k)=exp (q⊤RMSNorm(k))\phi(q,k)=\exp\!\big(q^\top\mathrm{RMSNorm}(k)\big)ϕ(q,k)=exp(q⊤RMSNorm(k))。这里的 RMSNorm 不是装饰:它防止某些幅度特别大的层输出主导注意力权重,让"选层"这件事公平。
为什么这在深度上可行、在序列上却不行? 因为网络深度 L<100L<100L<100,O(L2d)O(L^2 d)O(L2d) 的算术开销完全能负担——深度维上的"平方"是个小平方。真正的代价是 O(Ld)O(Ld)O(Ld) 的显存(要把所有层的输出都保活),以及流水线并行下的跨阶段通信。这就自然过渡到下一步。
4.2 Block AttnRes 的工程折衷(Eq 10)
为了压掉 O(Ld)O(Ld)O(Ld) 这个开销,他们把 LLL 层切成 NNN 个 block,每个 block 内部把各层输出求和压成一个表示 bnb_nbn;跨 block 之间,只对这 NNN 个 block 级表示做全注意力。开销从 O(Ld)O(Ld)O(Ld) 降到 O(Nd)O(Nd)O(Nd)。经验上 N≈8N\approx 8N≈8 就能拿回大部分收益。K3 把 93 层切成 8 个 block、每 block 12 层(末尾一个 partial block,算上 embedding 共 9 个信息源)。
这个折衷的精妙在于"两头都占":block 结构既压掉了显存/通信,又限住了推理时的状态大小,从而能用 online softmax 把"并行算出的 block 间结果"和"串行累加的 block 内部分和"更好地合并,显著降低推理成本。注意这是"把全注意力残差做成可以工程化落地"的关键一步——full form 好看但不可扩展,block form 才是能上 3T 的那个。
五、宽度维度:Stable LatentMoE,在 896 专家的极端稀疏下稳住训练
宽度维要解决的是:既想扩大专家池、又想多激活几个专家(896 里激活 16,稀疏度 56),但在普通 MoE 里,每个被选中的专家都要收到完整的 ddd 维 token 表示——通信量和专家权重流量都会随路由重数线性膨胀。16 个激活专家 × 全宽 ddd,这个账在 3T 尺度上是算不过来的。
5.1 LatentMoE:把路由专家搬进隐空间(Eq 11)
LatentMoE 的核心是把"模型全宽"和"路由专家宽度"解耦。共享专家保留全宽路径做通用变换,而路由专家在一个更窄的隐空间 ℓ\ellℓ 里工作:
u=∑i∈Tk(x)pi Eirouted(W↓x),y=∑j=1NsEjshared(x)+W↑ RMSNorm(u) u=\sum_{i\in\mathcal{T}_k(x)}p_i\,E_i^{\mathrm{routed}}(W^\downarrow x),\qquad y=\sum_{j=1}^{N_s}E_j^{\mathrm{shared}}(x)+W^\uparrow\,\mathrm{RMSNorm}(u) u=i∈Tk(x)∑piEirouted(W↓x),y=j=1∑NsEjshared(x)+W↑RMSNorm(u)
token 先被 W↓W^\downarrowW↓ 压到 ℓ\ellℓ(这里 ℓ=3584=0.5d\ell=3584=0.5dℓ=3584=0.5d),路由专家 Eirouted:Rℓ→RℓE_i^{\mathrm{routed}}:\mathbb{R}^\ell\to\mathbb{R}^\ellEirouted:Rℓ→Rℓ 在隐空间里算,聚合后再 W↑W^\uparrowW↑ 升回 ddd。共享专家固定 2 个。这样一来,16 个激活专家的通信和权重流量都是在 ℓ=0.5d\ell=0.5dℓ=0.5d 的窄空间里,才让 896 专家在预算内成为可能。
但极端稀疏会放大两个失败模式:其一,路由分支把 W↓W^\downarrowW↓、一个门控多分支专家 FFN、W↑W^\uparrowW↑ 串成了近四次连续矩阵乘,这个病态结构在 2.8T 尺度下会让路由分支的内部激活爆炸;其二,给近 10310^3103 个专家做负载均衡,已经超出了现有 auxiliary-loss-free 偏置更新还能稳住的区间。Stable LatentMoE 用三个组件分别对症。
5.2 稳定器之一:Normalized LatentMoE
原始 LatentMoE 直接把 W↑W^\uparrowW↑ 作用在聚合后的 uuu 上,而 uuu 的尺度会随"选了哪些专家、路由权重多大"而漂移。K3 在专家聚合和上投影之间插了一个 RMSNorm(就是式 11 里的 RMSNorm(u)\mathrm{RMSNorm}(u)RMSNorm(u))。
为什么? 在把路由分支和全宽的共享分支合并之前,先把路由分支的尺度归一化,降低它对尺度漂移的敏感性。报告说这不只稳住了训练,还"持续改善验证 loss 和下游 benchmark"。一个很干净的稳定器——只加了一个 norm,稳定性和质量都拿到了。
5.3 稳定器之二:SiTU-GLU,有界但不杀梯度的激活(Eq 12)
SwiGLU 是 Swish(Wgx)⊙(Wux)\mathrm{Swish}(W_g x)\odot(W_u x)Swish(Wgx)⊙(Wux)。它的问题是两个相乘因子都无界,一旦大坐标同时出现就会产生激活离群点,在低精度算术里放大溢出风险——叠加上面说的"四次连乘"路由路径,就是训练不稳的直接来源。
SiTU-GLU 的做法是给两个分支各套一个平滑软帽 softcap(x,β)=βtanh(x/β)\mathrm{softcap}(x,\beta)=\beta\tanh(x/\beta)softcap(x,β)=βtanh(x/β):
SiTU-GLU(x)=[β1tanh (Wgxβ1)⊙Sigmoid(Wgx)]⊙[β2tanh (Wuxβ2)] \mathrm{SiTU\text{-}GLU}(x)=\Big[\beta_1\tanh\!\Big(\tfrac{W_g x}{\beta_1}\Big)\odot\mathrm{Sigmoid}(W_g x)\Big]\odot\Big[\beta_2\tanh\!\Big(\tfrac{W_u x}{\beta_2}\Big)\Big] SiTU-GLU(x)=[β1tanh(β1Wgx)⊙Sigmoid(Wgx)]⊙[β2tanh(β2Wux)]
K3 取 β1=4\beta_1=4β1=4(门分支)、β2=25\beta_2=25β2=25(up 分支)。这里的三点性质要精确理解它为什么成立:
- 近原点匹配 SwiGLU:βtanh(z/β)=z+O(z3/β2)\beta\tanh(z/\beta)=z+O(z^3/\beta^2)βtanh(z/β)=z+O(z3/β2),所以在原点附近 SiTU-GLU 一阶等同于 SwiGLU——保住了 SwiGLU 之所以好用的那个局部响应,这是不能丢的。
- 大幅值处有界:每个输出坐标被限在 ∥⋅∥∞≤β1β2=100\|\cdot\|_\infty\le\beta_1\beta_2=100∥⋅∥∞≤β1β2=100(附录 B 式 19),激活爆炸被摁住。
- 极限退化:β1,β2→∞\beta_1,\beta_2\to\inftyβ1,β2→∞ 时逐点回到 SwiGLU。
最关键的一句在附录 B:相比对门前激活做硬截断(hard clamp),平滑软帽在远离饱和边界处保留了非零梯度,训练行为更好。这才是设计的题眼——目标是"既要有界、又不要硬截断那种在饱和处杀梯度的病"。β1=4\beta_1=4β1=4 比 β2=25\beta_2=25β2=25 帽得更狠,是因为门分支的 sigmoid 本来就已经把负侧压向零、tanh 主要去帽大的正门值,所以门分支容忍的范围更小。
5.4 稳定器之三:Quantile Balancing——从最优分配对偶推出的"一步到位"负载均衡(Eq 13–14)
这是宽度维里最有理论味的一块,也是我认为很多人会读快、其实值得慢读的一块。
先看 auxiliary-loss-free 路由(式 13)。路由分数 si=Sigmoid(Wrxi)s_i=\mathrm{Sigmoid}(W_r x_i)si=Sigmoid(Wrxi),给每个专家加一个偏置 bjb_jbj 只用于 top-k 选择,而混合权重 pi,jp_{i,j}pi,j 用的是原始 sss:
Ti=argtopk(si+b),pi,j=si,j∑r∈Tisi,r,j∈Ti \mathcal{T}_i=\mathrm{argtop}_k(s_i+b),\qquad p_{i,j}=\frac{s_{i,j}}{\sum_{r\in\mathcal{T}_i}s_{i,r}},\quad j\in\mathcal{T}_i Ti=argtopk(si+b),pi,j=∑r∈Tisi,rsi,j,j∈Ti
为什么 bbb 不进 ppp? 因为这样偏置只调度"派给谁",完全不动混合权重、也不动路由器的梯度——负载均衡和模型质量彻底解耦。DeepSeek-V3 的原始更新是固定步长的符号更新 bj(t+1)=bj(t)+γ sign(ℓˉ−ℓj(t))b_j^{(t+1)}=b_j^{(t)}+\gamma\,\mathrm{sign}(\bar\ell-\ell_j^{(t)})bj(t+1)=bj(t)+γsign(ℓˉ−ℓj(t)),γ\gammaγ 在"适应慢"和"负载震荡"之间权衡。问题是:896 个专家时,符号更新太慢了,追不上负载漂移,失衡会拖慢专家并行训练、还会让一些专家训不充分。
Quantile Balancing(QB)的思路是不再一小步一小步挪偏置,而是直接把偏置设到"能让该专家恰好拿到目标负载"的那个分位点:
b^j(t+1)←−quantile1−k/n(s:,j−α(t)),b(t+1)←b^(t+1)−mean(b^(t+1))1 \hat{b}_j^{(t+1)}\leftarrow-\mathrm{quantile}_{1-k/n}\big(s_{:,j}-\alpha^{(t)}\big),\qquad b^{(t+1)}\leftarrow\hat{b}^{(t+1)}-\mathrm{mean}\big(\hat{b}^{(t+1)}\big)\mathbf{1} b^j(t+1)←−quantile1−k/n(s:,j−α(t)),b(t+1)←b^(t+1)−mean(b^(t+1))1
机制上有两个巧劲:一是用 Top-(k+1) 路由顺手拿到每个 token 的门槛 αi(t)\alpha_i^{(t)}αi(t)(一个专家要进入 token iii 的 top-k 必须超过的分数),这样就省掉了单独算 token 侧分位数;二是边际 si,j−αi(t)s_{i,j}-\alpha_i^{(t)}si,j−αi(t) 度量了专家 jjj 超过 token iii 门槛多少,把 −b^j-\hat b_j−b^j 设到这些边际的 (1−k/n)(1-k/n)(1−k/n) 分位点,就恰好让 q=mk/nq=mk/nq=mk/n 个边际留在门槛之上——专家 jjj 拿到精确的目标负载。第二行做均值中心化(减掉公共偏移不改变 top-k)。
附录 C 把这件事的来处讲透了:QB 其实是"最大分数均衡分配"这个线性规划对偶目标的精确坐标极小化,而符号更新只是在同一个对偶目标上做 SignSGD 慢慢下降。所以 QB 的两个好处是有根的:它没有类学习率的超参(直接跳到极小值点,而不是朝它迈固定步),并且即便近 10310^3103 个专家也能在几步内平衡。更妙的是推理时它退化成"带冻结偏置的固定 top-k",训练-推理一致、部署时根本不用算分位数。
工程落地还有一手(附录 D):真实训练里边际有数百万条、散落在各 rank 和梯度累积步上,精确分位数取不出来。于是他们给每个专家维护一个边际直方图,一次 all-reduce 把 bin 计数汇总(计数可加,所以直方图精确等于全局批的分布,误差只到 bin 宽),从池化计数里恢复分位数。通信只有每层每步 nBnBnB 个值,不到"每 micro-batch 交换原始边际"成本的 1%。这就是把一个统计量做成分布式可算的教科书写法。
六、优化器与 scaling law:Per-Head Muon 与 2.5× 的来处
K3 沿用 Muon 做矩阵参数优化器,但对注意力投影做了 per-head 变体:不再对整块 Q/K/VQ/K/VQ/K/V 投影矩阵做 Newton–Schulz 正交化,而是沿 head 维把动量矩阵切开、每个头的块单独正交化。为什么? 整块正交化把所有头当成一个耦合块,梯度/动量尺度大的头会主导共享更新方向、小尺度的头则被归一化不足;per-head 正交化把各头的更新尺度拉平,学习动态更均衡、大尺度下更稳,还顺带省了点开销(在瘦长的 per-head 块上做 Newton–Schulz 比在整块上便宜)。
至于那个反复出现的"相对 K2 约 2.5× 的整体 scaling 效率提升"(Fig. 7):它是架构、数据、训练三方面改进叠加、并为新配方专门重调关键超参(batch size、学习率、TPP、模型形状)之后,在留出 OOD 验证集上测出来的。这里有个方法论上很诚实的细节值得学:他们发现 cosine decay 和 WSD 在同一模型规模和 token 预算下最优超参差异很大,所以拿共享超参去比会不公平——于是给每个调度独立做 scaling-law 搜索,在各自最优设定下比,结论才是 cosine 更低 loss。这种"先保证比较公平、再下结论"的克制,是判断一份报告可信度的好信号。
七、后训练:多难度 RL 与多教师蒸馏
后训练是三段式:SFT 冷启动 → RL 训出不同推理努力的领域专家 → 多教师在线蒸馏(MOPD)把它们合成一个模型。
7.1 三域 × 三难度 = 九个专家
RL 不为每个任务单独训,而是横跨三大域各训一个专家:general tasks(通用体验、视觉、推理、忠实度、搜索、知识工作)、general agents(长程助理、深度研究、段落级写作)、coding agents(软件工程、编码体验、kernel、Web 开发)。三个域专家 × 三个推理努力档 {low, high, max} = 9 个专家模型。Fig. 8 显示:scaling RL FLOPs 时,工具调用步数会一致地涨上去,同时模型整体能力全面改善——把"能多调几步工具"当成能力涌现的一个可观测代理,是个很有意思的视角。
7.2 Reasoning Effort RL:用预算惩罚把"想多久"变成可调
为了在最大化 token 效率的同时微调推理努力,他们给每个问题 xxx 估一个初始 token 预算 b0(x)b_0(x)b0(x),对总预算 T(y)T(y)T(y) 超过 τ⋅b0(x)\tau\cdot b_0(x)τ⋅b0(x) 的轨迹把奖励覆盖成 −1-1−1。通用任务的 T(y)T(y)T(y) 数思维 token,agentic 任务则把推理和工具调用参数一起算进累计输出 token。训练按预算乘子 τ\tauτ 做分阶段课程:先训一个大 τ\tauτ 的 max-budget 变体(但仍封顶防过度思考),再退火 τ\tauτ 得到 high / low 档。这本质上是把"思考深度"变成一个可以退火调节的连续旋钮,而不是训三个独立模型。
对不可验证的通用任务,他们用 Agentic 生成式奖励模型(GRM),并加了一个和推理努力预算对称的冗长度预算控制:输出长度超过 σ⋅ℓ0\sigma\cdot\ell_0σ⋅ℓ0 的候选自动输掉二元比较——直接摁住"越写越长"式的 reward hacking。
7.3 MOPD:把蒸馏写成 RL 的稠密奖励(Eq 15)
多教师在线蒸馏用一个逐 token 的 clip 过的对数比作奖励:
ropdd(yt∣e,x,y<t)=clip (sg (logπteacher(d,e)(yt∣x,y<t)πθ(yt∣e,x,y<t)), −Rmax, Rmax) r_{\mathrm{opd}}^d(y_t\mid e,x,y_{<t})=\mathrm{clip}\!\left(\mathrm{sg}\!\left(\log\frac{\pi_{\mathrm{teacher}}^{(d,e)}(y_t\mid x,y_{<t})}{\pi_\theta(y_t\mid e,x,y_{<t})}\right),\,-R_{\max},\,R_{\max}\right) ropdd(yt∣e,x,y<t)=clip(sg(logπθ(yt∣e,x,y<t)πteacher(d,e)(yt∣x,y<t)),−Rmax,Rmax)
sg\mathrm{sg}sg 是 stop-gradient。为什么这么设计? 这是一个稠密的逐 token 奖励(不是稀疏的结果奖励),它能无缝塞进现有 RL 框架——于是 partial rollout 等长程任务的基础设施优化可以直接复用到蒸馏上。clip 约束极端优势信号、稳住训练。在线(学生生成轨迹、教师逐 token 打分)保证了分布匹配、没有训练-推理 gap。报告也很坦白:他们试过更细的 top-k 蒸馏目标,收敛速度和最终性能都没看到明显优势——这种"我们试了更花哨的、没用"的负结果,恰恰是有价值的隐性知识。
7.4 环境才是护城河:知识图谱引导的任务合成 + AET
这一节其实是 RL 真正的重头,因为 RL 的效果高度依赖"丰富、多样、可稳健验证"的环境。几个我认为最有借鉴价值的设计:
- 统一白盒 RL 环境:把 agent harness 抽象成一堆可配置、可组合的模块(工具接口、系统提示、上下文管理、skills、memories、subagents……),通过配置就能实例化 Kimi Code / Claude Code / Codex / OpenClaw / Hermes 等主流 harness,也能造全新的。目的是防止模型过拟合到某一套工具 schema 或交互协议——训练时动态换 harness 配置,逼模型学到跨 harness 的泛化。
- 知识图谱引导的任务合成(Fig. 9):agent 驱动地把一个层次化知识图谱递归展开成有向无环图,从粗到细采样节点、组关键词、去互联网抓真实材料、再合成各类任务。用细粒度概念做检索去挖冷门知识,用跨概念采样去拓宽覆盖,把"任务的质量和多样性"这件事本身工程化了。
- Autonomous Execution Tasks(AET):只给 agent 目标、约束、工具动作空间、预算和一个独立验证器,不给参考轨迹或预定义流程,逼它自己做任务分解、工具选择、规划、纠错、终止。奖励扎根在验证器对最终环境状态的评估,而不是 agent 自报完成。防 reward hacking 的手法很实在:公开验证器给诊断反馈 + 隐藏验证器评留出场景,再配有限提交预算的惩罚式奖励。
kernel 优化任务里还有个细节:为了让奖励反映"真优化"而非投机,他们专门做了 hacking-detection 去惩罚 CUDA graph replay、输入缓存、精度削减这类作弊,并随开发不断补新规则。这种"和作弊策略打持久战"的意识,是长程 agentic RL 能不能训出真能力的分水岭。
八、基础设施:3T + 1M 能跑起来的真正原因
如果说前面是"为什么这么设计",这一节就是"凭什么跑得起来"。报告自己的定位很清楚:K3 把三个平时不会同时出现的系统挑战塞进了一个模型——混合 KDA 注意力、3T 级稀疏多模态训练/推理、百万 token agentic 负载。基础设施是围着这三件事在整个模型生命周期上协同设计的。这一节的信息密度极高,我挑最能传递隐性知识的几处讲。
8.1 KDA 的系统协同:FlashKDA、片内 CP、KCP(Eq 17)
KDA 把 softmax 那个不断增长的 KV cache 换成固定大小的循环状态 S∈Rdk×dvS\in\mathbb{R}^{d_k\times d_v}S∈Rdk×dv——固定大小意味着好传输、好复用,但串行更新和 GPU 偏好的"宽而均匀的并行"天然冲突,而且这个冲突在训练/prefill/decode 三个执行阶段各表现为不同的瓶颈。他们对每个阶段单独设计 kernel:
- 训练/prefill——FlashKDA:基于 CUTLASS 的 chunkwise kernel,把块内计算和跨块状态传播重叠,拆成 token-parallel 阶段 + head-parallel 循环,各自独立调度调优,显著超过 Triton 参考实现。已作为 flash-linear-attention 的后端自动分发。
- 长上下文 prefill 的片内 CP:纯 TP 下每个 rank 只拿几个头、循环又不会因 TP 变短,prefill 超长序列会让大量 SM 闲着。关键观察是每段的状态转移可以独立于入态先算、之后再精确合成,于是一个 SM 级 CP planner 把序列切到单个 rank 的各 SM 上并行算转移、再合并恢复每段精确初态。纯片内、零跨设备通信。
- 跨设备 KCP(Eq 17):这是最需要慢读的一处。softmax 注意力的 CP 要交换随长度增长的 KV 块,线性注意力只需携带固定大小的状态。但普通线性注意力 CP 那套"每 rank 从 S=0S=0S=0 算局部态、再对前序 rank 求和"对 KDA 不成立——因为 KDA 的 delta rule St=MtSt−1+βtktvt⊤S_t=M_t S_{t-1}+\beta_t k_t v_t^\topSt=MtSt−1+βtktvt⊤ 带一个 token 相关的转移矩阵 Mt=(I−βtktkt⊤)Diag(αt)M_t=(I-\beta_t k_t k_t^\top)\mathrm{Diag}(\alpha_t)Mt=(I−βtktkt⊤)Diag(αt),一段序列的效果依赖于进入它的状态,从 S=0S=0S=0 单独算不出来。KCP 的破法是把每段效果分解成两个可局部计算的量:从零生成的局部态 S~\widetilde SS ,和累积转移 Mt←1=∏rMrM^{t\leftarrow1}=\prod_r M_rMt←1=∏rMr。真态是"累积转移作用在入态上、再加局部态":
S[i+1]t=S~[i+1]t+M[i+1]t←1S[i]Ti S_{[i+1]}^t=\widetilde S_{[i+1]}^t+M_{[i+1]}^{t\leftarrow1}S_{[i]}^{T_i} S[i+1]t=S [i+1]t+M[i+1]t←1S[i]Ti
这些片段满足结合律,所以每个 rank 的入态可以用一次**前缀扫描(prefix scan)**恢复。每 rank 先本地算好 (M[i]Ti←1,S~[i]Ti)(M^{T_i\leftarrow1}_{[i]},\widetilde S^{T_i}_{[i]})(M[i]Ti←1,S [i]Ti),用一次 all-gather 交换,之后按序回放前缀即可。因此 KCP 只需一次固定大小的 all-gather 做状态同步,计算线性可扩展。 这个构造建立在 DeltaNet 的 context parallelism 之上,实现已在 FLA 里开源。这就是让 1M token 训练对 KDA 层可行的那块基石。
8.2 MoonEP:有理论保证的完美负载均衡
常规 EP 里 token 负载在 rank 间不均衡,既拖慢吞吐、动态变化的专家激活形状又造成显存碎片。MoonEP 用动态冗余专家做到完美负载均衡——每 rank 恰好收 S×KS\times KS×K 个 token、各 rank 做等量计算。
最漂亮的是它给出了理论保证(附录 E):定理 1 证明"至多 E/RE/RE/R 个冗余专家/rank 就一定存在均衡计划"(EEE 专家数、RRR EP size),定理 2 证明这个界基本紧(M=⌈E(R−1)/R2⌉≈E/RM=\lceil E(R-1)/R^2\rceil\approx E/RM=⌈E(R−1)/R2⌉≈E/R)。为什么这个界重要? 只要每 rank 预留 E/RE/RE/R 个冗余专家槽,就保证规划永远有可行解、训练永不因此中断。对比之下,ECHO / UltraEP 预设冗余数或设 per-rank token 上限,一旦无可行计划就得停训、上限还要手调、且仍残留失衡。"永不停训"这件事有数学托底,才是 MoonEP 敢叫"完美"的原因。
完美均衡还连带简化了一切:零拷贝通信(planning kernel 预算好每个 token 的目的地,直接发到远端专家分组位置,缓冲区视图直接喂给计算;最坏情况下 DeepEP 要 S×K×RS\times K\times RS×K×R 的缓冲,MoonEP 只要固定 S×KS\times KS×K);静态形状、免同步执行(每 rank 恰好 S×KS\times KS×K token → 各层计算形状静态已知 → 消除每层 MoE 的 host-device 同步和 kernel 启动开销)。
8.3 显存高效训练:把重计算/量化/offload 做成可插拔策略
这一节的抽象设计值得单拎:统一激活管理器把每个为反向保存的张量都关联到一个可插拔存储后端,重计算、量化、offload/远程 offload 全都变成这层抽象下的"存储策略",可在张量粒度自由组合、用轻量注解声明、和模型代码完全解耦。把"怎么省显存"从模型代码里彻底剥离成一层策略,这是能长期维护巨型训练栈的工程素养。
具体优化里有几处很硬核:内存高效 MoE(受 SonicMoE 启发,把 permuted probs 的梯度重写成只依赖中间激活 act_output 和上游梯度 doutput 的形式,消掉对前向 output 的反向依赖;再只存 dispatch 输入、反向时重算 dispatch,并把重算通信和 group-GEMM 反向重叠掉);内存高效 AttnRes(block 表示只在边界层生成一次、后续层共享,AttnRes 计算整个包进 checkpointing,使每层为反向保存的激活和标准残差架构完全一致);P2P Muon 正交化(Newton–Schulz 要完整参数矩阵,与其对整个参数缓冲做 all-gather,不如每 rank 只用 P2P 取回自己拥有分片的那部分,消掉全参数缓冲、按 model-chunk 粒度流水线化把通信藏掉)。
8.4 1M Agentic RL:外置 KV 池与 AgentENV 沙箱
在几百张 GPU 内跑 1M 上下文 agentic RL,资源效率是头等目标。两条主线:
- 外置 KV cache 池:1M 上下文多步 rollout 里前缀 KV 命中/未命中的代价差好几个数量级,partial rollout 和投机解码又加剧了前缀块的churn。他们用 write-back 设计——活跃解码块留在 GPU,可复用的空闲前缀只在被逐出 GPU 时才写回 CPU DRAM 池、下次复用前再预取;KDA 状态和对应 MLA KV 块一起 offload/prefetch、生命周期对齐。rollout 期间还把训练态(权重+优化器态)offload 到 NVMe 给外置池腾 DRAM。这套"按需下沉、生命周期对齐"的缓存管理,是长上下文 RL 不被显存拖死的关键。
- AgentENV:基于 Firecracker 微虚拟机的沙箱,专为 agentic 工作负载设计。三个点值得记:其一,微虚拟机隔离让 agent 可以随意挂盘、跑容器、甚至起虚拟机,容器沙箱做不到的保真度和隔离它能做到(早期容器沙箱遇到过 agent 误操作引发的内核 panic 和死锁);其二,增量检查点只存自上次以来脏掉的内存页,checkpoint/resume 延迟低到 133ms/49ms,并提供 Pause/Resume(暂停沙箱零资源占用,而沙箱生命周期里高达 98% 是在等模型推理)、Fork(用于无副作用的奖励评判)、Snapshot;其三,OverlayBD 镜像 + 自定义 ublk 驱动 + P2P 传输做到亚秒级启动、6.5× 显存超售。整个训练评测里一共创建了 51,219,741 个沙箱、跨 1,505,678 个镜像——这个数字本身就说明了 agentic RL 的规模。
8.5 推理服务:KDA-aware 前缀缓存与舰队级调度
服务侧的核心矛盾是:混合 KDA–MLA 维护两种本质不同的缓存(MLA KV 随长度按 token 分页增长,KDA 状态每请求固定大小一份),且一个缓存前缀只有当两者能在同一边界一起恢复时才可复用。
- KDA-aware 前缀缓存:先把 KDA 状态打包进和 MLA KV 同一个分页块池、统一页字节大小,共享一套分配/引用计数/逐出。难点在粒度错配——块哈希缓存要求所有层共享一个块大小,但 KDA 状态快照只在稀疏边界才负担得起,逼得块大小到 1024–6144 token,太粗(短于一块的请求永远不可复用)。破法是解耦两种粒度:前缀哈希跑在 MLA 页内的细 hash block(如 512 token),物理块仍是粗分配单元;KDA 检查点只在 MLA hash 端点的稀疏子集上存。两阶段查找后,命中边界是"同时满足两阶段的最长边界",总是 hash block 的倍数、但不必是物理块的倍数。结果:任意共享前缀在任意 512-token 边界都可复用,和全注意力模型达到同等通用性。 Fig. 12 那个 B=2560=5×512B=2560=5\times512B=2560=5×512 的例子把这件事讲得很具体。
- 舰队级调度:cache-aware 亲和调度把每个 session 路由到持有其前缀缓存的集群(1M 上下文下一次命中能省掉重跑整个 400K 前缀,比未命中便宜好几个数量级),再用一致性哈希把 session 钉到主+备两个集群做故障转移,备集群的重 prefill 被均匀摊到全舰队;预算式准入控制给不同请求类各自的资源预算,让 2K–1M 这种跨三个数量级的负载里,突发的长上下文流量最多只吃自己那份、不拖垮短请求的 TTFT。
8.6 部署侧:MXFP4 QAT 与 draft model(Eq 16)
部署把主导参数显存的 MoE 专家权重量化到 MXFP4、激活 MXFP8,非专家部分保持高精度,并从 SFT 起就全程 QAT——RL 的 rollout 和训练共用同一量化方案,消除训练-推理失配。投机解码这边,K3 用预训练的 MTP 层微调成 EAGLE-3 风格 draft,并直接优化 LK loss:
LLK=−log∑x∈Vmin(p(x),q(x)) \mathcal{L}_{\mathrm{LK}}=-\log\sum_{x\in\mathcal{V}}\min\big(p(x),q(x)\big) LLK=−logx∈V∑min(p(x),q(x))
为什么不是 KL? 无损投机采样下每 token 接受率恰好是 ∑xmin(p,q)\sum_x\min(p,q)∑xmin(p,q)(目标分布 ppp 与 draft 分布 qqq 的重叠),而最小化 KL 代理并不保证对容量受限的 draft 最大化这个接受率。LK 直接优化接受率的负对数——直接盯着真正决定加速比的那个量,而不是它的代理。
九、评测与成本:一份诚实的天花板
主结论一句话:K3 整体上略逊于最强闭源(Claude Fable 5、GPT-5.6 Sol),但一致地压过其它开源和部分闭源。 我复现表 2 里最能说明问题的一小块:
| Benchmark | Kimi K3 | Fable 5 | GPT-5.6 Sol | Opus 4.8 | GPT-5.5 | GLM-5.2 |
|---|---|---|---|---|---|---|
| GPQA Diamond | 93.5 | 92.6 | 94.1 | 91.0 | 93.5 | 91.2 |
| HLE-Full(无/有工具) | 43.5 / 56.0 | 53.3 / 63.0 | 44.5 / 58.0 | 49.8 / 57.9 | 41.4 / 52.2 | – |
| ProgramBench | 77.8 | 76.8 | 77.6 | 71.9 | 70.8 | 63.7 |
| SWE-Marathon | 42.0 | 35.0 | 39.0 | 40.0 | 14.0 | 13.0 |
| BrowseComp | 91.2 | 88.0 | 90.4 | 84.3 | 84.4 | – |
| Harvey Lab-AA | 94.6 | 93.6 | 87.2 | 91.1 | 86.3 | 91.0 |
| GDPval-AA v2 (Elo) | 1686 | 1747 | 1736 | 1593 | 1491 | 1510 |
| OmniDocBench | 91.1 | 89.8 | 85.8 | 87.9 | 89.4 | – |
(以上均为报告所列分数,竞品分数按报告注明的第三方来源与评测设定引用,读者应把它们理解为"报告的口径"而非独立复核结果。)
有两点特别值得说。其一,报告的坦诚:它明确承认 K3 在研究级推理(HLE、CritPt)上落后于最强闭源,并把它点名为"关键改进方向"。一份愿意把自己天花板写清楚的报告,可信度天然更高——这也正是面向技术读者时不 overclaim 的价值。其二,成本效率(Fig. 13):在 Kimi Code Bench 2.0、BrowseComp、GDPval-AA v2、AA-Briefcase 四个套件上,K3 都坐在或贴近成本-效率前沿;BrowseComp 上 91.2% 只花 $2.03/任务,约是 GPT-5.6 Sol 的一半、比 Claude 系最大努力便宜一个数量级。对开源来说,“以一小部分成本拿到接近顶尖的分数”,比单看某一栏是不是 SOTA 更有现实意义。
网络安全评测那一节也很实诚:Tier 1 漏洞发现(防御性)里模型在数十个广泛部署系统上确认了数百个候选、含 6 个项目里 16 个此前未知漏洞;Tier 2 端到端利用里对 user-space 目标能打通、对加固内核目标则大量卡在利用链最后一段。他们把评测明确定位为"能力下界",并说会在每次重大更新时重估——这种对危险能力既不回避、也不夸大的态度,是负责任开源该有的样子。
十、如果你要复现 Kimi K3,应该怎么做
这是这篇报告最实用的落点,但要先泼一盆冷水:技术报告能传"显性知识"(做了什么、为什么),传不了"隐性知识"(怎么调出来的、踩过哪些坑)。 所以现实的复现要分层看——有些层 Kimi 已经把抓手开源了,有些层你得自己重走一遍。
第一层:架构复现(最可行)。 架构在 Table 1 里几乎完全给定了,权重也开源。你可以按下面这条链把主干搭起来:
- KDA 层:直接用 flash-linear-attention(FLA)里的 KDA/FlashKDA 实现(报告注明 KDA 已在 FLA、FlashKDA 单独开源),照式 (1)(2) 配 q/k/v/β/z 的投影,务必用式 (5) 的下界衰减(gmin=−5g_{\min}=-5gmin=−5、AhA_hAh 初始化 0),否则你会撞上 Kimi Linear 那个对角 tile 瓶颈。输出门用式 (6) 的全秩版本。
- 混合注意力:3 KDA + 1 Gated MLA 的 3:1 交替,末尾补一层 MLA;所有 MLA 层用 NoPE(这一步能帮你绕开长上下文外推的所有位置编码麻烦)。
- Attention Residuals:先实现式 (8)(9) 的 full form 验证正确性,再切成 Block AttnRes(式 10,N≈8N\approx8N≈8,K3 是 8 block × 12 层)落地。
- Stable LatentMoE:LatentMoE(ℓ=0.5d\ell=0.5dℓ=0.5d)+ 三个稳定器一个都不能少——RMSNorm(u)\mathrm{RMSNorm}(u)RMSNorm(u)、SiTU-GLU(β1=4,β2=25\beta_1=4,\beta_2=25β1=4,β2=25)、Quantile Balancing(配附录 D 的直方图估计)。QB 的对偶推导在附录 C,实现前建议先读懂它为什么等价于符号更新的精确坐标极小化。
- 优化器:Muon + per-head 正交化 + weight clipping,cosine 调度、1% 线性 warmup、weight decay 0.1。
第二层:系统复现(最硬核,但 Kimi 给了梯子)。 3T + 1M 跑不起来,架构对了也白搭。好在几块核心基建都开源了:MoonEP(perfectly-balanced EP,GitHub 上有)、FlashKDA / FLA 里的 KCP(跨设备 context parallelism,PR #691)、AgentENV(Firecracker 微虚拟机沙箱,用于 agentic RL)。你要自己补的是把它们和 PP+VP、EP、ZeRO-1 DP、Pipeline ZeRO-2、CP 拼成一套调度(Fig. 11 给了执行 schedule 的样子),以及显存管理那套"可插拔存储策略"抽象。没有 MoonEP 的静态形状/免同步和 KCP 的固定大小 all-gather,1M 训练的通信和显存基本无解——这两块是复现的真正门槛。
第三层:数据与 RL 复现(最不可迁移)。 这一层是护城河,报告只给了配方骨架,细节和数据不会开源:四域文本 + 大规模视觉语料、K2 的 rephrasing 配方、四阶段渐进上下文课程(8K→64K 预训练、256K→1M cooldown,把贵的长序列计算压在训练预算的一小部分里);后训练的九专家 RL、reasoning-effort 预算课程、MOPD(式 15)、以及 §4.2 那一整套 agentic 环境(统一白盒 harness、知识图谱任务合成、AET、kernel/personal-assistant/web-dev 环境和它们的验证器与 anti-hacking)。这一层你不可能"复现",只能"重建"——而重建的成败取决于你的环境工程和验证器设计,这恰恰是报告传不出来的隐性知识。
一句话总结复现路线:架构照抄(有开源权重和 FLA 兜底)→ 系统站在 MoonEP/KCP/AgentENV 的肩膀上自己拼 → 数据和 RL 环境只能自建。 越往后越难,价值也越高。
十一、这篇报告真正的贡献
如果只能用一句话概括 Kimi K3 的贡献,我不会说"它是首个开源 3T 模型"——那只是结果。它真正证明的是:架构和基础设施不该被当成两个前后相继的问题,而是同一个设计问题的两面。
你把全篇最漂亮的几个改动串起来看就明白了:下界衰减改的是激活函数,动机是 Tensor Core;NoPE 去掉的是位置编码,红利是长上下文外推免调参;SiTU-GLU 换的是激活,图的是低精度不溢出;QB 换的是负载均衡更新,靠的是对偶目标的精确极小化;MoonEP 的 E/RE/RE/R 界是个纯数学定理,保的是训练永不停。没有一个是"为了模型更聪明"而做的孤立 trick,每一个都是在"算法能不能让系统活下来"这个约束下逼出来的最优解。 这种把两条线拧成一股的能力,比任何单一 benchmark 数字都更能代表一个团队的工程成熟度。
对开源社区的意义也在这里。过去开源在第一条 scaling 轴上停滞,很大程度上不是因为没人想做大,而是因为做大之后系统跑不动、跑得动也养不起。Kimi K3 把架构、开源基建(MoonEP/FLA/AgentENV)、和一份足够诚实的评测放在一起,等于给社区递了一条"两条轴一起推"的可行路径——哪怕你复现不了全部,光是"下界衰减"“KCP”“QB”"统一存储策略抽象"这几把钥匙,就够很多团队少走很长的弯路。
它当然不完美:研究级推理还追不上最强闭源,最难的加固内核利用链还打不通,数据和环境这层护城河也注定传不出来。但它把"开源前沿"这四个字,往前实实在在推了一大步。
更多推荐



所有评论(0)