K2 用 1.04T 总参数、32.6B 激活参数和 MuonClip 跑完 15.5T token; K3 把总参数推到 2.78T、激活参数推到 104.2B,再用 3:1 的 KDA–Gated MLA 混合、AttnRes 和 Stable LatentMoE 处理 1M context。 两代方案共同的难点不是参数数量,而是把 attention 成本、专家通信和训练稳定性同时按住。
K2 的答案是 ultra-sparse MoE + MuonClip:384 个 routed expert、每 token 激活 8 个(sparsity 48), 61 层、64 个 attention head;MuonClip 用 per-head QK-Clip 把 attention logit 压回 τ=100, 15.5T token 训练没有 loss spike。
K3 的答案是 3:1 混合 attention + 更宽的稀疏容量:2.78T 总参数、104.2B 激活参数、 896 个 routed expert 中每 token 激活 16 个(sparsity 56)、 69 个 KDA + 24 个 Gated MLA、1M context。
两代模型都把“总参数”与“每 token 激活”拆开,但拆法不同:K2 在 1T 级把 Muon 稳定下来;K3 在 3T 级把线性 attention 的固定状态、周期性全局 attention、 深度方向的 AttnRes 和 latent-space MoE 组合起来。真正的工程增量落在 optimizer、并行度、激活内存和 cache 布局上,而不只是模型结构图。
数字的边界要说清:2.5× 是匹配 loss 的拟合 scaling efficiency,不是端到端加速;K3 的激活参数从 32.6B 升到 104.2B, 不能读成每 token 更便宜;在 HLE 和 CritPt 上,K3 仍落后 Claude Fable 5 与 GPT-5.6 Sol。
先把三个约束拆开:总参数、激活参数、长上下文 attention;它们决定 sparse MoE 能不能真的放大。
Dense Transformer 的容量和每 token 计算量绑在一起:参数越多,每个 token 的矩阵乘就越大。 MoE 把这两件事拆开:总参数决定容量,激活参数决定每 token 计算量。K2 是 1.04T 总参数、32.6B 激活参数; K3 是 2.78T 总参数、104.2B 激活参数。两代模型都走这条路,但比例不同。
Sparsity 的定义是 routed expert 总数除以每 token 激活的 expert 数。K2 是 384 个 expert、激活 8 个,sparsity 48; K3 是 896 个 routed expert、激活 16 个,sparsity 56。 这里有一个容易读错的点:K3 的 sparsity 更高,但它每 token 激活的 expert 绝对数量也更多(16 对 8)。 “更稀疏”说的是比例,不是每 token 更省计算。
K2 的 sparsity scaling law 给了这条路的依据:在固定激活参数(也就是固定 FLOPs)下,增加 routed expert 总数会持续降低训练和验证 loss。 在验证 loss 1.5 处,sparsity 48 相对 sparsity 8/16/32 分别把 FLOPs 降低 1.69× / 1.39× / 1.15×。 但 sparsity 越高,EP 通信、专家负载均衡和显存碎片越难处理;这不是免费的容量。
第二条约束是 attention。K2 的对照实验把 attention head 从 64 加到 128:在 128k 序列下,推理 FLOPs 增加 83%, 而验证 loss 相对 64-head 配置只改善 0.5%–1.2%。所以 K2 选了 64 个 head,而不是跟 DeepSeek-V3 一样用 128 个。 K3 把上下文推到 1M,attention 的成本问题只会更尖锐;混合 linear attention 是为此付出的结构代价。
第三条约束是稳定性。K2 在 9B activated / 53B total 的 MoE 上放大 vanilla Muon 时,最大 attention logit 很快超过 1000, 这种量级的 logit 通常会导致 loss spike,偶尔发散。QK-Norm 又不能直接用在 MLA 上,因为 MLA 的 Key 矩阵在推理时并不完整物化。 这是 QK-Clip 出现的直接原因:不去改 attention 的计算图,而是在 optimizer step 之后缩放 Q/K 投影权重。
容量看总参数与 routed expert 数;每 token 成本看激活参数、attention 头和序列长度; 稳定性看 optimizer 与 logit 的动态范围。把三者混在一起,就会把“总参数更大”误读成“每 token 更贵”, 或者把“sparsity 更高”误读成“计算更省”。
K2 不是 V3 的等比放大:它增加专家、减少 attention head;K3 再把 MLA 换成 3:1 混合。
DeepSeek-V3 的配置是 671B 总参数、37B 激活参数,256 个 expert、每 token 激活 8 个, 128 个 attention head、61 层、3 个 dense layer。它证明了 MLA + MoE 可以在开源模型里同时拿到容量和推理效率。
K2 从这张表出发,做了四处改动:总参数升到 1.04T,expert 增到 384, attention head 降到 64,dense layer 减到 1。 表 2 的 Δ 列写的是:总参数 +54%、expert +50%、attention head −50%、dense layer −67%;激活参数 −13% 是这四项的后果,不计入改动数。 这些改动不是拍脑袋:sparsity 48 来自 scaling law,64 个 head 来自 128k 下 83% 推理 FLOPs 换 0.5%–1.2% loss 的取舍。
Kimi K2 Table 2 的 DeepSeek-V3 / K2 对照;K3 列来自 Kimi K3 Table 1。K3 的 context 是训练上下文,V3 的 context 未列在同一张表里。 K2 的 128K 取自 Kimi K3 Table 1 的 K2 列;K2 §2.5 的上下文课程见 §04。
| 项目 | DeepSeek-V3 | Kimi K2 | Kimi K3 |
|---|---|---|---|
| 总参数 | 671B | 1.04T | 2.78T |
| 激活参数 | 37B | 32.6B | 104.2B |
| Routed experts | 256 | 384 | 896 |
| 每 token 激活 | 8 | 8 | 16 |
| Shared experts | 1 | 1 | 2 |
| 层数 | 61 | 61 | 93 |
| Attention heads | 128 | 64 | 96 |
| Dense layers | 3 | 1 | 1 |
| Attention | MLA | MLA | 69 KDA + 24 Gated MLA |
| Activation | — | SwiGLU | SiTU-GLU |
| 训练上下文 | — | 128K | 1M |
K2 的代价出现在系统侧。Muon 带来 logit 爆炸,需要 QK-Clip;EP 通信要跟 interleaved 1F1B 重叠,并且把 EP 压到 16; 激活内存靠 selective recomputation、FP8-E4M3 1×128 存储和 CPU offload 才放得下(§2.4.3)。 这些问题不会因为换一代模型消失,K3 只是把规模又推高了一档。
K3 的选择不是继续加 MLA 层,而是把 attention 拆成两条路:每个 block 里 3 层 KDA + 1 层 Gated MLA, 末尾再补 1 层 Gated MLA,最终是 69 KDA + 24 MLA = 93 层。 同时把 routed expert 从 384 增到 896、每 token 激活从 8 增到 16、层数从 61 增到 93。下一节拆这两套机制。
K2 的关键是让 Muon 的 logit 不炸;K3 的关键是让固定状态的 KDA 与周期性全局 attention 共存。
对每个 attention head h,先算这个 batch 里的最大 logit:
如果 Smaxh 超过阈值 τ,就把这个 head 的 Q/K 投影权重按 γh 缩放:
这个操作不改当步的前向和反向:Smaxh 只作为“下一步该缩多少”的信号,真正的缩放发生在 optimizer step 之后。 对 MLA,缩放要拆到分量上:qC 和 kC(head-specific)各乘 √γh,qR(head-specific rotary)乘 γh, kR(shared rotary)保持不动,避免影响其他 head。K2 取 τ = 100。
论文还报告了 QK-Clip 的“自关闭”行为:在 K2 的前 70,000 步里,只有 12.7% 的 attention head 至少触发过一次;训练稳定后 QK-Clip 基本停用(deactivated)。小规模消融用 τ=30 训练 0.5B activated / 3B total 的 MoE,loss 曲线没有明显退化(Appendix D)。
三个 head 的 S_max 是示例输入;τ=100 与 γ=min(1, τ/S_max) 的规则取自 Kimi K2 §2.1。all-heads 是论文所说的朴素实现:用全局 maxh S_maxh 算一个 γ,所有 head 一起缩放。
组 1:per-head,τ=100,三个 head 的 S_max 分别为 100 / 400 / 1200。
γ = min(1, 100/100) = 1.0000;post = 100×1.0000 = 100.0;S_max = τ,不触发裁剪。γ = min(1, 100/400) = 0.2500;post = 400×0.2500 = 100.0。γ = min(1, 100/1200) = 0.0833;post = 1200×0.0833 = 100.0。组 2:all-heads,τ=100,同一组 head。
S_max = max(100, 400, 1200) = 1200;γ = min(1, 100/1200) = 0.0833。post = 100×0.0833 = 8.3;Head B:post = 400×0.0833 = 33.3;Head C:post = 1200×0.0833 = 100.0。这个模拟覆盖了什么、没覆盖什么:覆盖 Kimi K2 §2.1 的 γ=min(1, τ/S_max),以及由该缩放规则推得的 post≈γ·S_max推断;
没覆盖 MLA 的 qC/kC/qR/kR 分量缩放、Newton–Schulz 更新、真实 kernel 的数值路径和 per-head 之外的并行细节。
也就是说,这里是按公式做的简化模拟,不是对 K2 训练代码的复现。
K3 的 backbone 每个 block 是 3 层 KDA 后接 1 层 Gated MLA,比例 3:1。 这个模式重复 23 个 block(69/3,由 Table 1 推得),末尾再额外放 1 层 Gated MLA,保证最后一层一定是全局 attention;因此总数是 69 KDA + 24 Gated MLA = 93 层。
KDA 是带 channel-wise forget gate 的 delta-rule recurrence。每个 head 维护一个固定大小的状态 S ∈ Rdk×dv, 先做 channel-wise decay,再做 delta-rule 写入:
K3 相对 Kimi Linear 改了两处数值细节。第一,把 log-decay 从无下界的 negative-Softplus 换成 scaled sigmoid: gmin = −5,每个 retention factor αt,j > e−5 ≈ 6.7×10−3; 16-token tile 的累计 log-decay 落在 (−80, 0),倒数重标定小于 e80,留在 BF16 动态范围内。 这样 diagonal tile 也能走 dense Tensor Core 矩阵乘,不必单独做 position-pair 计算。第二,输出 gate 从低秩改成 full-rank(Eq.6)。
Gated MLA 负责周期性全局检索。它沿用 MLA 的 latent KV cache,但对所有 MLA 层使用 NoPE:KDA 层提供位置敏感和 recency-aware 的混合, MLA 层只做无位置约束的全局内容交互。这样扩到 1M context 时不需要改 RoPE frequency、也不需要 YaRN 插值;论文把 8K→64K 放在预训练, 256K→1M 放在 cooldown(§3.4)。
K3 的 routed expert 不在 7168 维 hidden space 里工作,而是先投影到 3584 维 latent(hidden 的 0.5×), 在那里做 896 选 16 的稀疏 channel mixing。shared expert 保留全宽路径,每层 2 个; routed 侧是 896 个 expert、每 token 激活 16 个,sparsity 56。
极端 sparsity 带来两个失败模式:routed branch 里连续的矩阵乘会让内部激活爆炸;896 个 expert 的负载均衡也超出普通 aux-loss-free bias 的舒适区。 Stable LatentMoE 用三件事处理:expert 聚合后、up-projection 前加 RMSNorm;用 SiTU-GLU 给 gate 和 up branch 同时加软上限; 用 Quantile Balancing(QB)按 router score 的分位数更新 expert bias。SiTU-GLU 的参数是 β1=4、β2=25,输出上界 100;SwiGLU 没有这个上界。
标准残差把所有前层信息压进一个状态 hl,深层只能按固定方式累加。AttnRes 给每层一个可学习的 pseudo-query ql=wl, 对 embedding 和之前各层的输出做 softmax 加权,再求和。完整版要对所有前层做 attention,显存是 O(Ld);K3 用 block 版: 把层分成 8 个 block、每块 12 层,block 内先求和,block 间再做 attention,显存降到 O(Nd),N≈8 就能恢复大部分收益。 K3 的最后一块不满 12 层,加上 embedding 一共 9 个 block(§2.2)。
这一节只算系统账:并行度、激活内存、上下文课程和部署量化。
K2 先用 4,096 token 的上下文预训练:前 10T token 在 500 步 warm-up 后保持 2e-4 的常数学习率, 后 5.5T token 用 cosine 从 2e-4 降到 2e-5;weight decay 0.1,global batch 67M token。 收尾的 annealing 用 400B token、4k 序列,再用 60B token、32k 序列; 最后用 YaRN 把上下文拉到 128k。
集群是 NVIDIA H800,每节点 2 TB RAM、8 张 GPU,节点间 8×400 Gbps RoCE(§2.4.1)。 并行策略是 16-way PP + EP16 + ZeRO-1;BF16 参数加 FP32 梯度累积缓冲约 6 TB, 分布在 256 张 GPU 的 model-parallel group 上,每张卡为所有状态留约 30 GB。 K2 没有用 DualPipe:DualPipe 会把参数和梯度的显存翻倍,需要更高并行度来补,反而增加 PP bubble 和 EP 开销。
激活内存靠三层处理:LayerNorm、SwiGLU、MLA up-projection 和 MoE down-projection 做 selective recomputation; MoE up-projection 和 SwiGLU 的输入压到 FP8-E4M3 的 1×128 tile(FP32 scale)只用于存储,不进入计算; 剩余激活 offload 到 CPU,copy engine 与计算/通信重叠(§2.4.3)。
K3 的上下文不是一步到 1M:预训练从 8K 到 64K,cooldown 从 256K 到 1M;MLA 层用 NoPE,位置信息由 KDA 的 gating 和 decay 隐式提供 (§3.4)。这让长上下文扩展不需要改 positional encoding 的参数。
3T 级 MoE 的 EP 负载均衡用 MoonEP:它要求每个 rank 收到恰好 S×K 个 token,靠动态冗余 expert 做到完美平衡; 理论上每个 rank 最多需要 E/R 个冗余 expert,且这个界基本是紧的(essentially tight)。完美平衡还让计算形状静态化,省掉逐层 host 同步; 通信缓冲从最坏情况的 S×K×R 降到固定的 S×K(§5.2.1)。
长上下文推理侧,K3 把 KDA 的固定状态和 MLA 的 KV cache 放进同一个 paged pool,统一 page 字节大小; KDA prefix cache 的 block 粒度被迫落在 1,024–6,144 token(§5.4.1)。 部署侧从 SFT 开始做 QAT:routed expert 权重用 MXFP4,激活用 MXFP8,attention projection、latent MoE projection、shared expert 和 router 保持更高精度; RL 的 rollout 和 training 共用同一套量化方案,避免 train–inference mismatch(§4.1.4)。
Kimi K2 §2.4–2.5;Kimi K3 §3.4、§4.1.4、§5.2.1、§5.2.2、§5.4.1。K3 的总预训练 token 数本页未获取;K2 的部署量化方案本页未获取。
| 项目 | Kimi K2 | Kimi K3 |
|---|---|---|
| 预训练 token | 15.5T | 未获取 |
| 上下文课程 | 4k → 32k → 128k(YaRN) | 8K → 64K → 256K → 1M |
| 并行 | PP16 + EP16 + ZeRO-1 | PP + VP、EP(MoonEP)、ZeRO-1/2、CP |
| 激活内存 | recompute + FP8 1×128 存储 + CPU offload | unified activation manager + offload / quantization |
| 训练稳定性 | MuonClip,τ=100 | Per-Head Muon + K2 的 weight clipping |
| 部署精度 | 未获取 | MXFP4 专家权重 / MXFP8 激活 |
看 block 结构:KDA 管常量状态的长序列混合,Gated MLA 管周期性全局检索;AttnRes 在深度方向再做一次选择。
Kimi K2 Table 2;Kimi K3 Table 1、§2.1、§2.2、§2.3、§5.4.1。K2 的 128K 取自 Kimi K3 Table 1 的 K2 列;K2 §2.5 的上下文课程见 §04。
| 组件 | Kimi K2 | Kimi K3 |
|---|---|---|
| Attention | 61 层 MLA | 69 层 KDA + 24 层 Gated MLA |
| FFN | SwiGLU MoE | Stable LatentMoE + SiTU-GLU |
| Depth residual | 标准残差 | AttnRes(8 blocks × 12 layers) |
| KV cache | MLA latent KV | KDA 固定状态 + MLA latent KV |
| 训练上下文 | 128K | 1M |
先看条件再看数字:K2 是 non-thinking(长上下文任务按 128K 评测,K2 §4.1.1);K3 是 max effort、temperature 1.0(K3 §6.1.3);两套 benchmark 不能逐项横比。
Kimi K3 Table 1:K2 与 K3 的架构对照;Δ 列是表内给出的相对变化。K2 的 128K 取自 Kimi K3 Table 1 的 K2 列;K2 §2.5 的上下文课程见 §04。
| 项目 | Kimi K2 | Kimi K3 | Δ |
|---|---|---|---|
| 层数 | 61 | 93 | +52% |
| 总参数 | 1.04T | 2.78T | +167% |
| 激活参数 | 32.6B | 104.2B | +220% |
| Routed experts | 384 | 896 | +133% |
| 每 token 激活 | 8 | 16 | +100% |
| Shared experts | 1 | 2 | +100% |
| Attention heads | 64 | 96 | +50% |
| MoE hidden / expert | 2,048 | 3,072 | +50% |
| Latent MoE dim | — | 3,584(0.5×) | — |
| 训练上下文 | 128K | 1M | 8× |
| Attention | 61 MLA | 69 KDA + 24 MLA | — |
| Activation | SwiGLU | SiTU-GLU | — |
先看 2.5× 的口径。K3 论文用拟合的 scaling-law 曲线报告:在 held-out OOD 验证数据上,K3 相对 K2 有约 2.5× 的 overall scaling efficiency;这是“达到同样 loss 需要多少 FLOPs”的比较, 不是某个 benchmark 的分数提升,也不是 wall-clock 训练时间。K2 的 15.5T token 零 loss spike 同样是训练稳定性结果,不是能力分数。
再看参数账。K3 的总参数是 K2 的 2.67×(2.78/1.04),激活参数是 3.20×(104.2/32.6)。K3 的 sparsity 从 48 升到 56,但每 token 激活的 expert 从 8 个变成 16 个, 激活参数规模也翻了三倍多。因此“更稀疏”只描述 896/16 的比例,不能读成每 token 更省算力。 推断(依据:激活参数 104.2B vs 32.6B,Kimi K3 Table 1;K3 的 2.5× 是匹配 loss 口径)。
Kimi K2 Table 3:non-thinking 设置;输出上限 8192 token(SWE-bench Verified Agentless 为 16384);Avg@k 见表头。
| Benchmark | Kimi K2 | 条件 |
|---|---|---|
| SWE-bench Verified(agentic,single attempt) | 65.8 | Pass@1 |
| SWE-bench Verified(agentic,multi-attempt) | 71.6 | Pass@1,best-of-N |
| SWE-bench Multilingual | 47.3 | Pass@1 |
| LiveCodeBench v6 | 53.7 | Pass@1 |
| OJBench | 27.1 | Pass@1 |
| Tau2 retail | 70.6 | Avg@4 |
| Tau2 airline | 56.5 | Avg@4 |
| Tau2 telecom | 65.8 | Avg@4 |
| AceBench | 76.5 | Acc |
| AIME 2025 | 49.5 | Avg@64 |
| GPQA-Diamond | 75.1 | Avg@8 |
| MMLU | 89.5 | EM |
Kimi K3 Table 2:max reasoning effort、temperature 1.0;HLE-Full 的单元格是 no-tools / with-tools。
| Benchmark | Kimi K3 | 对照(Claude Fable 5 / GPT-5.6 Sol) |
|---|---|---|
| GPQA Diamond | 93.5 | 92.6 / 94.1 |
| DeepSWE | 67.5 | 70.0 / 73.0 |
| ProgramBench | 77.8 | 76.8 / 77.6 |
| Terminal-Bench 2.1 | 88.3 | 88.0 / 88.8 |
| FrontierSWE | 81.2 | 86.6 / 71.3 |
| SWE-Marathon | 42.0 | 35.0 / 39.0 |
| BrowseComp | 91.2 | 88.0 / 90.4 |
| MCPMark-Verified | 94.5 | 87.4 / 92.9 |
| HLE-Full(no tools / with tools) | 43.5 / 56.0 | 53.3 / 63.0 vs 44.5 / 58.0 |
| CritPt | 23.4 | 28.6 / 32.3 |
| GDPval-AA v2(Elo) | 1686 | 1747 / 1736 |
K3 的领先不是全表:在 ProgramBench(77.8 对 76.8 / 77.6)、 SWE-Marathon(42.0 对 35.0 / 39.0)、BrowseComp(91.2 对 88.0 / GPT-5.6 Sol 的 90.4;K3 的 91.2 采用 300K 触发的 context compaction,全 1M 无管理为 K3 的 90.4,K3 §6.1.3)和 MCPMark(94.5 对 87.4 / 92.9)上领先;在 HLE-Full(43.5 / 56.0 对 53.3 / 63.0)和 CritPt(23.4 对 28.6 / 32.3)上落后。论文自己的结论也是 overall 仍落后 Fable 5 和 GPT-5.6 Sol, 但在评测套件里持续领先其他 open 和 proprietary 模型(§6.1.4)。
K3 的 routed sparsity 是 56(896/16),高于 K2 的 48(384/8);但 K3 每 token 激活 16 个 expert,K2 只激活 8 个, 激活参数也从 32.6B 升到 104.2B。sparsity 是“routed expert 总数 / 激活 expert 数”的比值, 它描述的是容量在专家维度上的摊薄程度,不是每 token 的计算量。把 56 > 48 直接读成“K3 每 token 更省”,方向就反了。
把论文没覆盖的部分写清楚:研究级推理、端到端成本、预训练 token 数、以及 K2/K3 各自的失败模式。
K3 在 GPQA Diamond 上到 93.5,与 Fable 5 的 92.6、GPT-5.6 Sol 的 94.1 接近; 但 HLE-Full 是 43.5 / 56.0(no tools / with tools),低于 Fable 5 的 53.3 / 63.0 和 GPT-5.6 Sol 的 44.5 / 58.0; CritPt 是 23.4,低于 28.6 / 32.3。论文在结论里也写明,与最强 proprietary 模型的差距仍然存在 (§8)。这些是研究级推理的缺口,不是靠 1M context 或 MoE 容量自动补上的。
K3 的 2.5× 来自 held-out OOD 验证数据上的拟合 scaling-law 曲线(Figure 7), 比较的是达到同样 loss 所需的 FLOPs。它没有给出端到端训练时长、GPU 成本或推理吞吐的 2.5× 加速; 本页未获取这些系统数字。K2 的 15.5T token 零 loss spike 也一样:它说明 MuonClip 把训练稳定性跑通,不说明 K2 在每项 benchmark 上更强。
K2 明确写了 15.5T token(Abstract),K3 报告本页读到的是数据域、上下文课程和 scaling-law 设置, 总预训练 token 数未获取。因此本页不把两代模型的 token efficiency 直接换算成“每个 token 提升多少”。 K3 的 1M context 是训练上下文长度;本页也没有获取与 K2 Table 3 的 MRCR(128K 下 55.0)同口径的 K3 长上下文检索分数, 所以不把 1M 直接写成“长上下文能力 8×”。
QK-Clip 只约束 attention logit 的增长,不改当步的前向/反向;K2 的统计是前 70,000 步里 12.7% 的 head 至少触发一次, 之后训练稳定、QK-Clip 基本停用(deactivated,Appendix D)。它没有覆盖所有训练不稳定来源: MoE 负载均衡、EP 通信、激活溢出仍然要靠系统侧手段。K3 延续了 K2 的 weight clipping,同时换成 Per-Head Muon, 并加 RMSNorm、SiTU-GLU 和 Quantile Balancing,但这些都是针对特定失败模式的组合,不是通用的“稳定训练”保证。
KDA 把历史压进固定大小的 recurrent state,decode 成本不随序列增长,但容量固定意味着信息会被覆盖或衰减; K3 用周期性 Gated MLA 补回 token 级全局检索(§2.1)。 AttnRes 完整版要对所有前层输出做 attention,显存是 O(Ld);K3 用 8 个 block、每块 12 层的 block 版把显存降到 O(Nd), 代价是 block 内部的细粒度选择被求和压平(§2.2)。这两种都是有意的取舍,不是免费收益。
两代模型的核心都是“总参数”与“每 token 激活”的解耦,但解耦之后,真正的难点转移到 optimizer 的数值范围、attention 的序列成本、 expert 的通信与负载均衡,以及长上下文的状态管理。读 K2/K3 的数字时,先把这些条件与口径对齐,再比较分数和效率。