[BidClub_]
张小珺Jùn|商业访谈录 · · 124 min

152. 领读Kimi K3技术报告:从架构创新聊起,注意力美学、多教师蒸馏和开源MoE

张小珺孙宇涛

YouTube
TL;DR
  • K3的核心不是任何单点技巧,而是把2.8T总参、约100B激活、1M上下文的全量开源MoE做成“有效scaling”。 孙宇涛的第一性原理贯穿全场:“更大的模型才有更大的智能上限”;benchmark有无数种方式做得好看,但从模型能力本质上看,参数量仍是最有效的因素。他认为把激活参数做到“足足有一百billion”不依赖特殊技术,是一个非技术性的决定,但需要魄力。
  • K3的架构是“集百家之长”的综合结果,每项创新都有历史脉络。 KDA经历了RetNet、衰减机制、Mamba、DeltaNet、Gated DeltaNet等演进;苏剑林在DeltaNet基础上开发了适合GPU计算的chunk recurrent形式。KDA进一步采用channel-wise衰减,并围绕BF16精度范围进行kernel co-design。Latent MoE来自英伟达团队,Quantile Balancing则来自苏剑林博客。孙宇涛称赞Kimi引用前人工作时不会削弱前人的贡献。
  • K3做了几个反潮流选择,理由主要是工程和训练理性。 它放弃业界常用的WSD,采用更容易调参的cosine decay;不使用sparse attention,是因为Blackwell上求sparse index的开销很大,和hybrid架构及from-scratch预训练也不够兼容;未来可以保留接口,之后再做。
  • 后训练的On-Policy Distillation(OPD)如今更像组织与训练策略的简化工具。 从MiniLLM的reverse KL,到Thinking Machines Lab称作OPD,今天更常见的不是大模型蒸馏小模型,而是“自己蒸馏自己”。不同RL策略和数据高度异构,OPD可以把它们转化为同构的教师模型,再做multi-teacher合并;孙宇涛提到小米、JOM等团队也在采用类似方式。
  • 他给DeepSeek V3和K3的历史定位都强调size与有效scaling,而非单点突破。 V3是国内较早把模型scale到一定程度并打通全流程的模型;K3激活参数增加3倍多、总规模接近增加3倍,是下一个level。但“把数字调大”本身不解决问题,真正的创新在于把更大的模型做work。他也认为科学研究不存在阶跃式提升,只是渐进提升中的一些节点被称为milestone。
  • Kimi与DeepSeek的路线出现分化:一个优先推高开源能力上限,一个更强调性价比。 Kimi K3的API相当贵,性价比不是首要条件。孙宇涛的收官判断是:大模型可能没有太本质的创新了,后面更多是改良式进步;模型规模还会继续扩大,但不可能无限。只要能力和任务能够被清晰定义,就可以通过持续优化去达成;他自己则转向了世界模型,因为大模型领域对个人而言已经没有太大的新credit。
Digest · the substance, structured for research

1. 嘉宾底色:架构研究已从性能导向转向效率导向

  • 孙宇涛是清华大学计算机系博士候选人、上海创智学院普睿学者,博士期间主要研究大模型架构与预训练。
  • 他的博士课题从2023年开始,主线是解决大模型推理环节的低效问题。相较Vision或ImageNet时代通过精妙架构直接提升模型表现,大模型时代参数量仍是影响性能最主要的因素,架构改动带来的性能提升相对小,但不同架构的推理性能差异巨大,并且主要决定部署价格。因此,业界的架构研究逐渐从性能导向转向效率导向。

2. 起点工作:给线性注意力装上衰减,并提出chunkwise recurrent

  • 他的第一篇相关工作做了两件事:较早引入衰减机制,让有限状态空间尽量保留对最终结果贡献足够大的信息;在全递归与并行计算之间找到trade-off,提出块递归的线性注意力计算形式。
  • Chunkwise recurrent既能保留线性复杂度的收益,又能在kernel层面尽量调用Tensor Core、提高局部计算密度。后续很多线性注意力工作,包括Mamba-2、Gated DeltaNet和Kimi Linear KDA,都采用了这种chunkwise计算形式。

3. 纯线性注意力“认输”,hybrid成为不是trade-off的trade-off

  • 孙宇涛坦率地说,纯线性注意力作为模型架构“无疑是一个比较失败的尝试”:有限状态空间很难让它在长上下文中取得与全注意力完全相等的性能。
  • 因此研究从纯线性注意力转向hybrid attention,把线性注意力和全注意力组合起来。实验显示,混合注意力从架构上是trade-off,但从模型表现上并不一定是trade-off;在保留一定全注意力比例的情况下,可以取得无损甚至更好的长上下文效果。
  • 常见比例约为全注意力与线性注意力1∶3,即全注意力占四分之一。但加速比大致受混合比例限制,最多约为4倍。对博士生而言,这种方法虽然非常work,却不够新颖,也促使他继续寻找更大的加速空间。

4. YOCO:所有层共享一份KV Cache,Prefill跳过全注意力

  • 他从第一性原理出发思考:模型至少需要获取前文全部信息,因此从token维度完全省掉KV Cache并不可行。既然无法从上下文长度维度节省,就可以从层间节省。
  • YOCO让所有层共享一份KV Cache,同时把模型计算与存储解耦:只保存一份KV Cache,却保留多层Full Attention的计算结构,得到与全注意力或混合注意力基本等价的结果。
  • 它还可以在Prefill阶段跳过Cross Attention。Prefill的目的主要是得到供后续Decode使用的KV Cache,并不需要为每个位置解码出next-token prediction,因此只要通过Linear Attention得到KV Cache即可。
  • 从token-wise角度看,如果必须保证信息完整性,一份KV Cache已经是最少的,不可能再少。

5. Loop LM:两倍计算换接近两倍性能,存储开销基本不变

  • 孙宇涛把推理开销拆成三部分:Prefill时间、Decode开销和KV Cache存储,这是最主要的三个瓶颈。
  • YOCO主要解决Prefill和KV Cache,Decode则可以继续尝试sparse attention,但Kimi K3目前没有使用sparse attention。
  • 传统Loop Language Model在Decode阶段成本较高:它节省了参数,却没有节省计算;在相同计算量下,展开参数或直接使用更大的非loop模型,效果可能更好。同时,传统loop的KV Cache会随推理深度增加。
  • YOCO Universal把loop集中在线性注意力部分。由于线性注意力的KV Cache几乎可以忽略,同时也节省计算,因此额外成本较小。用大约两倍于原模型的计算强度,基本可以获得接近两倍的性能提升,而模型存储和KV Cache仍与原模型差不多。

6. 为什么执着架构,以及这次的讲法:把credit还给历史

  • 他喜欢架构创新,一方面是因为“比较有意思、比较好玩”,另一方面是因为它可能起到“四两拨千斤”的效果,对博士生来说是很好的研究方向。不过他也判断,到了2026年,架构创新能做的事情可能越来越少。
  • 2023年前后,全注意力是大模型推理和部署中的重要瓶颈。如果大模型要大规模应用,attention一定需要被解决,因此架构创新在当时具有很强的行业价值。
  • 他的分享不会只复述K3论文,而是从贡献点出发,展开相关工作的历史脉络。只看论文可以知道“怎么做”,但未必知道“为什么这样做”、历史上有哪些尝试,以及最后为什么形成现在的解法。

7. K3总览:2.8T的“有效scaling”

  • K3的核心卖点包括模型规模、上下文长度和整体结果。孙宇涛用一个极端例子解释“无效scaling”:如果只初始化一个2.8T模型、跑100B token就发布,显然不算有效scaling。
  • K3在2.8T总参数、约100B激活参数上实现了有效scaling,发布时这一规模明显大于国内其他开源模型;上下文长度也扩展到1M量级。
  • 他坚持认为,更大的模型才有更大的智能上限。benchmark可以通过很多方式达到满意结果,但从模型能力本质上看,参数量仍是最有效的变量。
  • 相比主要沿用DeepSeek-V3结构、重点做模型规模和非架构创新的Kimi K2,K3综合了Kimi团队、业界其他团队以及过去一年中的多项架构创新和细节调优,整体观感差异很大。

8. 线性注意力谱系:RetNet→Mamba→DeltaNet→Gated DeltaNet

  • KDA的复杂公式并非一次性设计出来的。最开始是RetNet式的简单线性注意力:将q、k、v做外积后累加;之后逐步引入与位置有关的衰减,使线性注意力不再对位置完全不敏感。
  • Mamba把位置无关的衰减进一步变成位置相关的衰减。DeltaNet则试图提升线性注意力在相同KV Cache大小下的上下文容量,使其比RetNet和Mamba更能处理长上下文。
  • DeltaNet刚出现时没有位置衰减,因此perplexity或benchmark结果并不特别好。Gated DeltaNet把DeltaNet较高的计算容量与衰减机制结合起来,得到更强的线性注意力表达形式。
  • 在是否继续优化纯线性注意力的问题上,孙宇涛一度倾向于“认输”,认为它很难匹敌全注意力;苏剑林则选择继续提升线性注意力本身的长上下文容量,两条路线最终都形成了成果。

9. KDA:channel-wise衰减与kernel co-design

  • 在Gated DeltaNet及更早的工作中,一个head通常使用一个标量衰减系数。KDA把这个标量改成更细粒度的channel-wise衰减,让不同channel拥有不同的衰减系数。
  • Channel-wise decay可以退化为均匀衰减,因此从表达能力上严格更强,但代价是kernel更难写:标量衰减在一个tile中只需处理一个变量,channel-wise衰减则复杂得多。
  • K3中的lower-bound decay同时服务于算法和实现。为了用绝对位置表示相对位置,需要对q、k做衰减与反衰减变换。例如“减2”可以表示为“减3再加1”,通过乘法结合律得到与递归形式等价的结果。
  • 但除以很小的数会造成数值问题,因此需要把衰减控制在BF16的动态范围内。Kimi Linear使用16-token tile,并从BF16范围反解出tile内允许的最大衰减量。
  • 这更像一种code design:通过算法约束,使一个tile内不出现数值问题,从而让kernelized实现更高效。KDA最终是在Gated DeltaNet基础上增加更细粒度的计算能力,同时限制由此带来的kernel和推理实现困难。

10. Residual谱系:从ResNet到Hyper-Connections

  • Attention Residual与ResNet有很深的联系。ResNet解决的是模型参数增加时能力和稳定性不应退化的问题。孙宇涛提到,ResNet有CVPR和ICCV两个版本,何恺明也曾讨论Pre-LayerNorm、Post-LayerNorm与训练稳定性的关系。
  • BERT时代更常用Post-LayerNorm,模型变大后逐渐暴露出梯度消失或训练不稳定问题,业界转向Pre-LayerNorm。
  • 苏剑林强调,Attention Residual不能只是Pre-LayerNorm和Post-LayerNorm的摆放变化,而应是Pre-LayerNorm的超集,至少能够退化为Pre-LayerNorm,并且严格来说更强,否则大规模训练不敢采用。
  • 孙宇涛尤其喜欢Hyper-Connections。它的核心是在residual分支上使用比模型hidden state更大的容量,表示模型在推理深度上的状态。思想很简洁,但论文形式较抽象,不太容易读,因此当时没有广泛出圈。
  • MHC后来更受关注,他认为一个重要原因是MHC由DeepSeek提出。Hyper-Connections和Attention Residual对推理基本免费,不明显增加推理开销,因此比“用更慢的实现换更好效果”的方案更容易被采用。

11. DenseNet的回响与“推理免费”的采纳法则

  • DenseNet是Hyper-Connections和Attention Residual绕不开的前身。它让深层直接看到所有浅层状态,再把这些状态聚合起来;ResNet主要是层与层之间的连接,DenseNet则聚合所有浅层信息。
  • DenseNet时代还没有充分利用attention的表达能力,主要通过一个较大的linear聚合hidden state。到了attention时代,大家发现这种实现会带来大量额外计算,于是出现了更轻量的DenseFormer等工作。
  • DenseFormer通过block attention等infrastructure design降低开销,并把模型深度解耦出来。它的表达能力严格来说不如完整的Attention Residual,但声称能力损失不大,同时相较baseline有明显提升。
  • 孙宇涛的采纳判断是:如果一个设计需要更慢的推理来换效果,就会被质疑为什么不直接扩大模型规模;如果推理阶段几乎免费,团队采用时就没有太大压力。
  • 被问到最喜欢哪个工作时,他选择了DenseNet和Hyper-Connections,认为后续工作的稳定性和co-design处理虽然重要,但更大的框架已经由早期工作奠定。

12. Latent MoE:接近free lunch的通信瘦身

  • MoE在Expert Parallelism下最大的挑战之一是all-to-all dispatch。token需要被分发到不同专家卡上,通信量会随着激活专家数量和hidden state大小增加;因此训练稳定性、训练方式和底层infrastructure都很复杂。
  • Latent MoE的核心是先把dispatch的hidden state压到更低维,通信量可能缩小2倍或4倍,同时通过提高MLP intermediate dimension,或者使用更多专家与更多激活,弥补参数量损失。
  • 如果configuration设计恰当,Latent MoE可以完全保持standard MoE的效果,甚至更好。训练时可以通过overlap部分掩盖通信,但推理时通信位于critical path,时间本身无法消除,因此推理收益比训练收益更明显。
  • 如果不牺牲表达能力就能降低通信,它就接近free lunch。Kimi K3采用了这种结构,并在Latent MoE之上加入了稳定性处理。

13. 两矩阵连乘与C2-GLU:给激活一个数学上界

  • 两个矩阵连乘在表达能力上可以合并成一个矩阵,但优化性质并不等价,训练中容易出现不稳定。因此如果架构必须把两个linear拆开,中间通常需要加入normalization。
  • MLA中低维投影再投影回来时有类似问题。Latent MoE先把hidden state压到低维,FFN的第一个计算本身又是linear projection,因此中间加入RMSNorm可以控制hidden state。
  • C2-GLU针对的是MLP中间激活容易explode的问题。问题一方面与优化器有关,另一方面与数值精度有关,低精度下更容易出现outlier。
  • GPT-OSS采用过直接clip的办法,例如设定5到10的clip值,严格控制上限。孙宇涛认为hard clip较粗暴,把它变成soft clip,就自然得到tanh;tanh可以平滑地逼近上下界。
  • C2-GLU通过tanh限制中间可能出现unbounded activation的部分,为MLP中间激活提供严格的数学上界,以保持训练稳定。它对表达能力的影响仍需实验验证,但属于相对安全的设计。

14. Muon与outlier:架构约束比优化器争论更直接

  • 孙宇涛观察到,使用Muon可能更容易出现outlier,但他也预判苏剑林会反对这一归因:任何优化器都可能出现outlier,不能只从优化器角度控制,想严格限制模型行为,还是应该直接从架构下手。
  • 他引用MuonClip相关讨论:Adam严格来说也不是完全稳定,DeepSeek-V3可能也出现过不稳定,只是没有影响最终结果。某种现象只是出现得早晚不同,若要严格限制,就应在模型架构上加bound。
  • Moonlight较早将VDK引入大规模Muon训练,以便在更长run中保持稳定;Kimi K2则在Muon基础上加入QK clip。由于MLA场景不便使用QK Norm,QK clip可以限制QK logits。
  • DeepSeek-V4和StepFun据他的判断也使用Muon,但采用GQA而非MLA,因此可以直接使用更简单的QK Norm。QK部分可以用clip或normalization限制,MLP部分则可通过C2-GLU等激活函数控制。

15. Quantile Balancing:把loss-free routing的启发式换成更principled的解法

  • Quantile Balancing没有单独发表论文,是苏剑林在博客中讨论的方案。它沿用了Loss-Free Routing通过bias控制专家负载的思路,但试图替代较为启发式的bias更新。
  • Loss-Free Routing的bias直接影响token选择哪些expert,但更新方式较为ad hoc,没有严格的数学收敛标准,与主模型更新的耦合关系也不明确。它在底层几层的效果不太好,因此一些做法会把最底下1层或3层改成dense。
  • Quantile Balancing尝试通过线性规划直接推导bias,在一个step内根据整体激活情况求出负载均衡的bias。为避免token之间发生信息泄露,本step计算出的β不会立即使用,而是在下一step使用。
  • 它的优点包括少一个类似learning rate的更新参数,以及更好的负载均衡能力。第一层也可以直接使用MoE,不必因为Loss-Free Routing失效而改成dense;这说明底层使用dense并非绝对必要,只是特定routing方案下的规避。
  • K3论文还补充了工程实现:大模型训练batch可能达到几十M token,精确求分位数需要保存所有token的激活,代价很高甚至不可行。K3按值域切桶,例如把sigmoid输出的0到1区间分成多个桶,再做histogram统计,以常数级存储完成更高效的近似计算,并适配大规模DP、EP。

16. ViT from scratch与优化器兼容性

  • 使用SigLIP 2等预训练ViT Encoder初始化可以加快收敛,但K3讨论认为直接初始化可能带来更大的训练不稳定性。这里的“不稳定”是相对概念,可以通过gradient norm分布、中间异常值数量以及norm大小来观察。
  • 从scratch训练可能多用一些算力,但经过恰当训练,最终结果不会有损,甚至可能相近或更好,同时gradient norm更加稳定。
  • 孙宇涛把它联系到Adam和Muon之间的训练兼容性:Adam训练的模型能否用Muon继续训练,Muon训练的模型能否再用Adam训练,通常还是原生一致的训练方式最好。基于这一点,他推测Kimi可能希望采用全Muon的训练方式,以获得更好的稳定性和兼容性。

17. 为什么K3没有sparse attention

  • DeepSeek Sparse在DeepSeek-V3.2中使用,GLM-5也使用了类似的DeepSeek Sparse Attention。但在Decode阶段,求sparse index本身的开销较大,因此实际加速很小;在Blackwell上,硬件越先进,这部分overhead反而可能越明显,甚至与full attention相比也没有显著加速。
  • GLM团队提出Index Cache,让不同层共享index,例如每4层或每8层共享一次。孙宇涛自己的方案则更进一步,把sparse index也做成once,像KV Cache一样将index开销分摊到所有层。
  • K3采用hybrid attention后,相邻的full attention层之间隔着多层线性注意力。跨层共享index是否有效、能否获得足够加速,仍存在疑问。
  • 另一个问题是sparse attention基本无法直接from scratch训练,通常是先训练full attention,再通过post-training转化成sparse attention。因此K3未来不排除把已有的full attention部分改成sparse,但需要额外工作;如果使用MLA,实现会更困难。
  • 他的总结是,K3暂时不采用sparse attention,一方面是要获得真实的加速比,另一方面是它与pre-training不够兼容,可以先保留接口。

18. 忒修斯之船:这还是Transformer吗

  • 张小珺提出,今天的模型训练似乎没有巨大范式创新,而是把很多既有工作融合起来再寻找更好的结果。孙宇涛认同这一观察,并用忒修斯之船作比喻。
  • 2017年最初的Transformer由attention、residual和stack layer等部分组成,其中一些概念在Transformer之前也并非全新。随着时间推移,模型逐步替换其中的组件,到了后来与最初Transformer的相似度已经很低。
  • 但大家仍然把它叫作Transformer。这个名称是否仍然成立,既是技术问题,也是一个哲学问题。

19. K3的工作性质:单点放在ResNet时代可能就是一篇架构论文

  • 孙宇涛把K3的综合工作拆成几个大点:attention设计、MoE设计、优化器和中间连接方式。
  • 如果放到ResNet时代,这些单点拿出来可能就足以构成一个架构。但在Transformer时代,单个点未必能独立成为milestone。今天要真正把模型做出来,需要验证scaling、解决工程问题、处理数据并完成完整训练,最后大家才会认可这个架构。
  • 从研究角度,他个人不太关注把所有东西捆在一起的综合方式,因为架构验证本身有严格标准,不一定需要把所有组件合并验证;但从行业和项目角度,现在确实需要这种综合性工作。

20. LR schedule反潮流:WSD的灵活性未必成立,K3换回cosine

  • WSD最初由MiniCPM提出,之后LLaSD等工作继续讨论。它观察到,从高学习率到低学习率的具体decay方式对最终结果影响不大,而cooldown阶段loss下降更快,因此可以把更好的数据放到cooldown阶段训练,把data schedule与learning schedule结合起来。
  • WSD的另一个优点是前段learning rate不变,训练团队可以更自由地调整最终token数量,例如提前或推迟发布,不必一开始固定完整训练长度。
  • 但实际最优learning rate仍与总token数有关:跑10T token可能6×10⁻⁴较优,跑20T token时可能3×10⁻⁴更合适。因此,任意扩展token数量并不一定像想象中那么有效,WSD的调节难度也未必低于cosine。
  • K3选择cosine decay,是因为它主要只有两个变量:训练token量和maximum learning rate;WSD还需要额外调节decay比例。从调参角度看,cosine更容易找到合适的设置。

21. Scaling efficiency:K3对K2是2.5倍,但那是综合结果

  • K3相较K2,总参数从约1T增加到2.8T,不到3倍;激活参数从32.6B增加到104B,超过3倍。
  • Kimi团队给出的scaling law结果是,K3相较K2的scaling efficiency达到2.5倍。这个问题可以放在OpenAI、Chinchilla等经典scaling law的脉络中理解。
  • 孙宇涛认为,K2和K3使用的数据不可能完全相同,因此两者的scaling behavior大概率不是在完全固定数据条件下比较的。2.5倍最终是模型架构、training recipe和数据策略共同作用的结果。

22. NoPE:混合注意力中的长上下文方案

  • 传统长上下文模型通常需要调整RoPE参数。Cohere团队的一项工作提出,在hybrid attention中,线性注意力部分已经引入了位置信息,因此full attention部分可以去掉RoPE,使用NoPE。
  • NoPE有两个好处:模型表现更好,扩展上下文长度时不需要调整架构参数。孙宇涛看到后很快复现,并认为效果有效且方案优雅,还在审稿中给出了strong accept。
  • 他同时认为,RoPE本质上带来的是recency bias:对short context建模很有效,但对长上下文没有帮助,甚至可能产生负面影响。RoPE并不带来长上下文能力,反而可能损害长上下文。
  • K3在长上下文训练中直接去掉RoPE,因此外推时不必重新调参数,长上下文效果也没有问题,甚至更好。

23. 低精度QAT为何放在SFT阶段

  • DeepSeek-V3从一开始就采用原生FP8训练,DeepSeek-V4采用原生W4A8训练;Kimi则先用高精度完成训练,在SFT阶段再引入低精度QAT。
  • 从项目管理角度,大规模训练使用高精度更保险。低精度在更大规模scaling中可能带来额外问题,而这些问题很难提前充分、精确地验证。
  • 从技术角度,孙宇涛根据自己的实验认为,没有必要从scratch阶段就引入低精度。W4A8在什么时候引入,只要经过一定量训练,最终结果可能差不多。
  • Kimi从K1.5到K2.5持续重视RL,K3也继承了这些相对成熟的方案,因此这一部分没有展开太多。

24. OPD:从白盒蒸馏到“自己蒸自己”的多教师合并

  • OPD的早期脉络可以追溯到微软亚洲研究院董立老师团队的工作。MiniLLM采取了与传统蒸馏相反的方向:不是让Teacher先生成答案、Student通过SFT或forward KL学习,而是让Student自己生成答案,再让Teacher逐步纠正。
  • 直观上,传统蒸馏像老师讲课、学生学习;Reverse KL则像学生自己做题和写推理过程,老师指出中间哪里不对。Thinking Machines Lab后来将这一范式称为On-Policy Distillation。
  • 早期OPD可以用于把更大的模型蒸馏为更小、更快的模型。但如今公司通常会直接训练旗舰模型并作为推理服务,不一定先训练一个大模型、再训练一个小模型,因此更常见的方式是“自己蒸馏自己”。
  • 从非技术角度,OPD可以简化post-training团队管理。不同专项的RL策略和reward高度异构,直接把verifiable reward、preference reward和reward model等放在一起训练较难;OPD可以把不同策略转化为不同教师模型,再做multi-teacher合并。
  • 对RL策略和数据来说,这是高度异构的;但对模型来说,各任务通常使用相近的模型结构,因此更容易合并。孙宇涛认为这不是K3首先采用的方式,小米、JOM等团队也应该在使用类似方案。

25. Draft model与DFlash:MTP接口要在预训练阶段留好

  • 小米曾有过达到1,000 TPS的方案:一部分来自Tianyi Liang团队关于融合不同阶段算子的工作,可能达到300到400 TPS;再叠加TensorRT和DFlash speculative decoding的加速,最终获得更高推理速度。
  • 这种方案适合愿意付出更高成本、换取更强单用户推理速度的场景。小batch下、希望获得较高单用户吞吐时,收益尤其明显。
  • 早期speculative decoding使用一个相对独立的小模型预测大模型,但这样无法充分利用大模型中间hidden state。MTP和Eagle-3都在尝试利用这些hidden state,让draft model更小,或在相同参数量下提高acceptance rate。
  • DFlash把传统autoregressive language model与diffusion language model的思路联系起来。Diffusion language model在单用户或小batch场景下推理更快,但从scratch训练效率不足,且多用户总吞吐不一定占优。DFlash利用这一推理方式进一步优化MTP或draft model,以提升单用户吞吐。
  • MTP与预训练的关系仍然很强。预训练阶段需要给MTP提供对下游draft model有帮助的接口,之后还要进行fine-tuning和特化,例如用KL loss替代传统next-token prediction loss,使draft model在主模型verify时更加对齐。孙宇涛认为这肯定不是MTP的终点。

26. KDA的CP:chunk可任意拆分带来的双层递归

  • 对sliding window或full attention来说,CP可以通过ring attention或zigzag attention实现,计算模式相对容易理解。Linear Attention的CP则需要回到chunkwise recurrent。
  • 线性注意力中,chunk内部采用并行计算,chunk之间采用递归计算。单机kernel层面可以把计算拆成16或64等更小的tile;KDA对衰减项的限制,主要就是为了提高chunk内部并行计算效率。
  • 线性注意力的一个特点是,chunk本身可以任意拆分,不同chunk大小在数学上完全等价,例如512 token一个chunk或8K token一个chunk。它不同于某些chunk间使用Linear Attention、chunk内使用Full Attention的拼接式方案,后者的chunk大小与架构有关。
  • 因此可以构建双层chunk:不同GPU之间以8K token的大chunk为单位递归计算,单机内再切成16-token tile并行计算;更大的chunk还可以继续采用chunk-within-chunk的方式。这种灵活性来自纯Linear Attention的chunkwise recurrent特性。

27. MoE EP:少量冗余专家与在线规划实现卡级均衡

  • Dropless EP有两个问题:不同GPU收到的token数不同,导致执行时间不同、彼此等待;同时,token数量不确定还需要额外通信,先告知各卡接收量,再发送token。
  • 从纯infrastructure角度看,带drop的EP可以通过全局allocation让专家获得均匀token数,但drop token对模型损失和能力的影响仍然明显,因此实际通常不采用。
  • Kimi提出动态EP:设置少量冗余专家,通过online planning提前规划哪些卡放置哪些冗余专家,使各卡token总数完全对齐。孙宇涛认为,从数学上可以证明,只增加小比例冗余专家就能实现这种卡级均衡。
  • 但卡级token均衡不等于专家级均衡。一张卡上有多个专家,不能保证每个专家收到同样多的token;如果要做到专家级完全均衡,就只能采取有损策略。这是模型能力与infrastructure之间仍可继续探索的空间。

28. 显存与overlap:用更简单的路径替代复杂通信优化

  • K3从软件工程角度更细粒度地决定每个组件采用activation保存还是offloading,并把大量中间计算结果offload到CPU。要保证offloading不拖慢训练,需要CPU-GPU通信与计算充分overlap,具体边界取决于集群环境和模型配置。
  • 可offload内容使用FP8存储,以节省一倍空间,从而可能跨过显存或通信带宽上的关键边界。
  • DeepSeek-V3采用了更复杂的MoE overlap:将一个batch的MoE forward、backward和下一个MoE forward重新排序,隐藏dispatch和combine通信;同时使用DualPipe缓解PP bubble和activation不均匀。
  • K3使用Latent MoE后通信量大幅下降,因此不必把另一个batch引入overlap,只需在一个batch内把MoE前后向通信与shared expert计算重叠。通信变小后,shared expert本身就可能覆盖通信时间。
  • PP方面,K3没有采用完全对称的DualPipe路径,而是把内存占用较大的PP rank中的内容转移到内存压力较小的rank,以较轻量的方式缓解不均衡。
  • Muon还带来optimizer切分问题:Newton-Schulz迭代需要完整矩阵。Adam是element-wise优化,参数摊平后如何切分通常不影响结果;Muon则需要特殊处理,才能在optimizer层面有效切分。

29. 多模态infra:每加一项功能,难度直线上升

  • Vision Encoder通常会在接入语言模型前压缩视觉token,例如输入前有32K token,进入主干时压缩到8K。但Encoder内部仍需处理压缩前的更长序列,因此即使语言模型主干不需要CP,Vision Encoder也可能需要CP。
  • Native VL训练还会带来卡间不均衡:有些卡几乎都是文本token,有些卡的视觉token比例很高,这会影响计算分布和PP。
  • 如果把Vision Encoder放在PP最前面,第一个PP rank的计算量会明显增加,破坏流水线平衡。K3把Vision Encoder放在中间或尾部,使前面的PP rank处理较浅层语言模型时,空闲的PP可以提前计算后续Vision Encoder步骤,从而减少bubble。

30. 论文为什么写这么细:减少对小道消息的依赖

  • 张小珺认为论文写得非常详细。孙宇涛的解释是,如果团队组织密度不足、自己无法解决这些问题,大家就会沉迷于小道消息,私下打听工程细节;如果论文把这些内容写出来,就不必依赖这些消息。
  • 他认为infrastructure本质上高度确定,并没有什么神秘难点。但如果想自己提出方案,就需要分析和profiling能力,也需要足够的组织密度和团队氛围。若无法自己提出,也可以follow较好的工程实践;如果连follow都做不到,问题就更大。

31. RL infra与推理引擎适配:共享gradient buffer与线性注意力缓存

  • RL需要大规模sandbox管理,每条trajectory可能有自己的Docker,因此容器管理本身就很麻烦。
  • 完整RL系统通常包括policy model、reference model、policy对应的gradient和optimizer,可能还包括reward model。K3讨论了不同模型之间共享memory的方式。
  • Reference model没有梯度,在计算objective时也不需要gradient;有了gradient之后,reference model可能不再使用。因此可以复用gradient buffer,让它为non-policy model做forward,从而节省一部分显存。
  • 推理端的Linear Attention面临prefix cache问题。Full Attention每个位置都有可增量更新的cache,而Linear Attention每一步都要在前一步的key-value状态上覆写,导致每一步prefix state都不同。
  • 如果全部保存这些状态,Linear Attention的优势会被抵消;如果完全不保存,又无法享受prefix cache。当前可以按block切分,每个block做一次prefix caching。
  • VLM的paged KV也需要兼容不同attention pattern。Full Attention、Linear Attention和sliding window不能完全采用同一套按token生成KV Cache的管理方式,因此需要额外的infrastructure和kernel配置。

32. 总评:100B激活是魄力,科学不存在阶跃式提升

  • 孙宇涛最impressive的地方不是某个单点技术,而是K3把激活参数做到足足100B,比他的预期还大。他认为具体定多少激活不是技术性问题,而是希望达到什么阶段、是否敢于把开源模型规模提升到新量级的问题。
  • 对杨植麟所说的“有概率的非共识”,他的判断是:真正有价值的技术创新已经被单独写成论文,K3刚发布时让他最surprise的主要是size,其他方面基本没有超出预期。
  • 他认为科学研究不存在阶跃式提升,技术总是由公司、项目和整个行业中的所有人逐步推动;大家只是习惯把渐进提升中的某些节点称为milestone。
  • 他认可Kimi的研究方式,认为其科学化主要来自内部管理:团队强调模型可解释性,尝试更可靠地获取behavior trace,并对不稳定或model collapse进行明确归因。
  • 他还认为,Kimi的团队文化并不依赖个人英雄主义。张小珺说大家似乎都不怕杨植麟,他的回应是,有道理就听谁的,谁有道理谁说了算;团队氛围则很大程度取决于leader的taste和性格。

33. K3与DeepSeek:定位分化与V3的历史地位

  • DeepSeek推出了两档模型,包括1.2T模型和更小的模型,整体更强调性价比,Flash模型也做得很好。
  • Kimi目前更重视提升开源模型能力上限,性价比不是首要条件,因此K3的API相当贵,比其他模型贵很多。
  • 对两家公司是否会继续分化,孙宇涛认为技术层面没有太多debate,好就是好、不好就是不好;组织团队的走向则取决于人的选择。
  • 他认为DeepSeek-V3以及R1更多是锦上添花,V3最大的历史意义在于国内较早把模型scale到一定程度并打通全流程。在V3之前,国内模型规模上的较大飞跃可能是Qwen-72B。
  • K3把激活参数增加3倍多、总规模也接近增加3倍,是下一个level。扩大模型size本身不是创新,只是把数字调大并不能解决问题;真正的难点和创新在于把更大规模的模型做work。

34. 未来判断:能力定义、模型规模与世界模型

  • 孙宇涛认为模型size毫无疑问还会继续扩大,但不可能无限大。人类能够在互联网上聚集的信息量有限,模型没有必要无限增长;更大的模型可能带来更宽的能力bound和更高上限,但最终仍受数据量约束。
  • 能力是否能实现,取决于任务是否被清晰定义。数学题、AIME等任务能够被明确描述,因此可以针对性优化;如果从商业化角度定义出明确能力,也可以持续优化达到。
  • AGI最大的问题是没有被well-defined。如果把AGI定义为具身智能、需要与真实物理世界交互,gap仍然很大;如果仍在language model范围内讨论,问题相对没有那么大。
  • 新团队如果具备足够好的团队、氛围和单兵作战能力,理论上仍有机会重做模型,但这些条件大概率难以同时出现。好的人和好的组织文化同时形成,存在历史局限性,不是想达成就能达成。
  • 他自己开始探索世界模型,是因为判断大模型可能没有太大的改良空间,也没有太多新的个人credit;世界模型的问题更大,但至少是一个新的领域。
张小珺

Hello,大家好,我是小俊。今天的节目是一集学习播客,学习 Kimi K3 的技术报告,希望和大家一起领略技术之美。K3 是有效扩展到 2.8T 总参数并全量开源的 MoE 模型。大家可能注意到,这集技术报告的领读播客距离模型发布已经过去了一段时间。期间我们试图寻找一位合适的嘉宾,希望这位嘉宾的工作和学术背景非常适合来讲 Kimi K3,最后找到了孙宇涛。雨涛目前是清华大学计算机系博士候选人、上海创智学院普睿学者。他从博士开始的研究方向是 LLM 架构、预训练,架构创新一直都是他的兴趣所在,这正好是 Kimi K3 的亮点之一。雨涛通过领读 Kimi K3 的论文,也串联讲解了十多篇相关论文。他的语速非常快,所以前方语速高能预警。期待 2026 年我们和 AI 共同进步。

孙宇涛

当然了,这块我觉得可能还有一些别的 concern。我们发现,如果用 MoE,它其实更容易出现 outlier,就很难控制中间的激活值。当然,如果我说 MoE 更容易引来 outlier,苏剑林一定会反对。他肯定会说,对于任何优化器来说,都一定会出现 outlier,因为从模型架构上是控制不了的。所以,如果想严格控制,方法一定是直接从模型架构下手。

哲学上还有一个对应的概念,就是忒修斯之船。刚开始,这条船在 2017 年启航的时候,它是 Transformer。它刚开始是怎么拼起来的?是 attention 加 residual。行驶的过程中,我们会慢慢把某些部分替换掉。到最后,它和 Transformer 的相似度已经很低很低了,你是否还把这个东西叫作 Transformer?这是一个问题。

我说一下我的判断,我的判断比较暴论:大模型可能没有太本质的创新了,后面都是改良性的进步。

张小珺

好的,那我们的论文学习播客又来了。这次我邀请了清华大学的 PhD candidate、上海创智学院普瑞学者孙宇涛,由他带领大家一起来学习和阅读最近关注度非常高的 Kimi K3 论文。不过,宇涛会带领大家读一系列论文。宇涛,你能不能先给大家做一个自我介绍,并且介绍一下你的研究方向?

孙宇涛

好的,各位观众朋友,大家下午好。我是来自清华大学的孙宇涛,在博士期间主要的研究方向是大模型的架构和预训练。

1. 架构研究转向推理效率

我的博士课题从 2023 年开始,主要研究大模型架构的一系列工作。那个时间点应该是 ChatGPT 刚刚发布不久,但我们的架构研究其实在 ChatGPT 发布之前就开始了。

这两三年,我主要尝试解决大模型推理环节的一些低效问题,所以研究方向基本都是围绕推理效率展开的。大家也可以注意到,在模型架构方面,整个业界的研究方向逐渐从偏性能导向,变得更加以效率为导向。

这方面其实有一些范式上的变化。在 Vision 时代或者 ImageNet 时代,大家还是尝试设计更精妙的架构,去提升模型本身的表现。但是在大模型时代,我们逐渐发现,对于模型性能而言,模型参数量永远是最主要的因素。相对于参数量本身的提升,模型架构上的一些改进所带来的性能提升,其实相当微小。

但是,不同架构在模型推理方面的性能差异是巨大的,而且这也主要决定了模型最后的部署价格。这两年,大家主要都在这个方向上努力。

我们从 2023 年开始探索线性注意力。刚开始,这项工作主要解决了两个问题。第一个问题是,线性注意力怎么尽量在比较通用的场景下,逼近全注意力的性能。

Linear attention 刚提出时,主要是希望用一个线性 kernel,以 kernelized 的方式去拟合二次复杂度的全注意力模式。所以在之前那个阶段,对于 linear attention 而言,它对位置信息不够敏感。虽然当时 linear attention 在形式上和 RNN 比较相似,但从建模特性上来说,RNN 还是比较强调 locality 表示的。

所以在那项工作里,我们比较早地引入了衰减机制。这样可以让线性注意力在有限的状态空间里,尽量建模那些对最终结果贡献足够大的信息。

另一个动机,是我们提出了一种 chunkwise recurrent,也就是块递归的线性注意力计算形式。对于线性注意力来说,如果把整个状态展开,在 token 维度上做递归计算,从效率上并不是最优的。但是,如果仿照注意力的计算方式去建模,又享受不到整体计算复杂度带来的优势。

所以,我们在并行计算形式和全递归计算形式之间找到了一个 trade-off,也就是块递归的计算形式。Chunkwise recurrent 既可以带来整体计算复杂度上的收益,同时在 kernel 层面尽量多地调用 Tensor Core,把局部计算密度拉满。这是我们提出的一个比较有效的计算范式。

大家如果关注后续的一些线性注意力改进工作,会发现基本都是基于这种 chunkwise 的计算形式进行计算的,包括 Mamba-2、Gated DeltaNet,以及今天的 Kimi Linear KDA。后面在这个计算模式之上,又出现了一些更细节的变化,之后我们还会详细讨论。

2. 线性注意力走向混合架构

从现在的视角看,纯线性注意力作为一种模型架构,无疑是一个比较失败的尝试。无论如何,有限的 context 都很难让它在长上下文中取得与全注意力完全相等的性能。到了今天,我们知道这是不可能的。

所以在 2023 年,我们注意到了这个现象,开始尝试从纯线性注意力转向 hybrid attention。Hybrid attention 顾名思义,就是把一些线性注意力和一些全注意力组合起来,作为模型架构。它听起来像是一个工程上的 trade-off,也是一个比较工程化的解法。

但是我们当时发现,混合注意力虽然从架构上看是一种 trade-off,但从模型最终表现来看,并不是 trade-off。大家已经发现,在保持一定全注意力比例的基础上,整个模型可以获得无损、甚至更好的长上下文表现。也就是说,在混合注意力模型中,我们并没有牺牲模型能力,却获得了工程上的收益。

这也是因为实验上的这个结论,混合注意力现在才被大规模利用起来。

张小珺

这是你的第一篇工作,对吧?

孙宇涛

对,是的。

后来我们发现,混合注意力在工程上是一个百分之百 work 的方法,直到今天也还是很好用。但是对于一个博士生来说,虽然它比较 work,大家也愿意 use,但从 novelty 上感觉差点意思,也不够有趣。

当时我们觉得,如果只是把两种混合注意力模型结合起来,会有几个问题。最大的问题是它的推理加速比,永远和混合比例成正比。现在比较常用的混合注意力比例,大概是全注意力和线性注意力 1∶3,也就是全注意力在整个模型里大约占四分之一。

如果我们认为四分之一是一个比较无损、也比较极限的比例,那其实很难拿到更大的加速比。无论是做 profile 还是做实测,最多也就是 4 倍左右。当然,我们做纯线性注意力时,希望加速比更高。如果混合注意力只是常数级改进,当时就觉得不是很有意思,所以后来我们做了 YOCO 这样的工作。

当时的 motivation,是从第一性原理去思考,为什么纯线性注意力没办法获得和纯全注意力一样的性能。原因很简单:我们至少期望模型具备一些基本能力,比如获取前文全部信息的能力。在这种场景下,整个上下文的 KV Cache 是没办法省掉的。

既然 KV Cache 没有办法完全省掉,我们能不能从另一个维度节省?当时我们发现,从上下文长度这个维度没办法节省,于是找到了另一条方向:从层间节省。

YOCO 做的是所有层共用一份 KV Cache 的架构。另一方面,从模型计算角度来说,每个 token 在 decode 过程中,计算密度也没办法减少,因为我们希望它保持一定的全注意力计算能力,这样才能达到理想的长上下文能力。

所以我们提出的另一个想法,是把模型的计算和存储解耦。虽然只有一份 KV Cache,但可以保持多层 Full Attention 的计算结构。这样,YOCO 只保留一份 KV Cache,却可以获得与全注意力或者混合注意力基本等价的模型计算结果。

这个架构还有另一个优势:在 Prefill 阶段可以直接跳过全注意力计算。Prefill 是模型处理用户输入的阶段,本质上只是希望拿到模型的 KV Cache,用于后续 Decode 的一系列 hidden state。Prefill 的唯一目的,就是得到 KV Cache。

在这种架构下,我们经过前面的 Linear Attention 计算,拿到 KV Cache 就够了。Prefill 阶段没有必要解码出每个位置后续的 next-token prediction,所以可以直接跳过 Cross Attention。但是在 Decode 阶段,我们仍然可以保持和传统模型一样的计算能力。

这就是我的第二篇相关工作。

张小珺

这个标题也挺有意思的。

孙宇涛

对,这也是一种致敬。它对应的是 “You Only Cache Once”,后来也有一系列致敬的工作。

张小珺

你只能缓存一次,是吧?

孙宇涛

对。这个从 KV Cache 的存储角度来说,基本上已经达到极致了。我们都同意,如果从 token-wise 的角度必须保证信息完整性,那么一份 KV Cache 就是最少的,不可能再少了。

我个人的第三篇工作,是从更通用的角度考虑模型推理开销。模型推理开销主要分为 3 个部分:Prefill 的时间开销、Decode 的开销,以及 KV Cache 的存储开销。这 3 个是最主要的模型推理瓶颈,不可能有第四个。

YOCO 主要解决了 Prefill 和 KV Cache,但没有解决 Decode。Decode 后续可以尝试用 sparse attention 的方式解决,不过 Kimi K3 目前没有使用 sparse attention,这部分今天先不展开。

我们后面的一个工作,和另一个方向比较相似,也就是 Loop Language Model。顾名思义,在保持模型参数规模不变的情况下,通过多次迭代来提升模型 FLOPs,从而提升模型整体能力。

Loop 这一系列工作的主要目的,是在保持较小模型参数规模的基础上,取得比相同参数量模型更好的效果。但是传统的 Loop Language Model 在 Decode 情况下,成本其实难以忍受。它只是节省了模型参数,并没有节省计算。在相同计算量下,把参数展开,或者使用一个更大但不 loop 的模型,最后效果反而更好。

传统 Loop Language Model 还有一个问题,就是它的 KV Cache 存储会随着模型推理深度增加。所以最后算下来,Loop Language Model 带来的总 KV Cache 其实相当大。

YOCO Universal 是在 YOCO 架构基础上做了位置上的改变。我们把 loop 单元变成一个很 efficient 的单元,从而避免推理时额外的、比较大的成本,同时保持模型效果稳定增长。

解法也很简单。YOCO 毫无疑问是一个混合注意力架构,但它不是交错式结构,而是两端式结构:模型推理前期是全线性注意力,后期是全注意力。

所以,我们把 loop 架构集中在线性注意力部分。这样对整体 KV Cache 的增长影响比较小,因为 Linear Attention 本身的 KV Cache 几乎可以忽略。第二,线性注意力不仅节省存储,也节省计算。在长上下文场景下,它带来的额外计算相当小。

虽然 Linear Attention 在 Decode 阶段的 attention 计算很小,但从模型整体能力来看,无论是 perplexity 还是 scaling behavior,都可以获得足够接近全注意力的模型能力。

所以这个架构可以达到这样的效果:如果用大约 2 倍于原模型的计算强度,基本上可以获得接近 2 倍的性能提升,但模型存储和 KV Cache 仍然保持和原模型差不多的推理开销。这是我的第三个工作。

张小珺

这方面的工作,是因为去年开始 Loop Language Model 成了大家比较热议的话题,所以你们做了一些探索。

你从 2023 年一开始读博,研究方向就一直在架构创新上,对吧?

孙宇涛

对,是的。

张小珺

这次 Kimi K3 在 LLM 架构和预训练上也做了很多工作,这也是我们今天邀请你来带大家读论文的原因。

孙宇涛

对。Kimi Linear 刚发布的时候,我们之间也有一些讨论。这项工作的连续性还是比较强的,Kimi Linear 其实也比较原封不动地搬到了 Kimi K3 的整体模型里。

张小珺

你为什么一直对架构创新感兴趣?

孙宇涛

我觉得有两方面。个人角度上,我觉得架构创新比较有意思、比较好玩。其他层面的工作,工程性因素会更强一些。当然,架构创新也有工程因素,主要是需要做一些 infrastructure 层面的 code design。

但我们之前也提到过,比如提出 chunkwise recurrent 这种计算结构,本身也是 infrastructure 层面的创新。所以我觉得这件事比较有意思,而且比较能起到四两拨千斤的效果。对于一个博士生而言,这是一个相当好的研究领域。

当然,2023 年是这样。到了 2026 年,架构创新能做的事情可能越来越少了。

从整个领域来看,全注意力当时是一个非常大的瓶颈。如果大模型推理要大规模应用,attention 这个东西一定需要解决,而且我们相信它一定可以解决。所以在那个时间点,从整个行业角度而言,架构创新对于模型部署是最重要的事情。

张小珺

这次的主题是一起读 Kimi K3 论文,但你对这篇论文有很多自己的想法,所以做了一个不一样的分享结构,并不是完全根据这篇论文展开。你能不能介绍一下整体分享的结构和逻辑?

孙宇涛

我一般讲 talk 的逻辑,是从模型本身、从论文本身出发。当然,所有论文都是建立在之前无数 related work 的基础上。所以我会选论文的几个贡献点,再去看这些贡献背后的历史脉络。

我的风格是把这个脉络打开。这样,如果只看这篇论文,你会知道它是怎么做的,但可能不清楚为什么这么做,也不清楚历史上大家是怎么做的、为什么最后得到了这个解。

我觉得从一个重要的点展开,对观众来说是一种比较好的学习方式。这样讨论也会更加综合,因为如果只讲一个点,我觉得意义是不够大的。

模型架构可能会占比较多篇幅。一方面,Kimi K3 在模型架构本身做了比较多的创新;另一方面,模型架构研究的脉络其实相当清晰,每个部分都有比较固定的 credit。我们可以把它拆成一个个点,逐一讲出来。

后面也会有一些 infrastructure 的内容。现在的模型比较依赖 infrastructure 和模型架构的 co-design,这两块其实密不可分。

至于预训练数据,大家肯定都处于比较秘密的状态,论文里也没有写。我不会讲论文公开内容以外的东西,所以这部分可能会涉及得少一些。

张小珺

你的罗列结构让我感觉到,我们最后看到的是 Kimi K3 的呈现,但其实它背后有很多人的 credit,不只是 Kimi 一家公司。现在做 frontier model 的一个有意思的地方,就是要吸收很多前人的工作,也要把 credit 给到大家。

这次讲解除了让大家理解 Kimi K3,也能理解它是怎么来的,对吧?

孙宇涛

对。我觉得作为一家公司,比较科学的方式是,如果你最后想把模型做好,肯定要博采众长。如果只想用自己的工作,可能就没有必要做这个事情,因为这样可能会错过别人做得比较好的工作。

整个行业都是由大家集体推动的。我觉得 Kimi K3 的一个比较好的点是,包括它之前的一些 paper,都比较客观、真实地把之前的工作用可靠的方式引出来,不会想办法削弱前人的贡献。这是它做得比较好的地方。

张小珺

所以我们这次从 Kimi K3 出发,串联起十几篇论文、技术报告,以及苏剑林老师的博客,有很多内容。那我们开始吧。

3. Kimi K3 做大有效 Scaling

孙宇涛

Kimi K3 从主要卖点来说,我觉得可以从几个方面概括。

首先是结果。结果特别好,而且数字都摆在那里,其实没有太多可以解读的。它为什么能达到这样的结果?Kimi K3 主要 claim 的是 3 个维度的 scaling。

最重要的还是模型大小的 scaling。它做到了 2.8T 的模型规模,而且是一个比较有效的 scaling 结果。什么叫无效?我今天晚上回去起一个 2.8T 的模型初始化,跑 100B token,然后放出来,显然是无效的。

Scaling 永远要建立在有效的基础上。Kimi K3 在 2.8T 这个规模上做了有效 scaling,模型激活参数也到了大约 100B 的量级。Kimi K3 发布时,这个规模比国内其他几家开源模型大很多。

另一个扩展,是模型上下文长度的扩展。它做到了 1M 的量级,自然可以获得更大的上下文窗口,解决更复杂的任务。

从模型整体来看,我觉得它遵循了第一性原理:更大的模型才有更大的智能上限。如果其他东西没有做得太错,模型参数量仍然是决定模型智能最本质的因素。

如果只看 benchmark,有无数种方式达到一个对内或对外满意的结果。但是从模型能力本质上看,模型参数量仍然是最有效的方式。Kimi K3 是一个相当早、也相当成功地达到这个量级的模型。

到了模型结构这一章,Kimi K3 综合了 Kimi 团队以及整个业界过去一年比较重要的一系列创新。Kimi K2 当时的发力方向,主要是模型 scaling 本身,以及一些非模型架构的创新,所以它主要沿用了 DeepSeek-V3 的结构。

Kimi K3 就大不一样了,它引入了很多新的、创新性的设计元素,包括自己的工作、别人的工作,以及一些比较创新的组件和细节调优。从观感上看,和 Kimi K2 很不一样。

4. Kimi Delta Attention 逐步成形

首先是 Hybrid Attention。我们可以回到 Kimi 自己的写作方式,从线性注意力过去三四年的发展历史讲起。

如果直接读 Kimi Delta Attention,会发现公式非常复杂。不同的项是怎么来的,具体承担什么作用?如果直接看公式,会发现它比经典 attention 复杂很多。每一项背后都有历史因素,是大家不断探索模型结构后得到的结果。

所以,如果想了解 Kimi Delta Attention 最后是怎么设计出来的,有必要先看看线性注意力经历了怎样的发展阶段。

最开始是 RetNet,这是线性注意力发展过程中不可避免的一个阶段。刚开始的线性注意力非常简单,就是把 q、k、v 乘出来得到一个外积,然后把它加起来。

之后,在这个基础上引入了衰减项。衰减和 token 的位置有关,这样就把 linear attention 从 position-invariant 的状态,变成了与位置有关的状态。

引入位置信息主要有两种方式。一种是加 RoPE,另一种是引入衰减项。语言的特性就是越近的位置通常权重越高,所以如果希望在有限上下文里取得更好的结果,衰减项是必不可少的。这是线性注意力早期发展中的一个经验。

另一个主要影响,就是 chunkwise recurrent 的计算形式。如果只是做偏学术性的研究,或者只是发 paper,可能不会从一开始就强调 kernelized 计算的效率。但我们发现,完全使用递归形式计算,在训练过程中甚至比类似全注意力的 parallel representation 更慢。

直接采用 parallel representation 又显得很低效,因为训练时完全享受不到线性注意力的收益,计算强度和全注意力一样,甚至还可能更高。它还涉及额外处理,或者 kernel 写得没有 FlashAttention 好。

所以我们需要找到一个可靠的计算 pattern,让它足够发挥 GPU 能力的同时,享受到复杂度上的加速。于是就有了 chunkwise recurrent。

RetNet 之后,有两个比较重要的节点。一个是 Mamba。Mamba 把位置无关的衰减变成了位置相关的衰减。

接下来是 DeltaNet。当然,DeltaNet 这个概念不是苏剑林提出的,它本身是更早的工作。苏剑林是在 DeltaNet 的基础上,开发了把 DeltaNet 转化成 GPU 可计算的 chunk recurrent 形式的方法。

当时苏剑林做这方面工作时,我还有点疑惑:看上去 DeltaNet 好像没法并行。他说可以并行,而且已经搞定了。

从 GPU efficiency 的角度看,DeltaNet 主要解决的是 infrastructure 层面的困难,而且解决方式很本质。

DeltaNet 刚出来时,我们尝试解决一个问题:线性注意力处理全上下文的能力不如全注意力。当时有两个方案。第一个是直接认输,承认线性注意力不可能匹敌全注意力。我当时有一段时间就是这种心态,意识到从纯线性注意力角度很难匹敌全注意力。

但苏剑林是另一个想法。他觉得还可以继续努力,提升线性注意力本身的长上下文容量,从而获得更好的能力。

DeltaNet 就是以此为目的。通过这种方式,可以获得比 RetNet 和 Mamba 更好的长上下文容量。本质上是在相同 KV Cache 大小的情况下,从算法上提高线性注意力的上下文容量。

DeltaNet 当时没有做位置衰减,所以从 perplexity 或 benchmark 来看,结果不是特别好。既然我们知道位置衰减可以帮助提升模型整体能力,为什么不把衰减和 DeltaNet 这种高容量的 Linear Attention 结合起来?

Gated DeltaNet 正是这么做的。我们结合 DeltaNet 更高的线性注意力计算容量,同时给它加上衰减,融合以后就得到更优的线性注意力表达形式。

如果没有 αt 这一项,就是比较经典的 DeltaNet。引入衰减后,就得到 Gated DeltaNet。这个表达形式已经比最开始的线性注意力复杂很多了。

RetNet 和 Mamba 的做法,是对上一个时间点的历史状态进行衰减。DeltaNet 引入了 Gated Delta Rule,在递归形式下额外增加了一项,复杂度就这样逐渐叠加起来。

回到 Kimi Linear,它在 Gated DeltaNet 基础上又做了一处改变,主要区别在衰减项上。

线性注意力是分 head 的。一般写公式时,会先考虑只有一个 head 的情况。对于一个 head,Gated DeltaNet 以及之前的工作中,衰减项通常是一个标量,也就是说整个 head 遵循相同的衰减系数。

这样做的好处是 kernel 比较容易写。如果把 decay 拆成更 fine-grained 的形式,kernel 就不太好处理,这是从 kernel 编写角度考虑的。

从模型能力角度看,把标量衰减变成 channel-wise 衰减,严格来说能力更强。Kimi Delta Attention 就是把 Gated DeltaNet 的衰减项从标量变成更 fine-grained 的量,让每个 channel 的衰减系数都可以不同。

这会带来更高的能力上限,因为 channel-wise decay 严格来说可以退化成均匀的 decay,所以模型能力是严格更强的。

当然,更强的模型能力也有代价。对于 Kimi Delta Attention 来说,代价就是 kernel 更难写。标量衰减项处理起来很容易,一个 tile 里只有一个变量;从标量变成 channel-wise 之后,处理难度会增加很多。

这就引出了 Kimi K3 里更细节的 lower-bound decay。为什么要有这个东西?一方面,从算法层面,我们希望衰减不要太快;另一方面,从论文和实现本身来看,它是为了和 kernel 做 co-design。

如果要处理更 fine-grained 的 decay,需要在数值上做一个巧妙的处理:对 q 和 k 做衰减的倒数变换。最简单的例子是,减 2 可以表示成减 3 再加 1。这个思想和 RoPE 也比较一致。

RoPE 在 infrastructure 上特别方便的一点,是可以通过绝对位置变换来表示相对位置变换。RoPE 的思路是用绝对位置表示相对位置,衰减也可以使用类似的方式。

比如有一个 α² 的衰减项,可能表示第 0 个 token 对第 2 个 token 的衰减,也可能表示第 100 个 token 对第 102 个 token 的衰减。如果要用绝对位置表示相对位置,就可以让 q 做一个较大的衰减,让 k 做一个较大的反衰减。通过乘法结合律,就可以得到和原来递归形式等价的结果。

但这样会带来一个问题:对于 Kimi Delta Attention,q、k 的一边会除以一个很小的数。乘以很小的数可能问题不大,无非是下溢到 0;但除以很小的数会带来数值问题。

从数值精度上看,我们希望把它控制在 BF16 的精度范围内。只有这样,利用绝对位置表示相对位置的方式才是有效的。

为了让衰减在一定窗口内控制在 BF16 的精度范围内,需要从数学上把它限制住。Kimi Linear 这里是一个 16-token tile,我们希望衰减在这 16 个 token 的范围内不要超出 BF16 的动态范围。

BF16 的精度范围是已知的,可以反解出在 16 个 token 的区间内最多能衰减到多大的量。Kimi Delta Attention 大概选了这样一个量。

所以,在 16-token 的 tile 里,可以证明衰减项不会超出 BF16 的 dynamic range。这个 lower-bound decay 更像是一种 code design:通过模型算法层面的控制,让它在一个 tile 内不产生数值问题,从而让 kernelized 实现更加顺畅。

如果不限制,当然也可以写出自己的 kernel,只是可能会低效一些。为了保证高效实现,Kimi Delta Attention 采用了在一定 tile 或 chunk 内控制最大衰减程度的方式。

归根结底,Kimi Delta Attention 就是在 Gated DeltaNet 的基础上扩展了计算能力,同时对由此带来的 inference 和 kernel 实现困难做了一些限制,最后得到 Kimi K3 采用的形式。

张小珺

好的,我们现在讲到 2.2,对吧?

孙宇涛

对,2.2 是 attention residual。Attention residual 当时还挺火,但如果从 attention residual 的研究脉络来看,我反而认为 Hyper-Connections 是一个相当好的工作。

张小珺

Hyper-Connections 是很早以前 Cerebras 团队提出的,对吧?

孙宇涛

对。这部分主要讨论的是深度模型中的深层到浅层连接方式。仔细考虑的话,它叫 attention residual,本质上和 ResNet 有很深的连接关系。

ResNet 解决的是,在模型参数增长的情况下,模型能力至少能够达到不退化的效果。从稳定性角度也是一样。无论是模型稳定性还是模型能力,ResNet 相比之前的一些工作都有本质提升。

大家可能没有注意到,ResNet 其实有两个版本,一个是 CVPR 版本,一个是 ICCV 版本。其实在 ResNet 时代,何恺明已经讨论过 Pre-LayerNorm、Post-LayerNorm 和训练稳定性之间的关系。

这也可以追溯到 BERT 时代。那时候大家更常用 Post-LayerNorm,认为它的结果可能稍微好一些。但随着模型逐渐增大,大家发现 Post-LayerNorm 会有梯度消失或者训练不稳定的问题,所以后来逐渐采用 Pre-LayerNorm 这样的残差连接方式。

苏剑林之前讨论过一个观点:Attention Residual 绝对不只是 Pre-LayerNorm 和 Post-LayerNorm 摆放方式的区别。如果只是这样,风险会很大,因为一旦触及 Post-LayerNorm 之前的问题,整个大规模 run 大家肯定不敢上。

所以,Attention Residual 强调的是,它一定是 Pre-LayerNorm 的一个超集,至少可以退化到 Pre-LayerNorm,并且严格来说比 Pre-LayerNorm 更强。

这部分主要是简单讨论 residual 这条研究线之前是怎么来的。Hyper-Connections 是一个相当有意思的工作。我觉得无论是 DeepSeek 后来做的改进,还是 Attention Residual,本质上都来自这篇工作。

它主要讨论的是,在 Pre-LayerNorm 基础上,如何增加模型残差的容量,从而提升模型表达能力。

我之前也和 Hyper-Connections 的一作交流过。我说,这个工作本身从技术上是很好的,但最大的问题是 paper 写得太抽象,不太容易读。

Hyper-Connections 本质上可以用一句话概括:在 residual 分支上使用比模型 hidden state 更大的容量,表示模型在推理深度上的状态。有更大的容量,通常就能取得更好的效果。

它在思想上相当简洁,但 paper 的形式可能复杂了一点。所以当时没有出圈,可能主要是做架构或技术的同学比较了解。

后来 MHC 可能比 Hyper-Connections 本身火了很多,但我觉得最重要的原因还是 MHC 是 DeepSeek 提出的,可能没有别的原因。

Hyper-Connections 和 Attention Residual 的一个好处,是它们对于推理基本是免费的。也就是说在模型 inference 阶段,几乎不会增加推理开销,却能拿到更好的模型结果。

如果通过更慢的实现或更慢的模型架构设计来提升模型表现,就会有一个自然的质疑:为什么不直接扩大模型规模?这样还简单一些。

所以,通过更慢的模型实现来提升效果的方法,往往会被质疑。对于比较保守、或者不是自己提出的设计,如果它在推理阶段几乎免费,大家使用时就没有太大压力。

这类模型设计和增加模型参数并不是同一个状态,所以比较容易被采用。

Hyper-Connections 这条线上还有一个绕不过去的工作,就是 DenseNet。DenseNet 是更早的工作,是黄高老师在 ResNet 之后提出的一种连接方式。

DenseNet 和 Attention Residual 在思想上有密切联系。ResNet 主要是层与层之间的连接,而 DenseNet 是深层去看所有浅层的状态,再把它们聚合起来。

只不过在 DenseNet 时代,还没有 attention,或者说大家没有特别重视 attention 的表达能力。DenseNet 主要是用一个大的 linear,把之前所有 hidden state 聚合到一起。

到了 attention 时代,大家发现 DenseNet 的实现本身并不快,因为中间的连接会带来大量额外计算。

但是在 attention 时代,可以把 DenseNet 中一些 heavy 的部件变成更 lightweight 的部件,于是就出现了 DenseFormer 这样的工作。

DenseFormer 最大的优势,是相比 DenseNet,它是一个更 efficient 的架构。通过更深层次的 infrastructure code design,比如 block attention 的方式,可以把模型深度解耦出来。

如果只是全注意力,上层会和底下所有层交互。模型越深,这部分 overhead 越不能忽略。Block attention 在这里做了解耦,所以一方面 attention 本身的计算比较轻量,另一方面解耦了深度。最后看起来,它是一个比较灵巧、同时能够有效提升模型能力的组件。

这里可以看一些 scaling 结果。由于 block attention 解耦了深度,严格来说表达能力肯定不如完整的 attention residual。但它的 claim 是,能力并没有损失太多,而且相比 baseline 有比较显著的提升。

Attention residual 这一部分,主要应该就是前面技术论文里讲的内容,Kimi K3 没有做太多特殊处理。

张小珺

刚才讲的这些工作,你觉得哪个创新性最强?

孙宇涛

我更喜欢 DenseNet 和 Hyper-Connections。

DenseNet 是一个相当早的工作。在那个时代,大家考虑连接问题时,我觉得它本质上已经考虑到了 residual 要解决的问题,只不过当时还没有 attention。

Hyper-Connections 相当于在 Transformer 时代把这个东西重新带了回来,让大家重新讨论如何设计更强的连接方式,从而提升模型性能。

后面的工作当然会有模型稳定性等问题,但我觉得大的框架其实已经由之前的工作确定了。

张小珺

好的。然后它的 MoE,应该是年初英伟达团队提出的,对吧?

5. MoE 控制通信与训练稳定

孙宇涛

对。Latent MoE 的一个比较大的好处是,如果熟悉 DeepSeek-V3,就知道训练 MoE 无论从模型稳定性、训练方式,还是 infrastructure 层面,都是很大的挑战。

最大的挑战是 MoE 的 all-to-all dispatch。在 EP 场景下,它的 overhead 相当大。为了解决这个问题,不得不引入 DeepEP 这样的高性能通信库,降低 all-to-all dispatch 的开销。

不同 MoE 架构不仅影响模型架构本身,甚至会影响底层 infrastructure 的设计选型,后面讲 infrastructure 时还会更多讨论。

Latent MoE 的本质,是能不能减小 all-to-all dispatch 的开销。All-to-all dispatch 需要把 token 分发到各个专家卡上,通信量会随着激活专家数量和模型 hidden state 大小并行增长。

Latent MoE 的思想,是在减少通信量的同时保持模型表达能力。它把 dispatch 的 hidden state 变小,可能缩小 2 倍或 4 倍。

当然,如果直接减小 hidden dimension,后面的 MoE 参数量也会随之减少。为了弥补 latent dimension 减小造成的参数量损失,有两种方式。

第一种是提升 MLP intermediate dimension,通过增加 MLP 本身的参数量,把之前减少的部分弥补回来。另一种是进一步把模型拆碎,使用更多 expert 和更多激活,弥补模型参数量的减少。

总体来看,英伟达的论文结果更好。简单来说,如果 Latent MoE 的 configuration 设计得恰当,它可以完全保持 standard MoE 的效果。也就是说,在模型能力相当、甚至更好的情况下,可以减小模型 latent dimension,降低通信开销。

通信开销在训练和推理中是不一样的。训练主要优化 throughput,可以通过 overlap 手段弥补通信部分。对于 inference latency,尽管可以用一些手段掩盖通信开销,但时间本身是避免不了的,因为它整体处于 critical path 上。

所以,对模型推理 latency 来说,通信开销仍然是不可忽略的。模型 efficiency 上,推理收益比训练收益更大,当然训练也有一定收益。

如果 Latent MoE 不是一种 trade-off,不需要牺牲表达能力就能降低通信,那么它就接近 free lunch。Kimi K3 采用的就是这样的结构。

在 Latent MoE 之上,还有一些细节改进。这里可以讨论一个很经典的问题:两个矩阵连乘。

两个矩阵连乘是非常基本的单元。从模型表达能力来说,它是没有区别的,因为两个矩阵严格来说可以合并成一个。但从优化性质来说并不是这样,两个矩阵连乘经常会出现训练不稳定的问题。

所以,两个矩阵连乘中间一般会加一些稳定性手段。这个思想在 MLA 中也出现过。MLA 本质上是先做一个低维投影,再把它投影回来,也就是两个 linear 连乘。两个 linear 中间通常会加 normalization,控制中间 hidden state,从而提升训练稳定性。

Latent MoE 也是类似的道理。如果模型架构设计不得不把两个矩阵连乘拆开,中间就应该加一个类似 normalization 的手段。

Latent MoE 先通过 linear projection 把模型 hidden state 压到低维状态,再进行后续计算。对于 FFN 来说,第一个计算本身也是 linear projection,所以这里会出现两个 linear projection 连乘的情况,需要用 RMSNorm 控制它。

张小珺

下面就是 C2-GLU。这个设计看起来没有那么直观。

孙宇涛

C2-GLU 也和之前的一些设计有关。对于大模型训练来说,FFN 里的 MLP 中间 hidden state 很容易出现 activation explode。这一方面和优化器有关,另一方面也和模型精度有关。在精度更低的情况下,中间 hidden state 更容易出现 outlier。

为了解决这个问题,GPT-OSS 刚开始采用了一个很简单的办法:把最简单的 SwiGLU 中没有 bound 的那部分直接做 clip。比如设一个 clip 值,5 到 10,然后把它限制在这个范围内。这样可以从数学上严格控制上限。

Clip 是比较粗暴的做法。如果把 hard clip 变成 soft clip,就会比较自然地得到 tanh。Tanh 的作用就是 soft clip。如果指定一个下界和上界,它可以用比较平滑的方式逼近希望的上界。

从这个角度可以把它理解为 clip 的升级版。但这个升级版对模型表达能力有多大影响,是另一回事,需要具体实验来证明。不过,无论如何,它还是一个比较安全的做法。

从 SwiGLU 开始,原本比较自由的 linear projection 被改成了有 tanh bound 的状态。

另一部分是 SwiGLU。它前面是一个 linear 结果,再加上一个 SwiGLU 结果。这个 gate 又可以拆成 sigmoid 和另一个 linear projection,而且这里是共享 weight 的状态。

C2-GLU 相当于把中间可能出现 unbounded activation 的部分,通过 tanh 的上下界限制住。这样可以给整个 MLP 的中间激活一个严格的数学上界,用来保持模型训练稳定性。

当然,这里可能还有一些 concern。我们发现,如果使用 Muon,可能更容易出现 outlier,也就是很难控制中间激活值。

如果我说 Muon 更容易引来 outlier,苏剑林一定会反对。他肯定会说,对于任何优化器来说,都一定会出现 outlier,因为从模型架构上控制不了。所以如果想严格控制,一定要从模型架构本身下手。

这个观点他可能没有直接说过,但我猜他会这么说。之前在 Kimi K2 的 MuonClip 里,也讨论过类似问题。

大家如果记得 Kimi K2 或者 Moonlight,当时会说,因为用了 Muon,QK logits 更容易爆炸,所以 Moonlight 采用了针对 QK 的特殊处理,去压制模型的 outlier。

当时大家问,为什么以前用 Adam 训练时不需要加这个东西?为什么以前的 QK logits 很稳定,不需要额外处理,但用了 Muon 就需要特殊处理?

苏剑林当时的回复是,从严格来说,Adam 也不是完全稳定的。DeepSeek-V3 可能也出现过一些不稳定现象,只是没有影响模型最终结果。

他对 MuonClip 的观点是,如果在训练中出现了某种现象,从严格意义上讲它是容易出现的,只是出现得早晚不同。为了严格限制模型行为,还是应该从模型架构本身做限制,这是更本质的方案。

所以他应该也会对 C2-GLU 持相同观点:为什么不直接在 architecture 上做改变,把整体的 bound 限制住,就不需要纠结更复杂的优化器细节了。

张小珺

MuonClip 是 Kimi K2 的沿用,对吧?

孙宇涛

对。相比 Kimi K2,这部分没有太多改变。早期比较严重的问题是控制不住中间激活的 outlier。更早的版本连 VDK 都没有加。

Moonlight 比较早地把 VDK 引入大规模模型训练。这样在更长的 run 里可以保持稳定。Kimi K2 则是在 Muon 的基础上,额外加入了 QK clip。

这两个结合起来,就是 Kimi 团队在优化器上的一套比较完整的工作。

现在大家使用 Muon 的方式比较多,但解决方式不太一样。比如使用 MLA,就没办法加 QK Norm,因为 QK Norm 可以严格限制 QK 的边界。

为了适配 MLA 和 Muon 的结合,Kimi K2 引入了 QK clip。DeepSeek-V4 和 StepFun 应该都用了 Muon,但它们使用 GQA,没有使用 MLA,所以直接用 QK Norm 是更简单的办法,可以控制 Muon 带来的额外 outlier。

Outlier 不只会在 QK 中出现,也一定会在 MLP 中出现。不同团队采取了不同方式:QK 部分用 clip 或 normalization 限制住,MLP 部分则采用更轻量的手段。Kimi 现在就是通过 C2-GLU 这样的激活函数,把它限制住。

Quantile Balancing 没有单独发表论文,是苏剑林在自己的博客里讲的。它主要沿用了 Loss-Free Routing 的方式,控制方法只通过 bias,而不是通过整体的 auxiliary loss,来解决专家负载均衡问题。

Loss-Free Routing 有一个让大家比较困惑的问题,就是 bias 变量直接决定每个 token 选择哪些 expert,但它的更新方式有些 ad hoc,采用的是启发式更新方案。

这样有两个问题:第一,它没有严格的数学收敛标准;第二,它和主模型更新的耦合关系没有那么明确。

当然,这个形式本身是 work 的,效果也不错。但在使用 Loss-Free Routing 时,大家可能会把模型最底下几层,比如 1 层或 3 层,去掉 MoE,变成 dense。原因是对于底层模型,Loss-Free Routing 的效果不是很好。

正因为 Loss-Free Routing 没有做整体的 hard constraint,它可能需要采取其他方式,弥补模型在大规模训练中遇到的问题。

Quantile Balancing 主要是尝试用一个更 principled 的思想,解决模型训练中的 MoE 负载均衡问题。Loss-Free Routing 的 update 方式经过大量调整,已经是一个 work 得不错的方案。它本质上很简单:某个专家激活多了,就把 bias 往下调一点;激活少了,就把 bias 往上调一点。

Kimi 团队采用了更 principled 的方案:能不能直接通过线性规划推导出 bias 应该是什么样?答案是可以,而且推导出的具体形式和之前的 expert choice 有一定关系。

最后,Quantile Balancing 得到的是一个单步形式。对于一个 step 内部的整体激活,可以求出一个 bias,让模型实现负载均衡。

博客里还提到,为了避免信息泄露,不能让任意一个 token 获得其他 token 的信息,所以这个 β 不会在当前 step 使用,而是在下一步使用。这是 Quantile Balancing 的一个细节。

苏剑林博客里主要提到两个优点。第一,它不需要调参数。Loss-Free Routing 有一个类似 learning rate 的更新参数,因此 Quantile Balancing 少了一个参数,看起来更加 principled。

第二,它的负载均衡能力更好。对于第一层,之前为了兼容 Loss-Free Routing,大家会把前几层做成 dense,不使用 MoE,规避这个问题。

如果使用 Quantile Balancing,就没有必要规避。它可以直接让第一层变得 balance。这说明底层使用 dense 并不是 ground truth 上一定要做的事情,而是在 Loss-Free Routing 场景下不得不采用的方式。

如果不采用 Loss-Free Routing,而直接采用 auxiliary loss,比如 Qwen 的 MoE 工作,第一层也不会有问题。所以 Quantile Balancing 主要是处理 Loss-Free Routing 中一些失效的情况。

当然,如果 Loss-Free Routing 本来就比较 work,Quantile Balancing 也会比较 work。博客里还证明,在正常情况下,如果不直接做均衡,而采用梯度更新方式,Quantile Balancing 可以和 Loss-Free Routing 达到相当等价的数学形式。

还有一个博客里没有详细提及的工程细节。现在大模型训练的 batch 特别大,4M token 可能都算小的,也可能达到几十 M token。Quantile Balancing 需要在几十 M token 中准确找到某个比例的分位数。

如果精确计算,就需要把所有 token 的激活情况存下来,这在工程上非常 heavy,甚至不可能。

博客里提出的方案,是让每个 GPU 做 local 分位数计算,再把不同 GPU 的分位数进行 pooling。也就是说,先把一个大 batch 切碎,在小 batch 内求分位数,最后再进行聚合。

Kimi K3 论文采用了一个不太一样的实现。它不是按 token 切 chunk,而是在值域上切 chunk。比如 sigmoid 的输出一定在 0 到 1 之间,就可以在 0 到 1,或者负 1 到 1 的区间内切成 n 个桶,再对这些桶做 histogram 统计。

这样做的好处是,存储大小可以保持在常数范围内,而且计算代价比朴素实现高效很多,也更容易在大规模 DP、EP 分布式架构下扩展。

这相当于 Kimi K3 在正式发布前,补充了博客里没有详细讨论的技术。它是 Quantile Balancing 比较必要的实现方式。

归根结底,朴素实现基本不可行,所以必须采用工程上可行的方式,把这个比较精确的结果计算出来。

张小珺

到 2.4 了。那块是 Vision,对吧?

6. 视觉训练与稀疏注意力取舍

孙宇涛

对,Vision 这块没什么特别复杂的。主要讨论的是,是否有必要用已有的 Vision Encoder 去做 ViT Vision Encoder 的初始化。

使用已有的 ViT,比如 SigLIP 2 这样经过大规模训练的 Vision Encoder,好处是收敛会比较快。但是 Kimi K3 讨论了一个问题:如果直接用 SigLIP 初始化,模型的不稳定性可能比 native train 更大。

这不一定严格叫模型不稳定,因为“不稳定”是一个相对概念,并不是严格定义的。大家可能会看 gradient norm 的分布,关注中间异常值的数量,以及 norm 本身是不是过大。

团队发现,如果直接从 scratch 训练,可能会多用一些算力,但至少最后结果不会有损。经过恰当训练,不会带来更差的结果,甚至可能差不多,或者更好。

第二个 claim 是,原生训练会带来更好的兼容性,训练过程中的 gradient norm 会更加稳定。

我觉得这里可能有一个类似的观察。Kimi K3 是用 Adam 训练的,之前大家也讨论过一个相关问题:用 Adam 训练的模型,能不能用 Muon 反向训练?反过来,用 Muon 训练的模型,能不能用 Adam 训练?

最后的结论肯定是,比较原生的方式最好。使用其他方式,如果想达到同样效果,可能需要做一些处理,或者会有一些限制。

所以对于 Kimi K3,他们可能希望采用全 Muon 的优化方式。这样无论是整体训练稳定性,还是兼容性,都会更好。

张小珺

说到这里,我们倒是可以讲一下最早的线性注意力机制。为什么 Kimi K3 使用的是纯线性注意力,没有用任何 sparse attention?

线性注意力、全注意力和 sparse attention,可以三选一,也可以三选二。为什么不用 sparse attention?

孙宇涛

这要看两个方面。一方面和模型架构有关,另一方面也和每一代 GPU 硬件的 feature 有关。

比如 DeepSeek Sparse,DeepSeek-V3.2 使用了它,GLM-5 也用了 DeepSeek Sparse Attention。DeepSeek Sparse 到最后在 Decode 中的加速特别小,原因是求 sparse index 这一步相当昂贵。

在 Blackwell 硬件上,硬件越先进,这个 overhead 反而越大。甚至在 Decode 中,sparse attention 方案和 full attention 可能都不会带来显著加速。

为了解决这个问题,GLM 团队做了一个叫 Index Cache 的工作。他们把求 index,也就是判断哪些 token 需要计算 attention 的操作,在不同层之间共享起来。比如每 4 层或每 8 层共享一次。

只有这样,才能有效减小 sparse 本身带来的开销。只有 sparse attention 的额外开销足够小,才能带来可观的算法收益。

我们也做过相关工作,结论大致类似,只是更加极端。由于之前的 KV Cache 是 once 的,我们直接把 sparse index 这一步也做成 once,把每层的 index 开销分摊到所有层上。这样开销会特别小,才能真正享受到 sparse attention 的计算收益。

回到 Kimi K3,为什么它不采用 sparse attention?第一个原因是,每层都用 sparse attention 这样简单的方案,在 Blackwell 上收益特别小。

无论是 Index Cache,还是我们的方案,结论都一样:希望把多层 sparse 的结果跨层复用。比较简单的方式,是让相邻层复用。

但对于 Hybrid Attention,也就是线性注意力和全注意力交错的结构,相邻层复用并不是显然有效的。因为 full attention 并不是挨着的,中间隔了很多线性注意力。在隔着很多层线性注意力的情况下,Index Sharing 是否有效、加速比是否足够高,这些都存在疑问。

另一个问题是,sparse attention 基本没办法从 scratch 训练。现在通常采用的是 post-training,再从 full attention 转化成 sparse attention。不排除 Kimi K3 未来会把已有的 full attention 部分转成 sparse attention。

当然,如果使用 MLA,这件事会更难。

所以主要有两个原因。第一个是想拿到实际加速比。对于 Hybrid Attention 来说,这不是一个 trivial 的问题,如果想拿到实际加速比,可能需要做更多工作。

第二个是它和 pre-training 并不是很兼容,所以可以先留一个接口,之后再做。

张小珺

刚才讲的这些,无论是架构设计、训练还是推理工程,你觉得中间有哪些 trade-off 和取舍?

孙宇涛

Hybrid Attention 的主要 trade-off,是调节线性注意力和全注意力的比例。线性注意力比例越大,加速通常越高。但如果希望达到比较无损的状态,同时获得加速,3∶1 是实验上比较 work 的方案。

Sparse Attention 严格来说大概率不会带来更强的表达能力,这和 Hybrid Attention 是另一条线。只不过如果坚持不用 Hybrid Attention,就可能不得不采用其他方案。

张小珺

我听到这里的感受是,现在的模型训练好像没有一个巨大的范式创新,而是把之前很多工作融合起来,再去寻找一个更好的结果。我不知道这种感受对不对。

孙宇涛

我觉得问题不大,但不完全是技术原因。大家现在都叫 Transformer,可是什么是 Transformer,其实没有办法清晰定义。

哲学上有一个对应概念,就是忒修斯之船。2017 年这条船刚开始行驶时,它是 Transformer。它刚开始是怎么拼起来的?是 attention 加 residual,包括 stack layer,这些东西在 Transformer 之前也并不是全新的概念。

这条船刚建起来时,我们认为 Transformer 是一个 milestone。但这条船已经行驶了 8 年、9 年。在它慢慢行驶的过程中,可能会把某些部分替换掉,再替换掉一些部分。

现在看,到了 2020 年,它和最初的 Transformer 相似度已经很低很低了。你是否还把这个东西叫 Transformer,当然是一个哲学问题。但目前大家还是会这么叫。如果历史走向发生一些不同变化,可能也就不叫了。

张小珺

我们上面讲的这些,整体来说是一个什么样的工作?

孙宇涛

这个东西很难定义。首先,它和 technical report 一样,是一个偏综合性的工作。通常大家会把比较有创新性的单点突破单独拿出来讨论,其实之前也专门讨论过这些工作。

这里面比较大的点有几个。第一个是 attention 怎么设计,第二个是 MoE 有没有更好的设计,第三个是优化器,第四个是中间的连接方式。

如果放到 ResNet 时代,这些单独拿出来可能就是一个架构。但在 Transformer 时代,单个点可能并不是这样。你把这些东西综合起来,最后把模型跑出来,才真正有意义。

以前做架构,比如在 ImageNet 上把结果跑得足够高,就可以成为一个 milestone。但现在想把东西真正跑出来,要做的事情特别多:需要验证 scaling,把各个工程问题解决,把 data 搞定。所有东西都完成之后,把 paper 或者架构展示出来,大家才会认可。

从研究角度,我个人不会太关注这种综合方式,因为我觉得架构验证有严格标准,不需要把所有东西都捆在一起。但从非技术角度看,现在确实是这样的状态。

张小珺

所以上面是这篇论文的一些亮点和突破,接下来它开始讲预训练和后训练工作。

孙宇涛

对。预训练和后训练,尤其是后训练,偏工程、偏具体场景,这部分可能不会讲太多,因为论文里也没有写太多。

预训练和后训练里,主要是经验性或者资源消耗方面的内容,主要创新还是前面多一些。后面有一些比较有意思的点,我会专门拿出来讨论。

7. Scaling Law 延伸长上下文

接下来一个个来讲。Scaling Law 里一个比较值得讨论的点,是学习率策略。

学习率策略最开始是 MiniCPM 论文提出的 WSD。MiniCPM 之后,在 Qwen 崛起之前,几乎所有团队都在使用 WSD。

我们可以看 MiniCPM 当时是怎么考虑这个问题的。简单来说,WSD 考虑的是如何把 data schedule 和 learning schedule 结合起来。

MiniCPM 刚开始讨论的是,WSD 和 cosine decay 可以取得比较接近的结果。比如从较高学习率到较低学习率,中间具体怎么调配,对最终结果影响其实没有那么大。

既然具体 decay 方式对结果影响不大,就可以和 data pipeline 联动。实际训练中会发现,在 decay 阶段,模型 loss 的衰减速度比大学习率阶段快很多。大家会认为 cooldown 阶段是模型学习最快的阶段。

所以 MiniCPM 和 LLaSD 当时采用的策略是:既然 cooldown 是模型学习最快的阶段,为什么不把更好的数据放在 cooldown 阶段训练?这样可能比数据均匀分布、学习率均匀变化取得更好的效果。

这就是 MiniCPM 和 LLaSD 提出 WSD 的背景。我觉得这个问题挺有意思。一方面,它讨论了为什么要采取不同的 learning rate decay 方式;另一方面,也讨论了 decay 的不同阶段具体承担什么角色。

他们利用不同 learning rate decay 阶段的行为,把数据策略和学习率策略结合起来,最后取得更好的结果。

Kimi K3 讨论了一个不太一样的问题:为什么不使用 WSD。这个问题也可以在 WSD 之后的一些论文里看到。

WSD 除了可以配合更好的 data schedule,还有一个额外好处:前面的 learning rate 不变化,所以它和整体训练 throughput、token 数量无关。

因为无关,所以可以更自由地在模型训练过程中选择最终 config。比如刚开始预定跑 10T token,但跑到中间,训练策略或公司策略改变了,或者想更早、更晚发布,WSD 可以让我们更自由地切换,不需要一开始就把整个模型要训练的 token 数量定死。

但它也有一个问题没有被充分讨论:虽然可以任意选择最终要跑多少 token,实际 learning rate 还是和 token 数量有关。

比如把 6×10⁻⁴ 作为比较稳定的 schedule,跑 10T token 可能是最优的;如果跑 20T token,可能 3×10⁻⁴ 才是最优的。从最优角度看,任意扩展 token 数量,可能没有大家想象得那么有效。

Kimi K3 的论文讨论了这个问题:WSD 实际 schedule 的调节难度,和 cosine decay 是一样的,而且不一定更容易调。任意选择最终训练 token 数量,也不一定只有 WSD 才能做到,其他方式也可以做到。

基于这些原因,他们选择了一个更简单的方案。Cosine decay 更容易调,只有两个变量:要跑多少 token,以及 maximum learning rate 设多少。

如果使用 WSD,就会多一个变量,也就是 decay 比例具体是多少。从调参角度看,cosine decay 更容易调参。

所以 Kimi K3 在论文中写到,如果发现 cosine decay 更容易找到合适的 hyperparameter setting,就会采用这种比较经典的 learning rate decay 方式。这和大家普遍使用 WSD 的 setting 不太一样。

另一方面,Kimi 团队对比了 Kimi K2 到 Kimi K3 整体的 scaling efficiency。Kimi K3 比 Kimi K2 大很多,总参数从大约 1T 增加到 2.8T,不到 3 倍;激活参数从 32.6B 增加到 104B,超过了 3 倍。

从模型参数上看,Kimi K3 毫无疑问比 Kimi K2 大很多。最后团队给出的 scaling law 结果是,Kimi K3 相比 Kimi K2,在 scaling efficiency 上达到 2.5 倍。

对于一个简单的 dense model,scaling efficiency 是一个经典问题。OpenAI 之前的 scaling law、Chinchilla 的 scaling law,以及一些新的 scaling law,都讨论过这个问题。

大家也问过,Kimi K2 和 Kimi K3 的 scaling behavior 是否基于固定 data。我记得他们的回答应该是否定的,论文里也没有直接写清楚。可以理解,Kimi K3 和 Kimi K2 使用的数据肯定不可能完全一样,所以大概率有不同的 data recipe。

最终的 scaling efficiency,是模型架构、training recipe 和数据策略综合作用的结果。综合起来,Kimi K3 比 Kimi K2 高了很多。

长上下文方面,Kimi K3 原生支持 1M 上下文。这里比较有意思的是位置编码如何选择。

传统长上下文架构通常会使用 RoPE。但使用 RoPE 在扩展长上下文时有一个问题,就是需要调整 RoPE 的具体参数。如果不调整,直接扩展长度,效果不会那么好。这是 RoPE 时代的经典做法。

如果使用全注意力、不引入线性注意力,这个策略不会有太大变化,仍然需要针对不同长度调整 RoPE 参数。

但在混合模型里,这件事可以改变。最早是 Cohere 团队的一项工作提出了这个观点。

结论很简单:Hybrid Attention 的排布方式已经在线性注意力中引入了位置信息。无论是 RoPE、RoPE 加 sliding window,还是 Linear Attention,在线性注意力阶段,位置信息都已经被引入了。

所以在 Hybrid Attention setting 下,如果把 Full Attention 的 RoPE 改成 NoPE,也就是在全注意力部分去掉位置编码,能够带来两个好处:第一,模型表现更好;第二,长上下文更容易扩展。

NoPE 扩展模型长度时,不需要调整模型架构参数,就可以达到长上下文效果。这是很优雅的,因为模型架构参数选择本来就不应该和具体长度相关,也没有理论支持说不同长度 recipe 下必须采用不同参数。

我比较早看到这项工作,可能第二天就复现了。当时觉得特别有道理,复现后也很 work。我还在会议里审到过这篇文章,直接给了 strong accept。我这几年可能都没给过几个 strong accept,因为我觉得它确实是有效且优雅的解决方案。

这里还可以讨论一个大家之前理解错误的问题:RoPE 本质上带来的是 recency bias。RoPE 最有效的地方,是它对 short context 的建模能力特别强,但它对长上下文没有帮助,甚至有负面影响。

有些观点认为 RoPE 引入了长上下文表现,这其实是错误的。RoPE 并不带来长上下文能力,甚至会损害长上下文能力。

所以 Kimi K3 在长上下文训练中直接去掉 RoPE。去掉之后,直接做外推,效果会好很多。如果使用 RoPE,扩展长度时需要调参数;如果不调参数,外推效果很差。

如果没有 RoPE,就不需要调参数,外推效果很好,长上下文效果也没有问题,甚至更好。在 Hybrid Attention context 下,这是一个相当优美的解决方案。

8. 后训练转向蒸馏推理

张小珺

Post-training 方面,首先可以讨论低精度训练应该在什么阶段引入。不同团队采取的策略不太一样。

DeepSeek-V3 一开始就是原生 FP8 训练,DeepSeek-V4 直接用 W4A8 做原生训练,但 Kimi 采取的策略不一样:先用高精度训练,在 SFT 阶段再引入低精度 QAT。

孙宇涛

至少有两点值得讨论。第一,从项目管理角度,大规模训练采取更高精度是更保险的方案。无论如何,它不会因为低精度带来额外问题。

如果高精度训练在大规模 scaling 中带来其他问题,我觉得这是一个相当不可控的因素,而且更大规模的训练很难提前被充分、精确地验证。

第二,从技术角度看,是否有必要一开始就用低精度训练?至少从我的实验来看,没有必要。Kimi 可能也发现没有必要。

低精度训练从 scratch 阶段引入,并不会带来模型能力提升。也就是说,W4A8 在什么时候引入,只要经过一定量的训练,最后结果可能都差不多。

所以在 SFT 阶段引入,是一个更保险、技术上也不会带来额外损失的方式。

RL 方面,Kimi 从很早以前就比较重视 RL。从 Kimi K1.5 到 Kimi K2.5,一直在做持续创新,Kimi K3 也比较充分地引入了这些方案。这些基本都是比较成熟的方案,这里就不展开了。

张小珺

4.1.3 这部分可以讨论 OPD。OPD 最早也是董立老师团队比较早讨论的方式,对吧?

孙宇涛

对。董立老师在微软亚洲研究院做了这项工作。MiniLLM 是 Yuxian Gu 做的,他去年也是清华特奖。

OPD 从刚开始大家用起来,到后来工程上实际使用的方式,并不完全一样。可以讨论一下 OPD 最开始的 motivation,以及后来大家是怎么做的。

当时 OPD 对比的是 knowledge distillation。蒸馏有两种:一种是 black-box distillation,另一种是 white-box distillation。

黑盒蒸馏是大家现在比较常用的方式:拿一个 API,不知道模型内部状态,也拿不到模型推理的 logits。对外界来说,模型完全是黑盒,只能拿到输入和输出。

白盒蒸馏则可以获取模型本身,任意拿到模型推理过程中需要的状态。在这种场景下,问题是如何做蒸馏,以及能不能取得比黑盒蒸馏更好的表现。

MiniLLM 当时采取的方式是反其道而行之。之前大家通常让 Teacher 生成答案,再把生成答案通过 SFT 或 forward KL 的方式引入 Student。

MiniLLM 反过来,让 Student 生成答案,再让 Teacher 对每一步进行纠正。

直观来说有两种方式。第一种是老师讲课,学生把老师讲课的结果学进来。第二种是学生自己做题、写中间推理过程,老师指出哪里不对,再告诉学生怎么做。

这就是 Reverse KL。后来 Thinking Machines Lab 把它称作 On-Policy Distillation。大家逐渐意识到,从蒸馏角度看,这是一种比较有效的方式:不是直接学习模型答案,而是在 Student 自己的推理过程中,让 Teacher 逐步验证或纠正 Student 的推理。

这个范式一开始是为了蒸馏。无论是公司内部,还是把模型分成 Pro 版和 Flash 版,都可以用 OPD 的方式把更大的模型蒸馏到更小、更快的模型上,从而获得更好的表现。

但后来大家更常用的方式并不是做大模型到小模型的蒸馏。原因是如果想做蒸馏,至少需要先有一个大模型,再训练一个小模型。如果想蒸馏黑盒模型,这套方案完全不可用。

从公司和项目策略上看,大家现在一般不是先训练一个大模型,再训练一个更小、更快的模型,而是做一个旗舰模型,将它直接作为 inference 服务。所以不存在大模型到小模型的蒸馏 setting。

后来大家逐渐采用的方式,是自己蒸馏自己。为什么自己蒸馏自己?我觉得也有技术和非技术两部分原因。

从非技术角度,这项技术可以让 post-training team 的管理更简单。Post-training 合并是一个比较 heavy 的事情,因为它和 pre-training 不一样。Pre-training 只要把数据合起来,一起训练就可以了。

Post-training 通常会使用更复杂、更先进的训练策略,而且这些策略不容易直接合并,可能会有一些难度。

所以从项目管理角度,On-Policy Distillation 是一个比较好的策略,可以把整个 post-training team 的管理简化。

从技术角度,比如训练 RL,通常有不同策略。训练数学任务可能是 verifiable reward;如果有 preference 需求,可能会有 reward model;如果想扩展 RL 的其他能力,每种能力都有独特的 reward。

如果想把所有能力放到一起,post-training 通常会做专项突破。要把不同专项模型的 reward 直接放到一起训练,难度比 pre-training 合并更大,并不是完全不可能,但会更难。

OPD 会让事情变得简单。可以把不同 reward model 或不同 RL 范式,简化成不同的模型,然后做 multi-teacher 合并。

对于 RL 策略和数据来说,这是一个高度异构的状态;但对于模型来说,是一个高度同构的状态。现在大家不会为不同任务专门设计完全不同的模型架构。如果模型结构都差不多,再做 multi-teacher 合并就容易很多。

这不是 Kimi K3 首先使用的方式,现在已经是大家比较认可的做法。我印象里,小米、JOM 等团队现在应该都是这么做的。

Quantization 前面已经讲过。Draft model 这部分我觉得很有意思,还可以延伸出很多工作。Kimi K3 目前对这部分的优化还不是特别完善。

之前小米推出过一个能达到 1,000 TPS 的方案,主要用了两个技术。一个是 Tianyi Liang 团队做的、可以高度融合不同阶段算子的技术,这样可以获得比传统 VLM 推理方式强很多的效率,可能达到 300 到 400 TPS。

小米是在这个结果上,再加上基于 TensorRT 的结果,以及 DFlash speculative decoding 带来的加速比,最后得到比原模型强很多的推理速度。

这主要服务于愿意付出更高成本、但希望获得更强推理速度的用户。如果追求整体 throughput,这个方案的收益会更强;如果是小 batch size、但希望有较高单用户吞吐,这套方案也会很强。

抛开 TensorRT 方面的贡献,最后就落到如何做更好的 MTP 或 draft model。

这方面有历史脉络。最开始是 Eagle-3 或 MTP。早期 speculative decoding 提出时,大家使用一个没有关系的小模型,去 speculate 一个大模型。

这样有一个问题:无法充分利用大模型中间的 hidden state。如果能利用大模型中间的 hidden state,就可以把小模型做得更小,或者在相同参数量下取得更高 acceptance rate,最后带来更强的推理效率。

MTP 和 Eagle-3 都是这个思想。MTP 如果从 scratch 训练,还有一些其他好处。

DFlash 更有意思,它联系了传统 language model 和去年比较火的 diffusion language model 两条脉络,把它们结合起来。

Diffusion language model 刚提出时,主要 claim 是在单用户或者 batch size 较小的情况下,可以获得比传统 language model 快很多的推理效率。

但 diffusion language model 有两个最大问题。第一,如果从 scratch 训练,训练效率不够高,最终结果很难和传统 autoregressive language model 相比。第二,它主要适合小 batch size 的 throughput,在多用户、追求总 throughput 的场景下并没有优势。

DFlash 试图统一这两者,利用 diffusion language model 更快的推理方式,进一步优化 MTP 或 draft model 的加速比,最后得到更优的单用户 throughput。

MTP 这块,我之前也和 DFlash 的同学交流过。他提到,对于整个模型来说,MTP 和预训练的关系仍然很大。

Draft model 需要在利用大模型一定推理能力的基础上,进一步扩大能力。对于 MTP,预训练阶段需要给它提供一个接口,这个接口会对下游 draft model 的提升特别有帮助,所以需要在预训练阶段就引入。

当然,draft model 也需要做一些 fine-tuning 和特化处理。比如用 KL loss 替代传统的 next-token prediction loss,这样在原模型 verify 的过程中可以更对齐,进一步提升 draft model 的接受效率。

这方面之后还会有更深层次的工作。我猜这肯定不是 MTP 的终点。

RL task 后面是针对不同任务的具体策略,直接看原文就可以了。

张小珺

接下来很大一块是 infrastructure。

9. Infrastructure 决定架构落地

孙宇涛

现在模型架构设计的关键部分,需要和 infrastructure 做 co-design。模型架构会影响整体 infrastructure 的设计,Kimi K3 和 DeepSeek 系列在这方面有一些差别,这也是比较有意思的一点。

先看 KDA。前面已经讨论过,如果希望追求更高的 chunk 效率,就需要对 KDA 的衰减系数做限制,这样才能使用更好的 kernel 设计形式,带来更高的 kernel-level 效率。

KDA 的 CP 是一个值得讨论的点。对于 sliding window 或 full attention,CP 从概念上比较容易理解。比如 full attention 可以使用 ring attention 或 zigzag attention。

Attention 本身的计算模式比较简单,有些地方也省不了。至少需要把跨 GPU 的 Q、K、V 拿到一个 GPU 上进行计算,这个概念相对简单。

但 Linear Attention 的 CP 概念更复杂。它仍然可以回到最经典的 chunkwise recurrent。

对于线性注意力,chunkwise recurrent 是必备算法。在正常的单机、不开 CP 的训练场景下,chunkwise recurrent 主要分成两部分:可以拆成比较小的 16 或 64 tile,chunk 之间用递归方式计算,chunk 内部用并行方式计算。

KDA 也是这样做的。它对 DK 的限制,主要是为了提高 chunk 内部并行计算的效率。

所以单机 Linear Attention 的计算 pattern,就是 chunk 内部并行计算,chunk 之间串行计算。

但对于 CP 来说,还有一个很有意思的特性:chunk 本身可以任意拆分。不同 chunk 数量,比如 512 token 一个 chunk,或者 8K token 一个 chunk,在数学上是完全等价的。

这和早期一些拼接式方案不同。有些工作会尝试 chunk 之间用 Linear Attention,chunk 内部用 Full Attention,那种策略下 chunk 大小和模型架构设计相关。

但纯 Linear Attention 与 chunk 大小无关,所以可以对 chunk 层次进行任意处理。单机中可以把 chunk 拆成 16-token tile,tile 内部并行计算。

它并不限制 chunk 只能拆一次。比如有一个 1M token 的大 chunk,可以拆成每张卡 8K token,构建以大 chunk 为单元、不同 GPU 之间递归计算的拆分方式。

拿到 8K 的拆分之后,还可以在内部进一步拆分。Linear Attention 对一个 chunk 内部如何计算没有限制。对于比较小的 chunk,并行计算比较优;如果 chunk 足够大,可以采用 chunk-within-chunk 的方式。

所以 Linear Attention 的 CP 是两个层次的 chunk。首先在不同机器上做一次拆分,在单机内再到 kernel level 做一次拆分。通过双层 chunk 机制,构成 Linear Attention 的 CP 方案。

这主要来源于 Linear Attention 的 chunk 可以任意拆分的特性,和 Full Attention 的处理方式不太一样。

接下来从分布式训练角度,讨论如何优化分布式方案。这部分和 DeepSeek 的方案有一些区别,主要来自不同 MoE 架构。

Kimi 团队提出了基于 DeepEP 进一步延伸的 EP 计算方案。他们主要讨论传统 EP 的问题。

现在大家用的是 dropless EP。对于每个 token,选择哪个 expert 不受整体约束,想选哪个就选哪个。汇总之后会发现,不同专家的负载不同。

第一个问题是,对于一个 batch,每张 GPU 分到的 token 数不一样,整体执行时间也不一样。执行时间不同,就会互相等待,浪费 GPU 算力。

第二个问题是,如果不同卡上的 token 数不确定,GPU 通信会额外多一个阶段:首先要告诉所有 GPU 每张卡要接收多少 token,再把 token 发过去。

基于这两个阶段,传统 EP 严格来说不是最优方案。如果完全从 infrastructure 角度考虑,最优方案是带 drop 的 EP,也就是每个 token 都受到全局约束,通过全局 allocation 让每个 expert 获得完全均匀的 token。

理想情况就是这样。在 infrastructure 层面完全均衡是最优的,所以策略是把 infrastructure 从非最优提升到最优,同时保持模型能力不下降。

但大家现在不用 drop token,因为它对模型损失和模型能力的影响仍然相当明显。

Kimi K3 采用的是一种更动态的 EP 方式。传统方案比较静态,比如有 128 个 expert,EP 设为 8,每张卡放 16 个 expert。Kimi 的方案会设置一些冗余专家,再通过这些额外专家实现动态分配。

从数学上可以证明,只需要增加小比例的冗余专家,就能保证 token 数完全对齐。感觉这像是一个经典的数据结构与算法问题,是可以证明的。

通过少量冗余专家,可以达到所有卡负载均衡。具体做法是 online planning,提前规划哪些卡应该有哪些冗余专家,从而让不同卡上的 token 数完全均衡。

当然,即使从卡的角度均衡,也不代表专家层面均衡。这个算法只保证每张卡的 token 总数一定,但一张卡里有多个专家,并不保证每个专家接收的 token 数一样。

如果还想保证每个专家都一样,就没有办法,只能采取有损策略。这是模型能力和 infrastructure 之间可以继续寻找的空间。

这部分是 Kimi 团队带来的一个比较有意思的创新。

接下来是 memory-efficient training。首先,他们从软件工程角度提出了一个比较简单的方案:更细粒度地控制每个部件,决定它采用 activation 保存还是 offloading。

Kimi K3 采取了大规模 offloading,把中间计算结果 offload 到 CPU 上。这并不是 trivial 的事情,因为理论上要保证 offloading 不拖慢训练,需要 CPU 和 GPU 之间的通信满足一定条件,才能在计算和通信之间实现完全 overlap。

为了实现 offloading,Kimi K3 把所有可以 offload 的内容用 FP8 存储,可以节省一倍空间,可能因此从一个边界跨到另一个边界。具体边界取决于集群环境和模型 config。

另外,他们需要优化 attention residual 本身的 infrastructure 关系。PP 和通信 overlap 的手段,和 DeepSeek 有一些不同。

DeepSeek-V3 至少采取了两个比较 non-trivial 的方式。第一个是比较细粒度的 MoE overlap。MoE 中有两个通信,一个 dispatch,一个 combine,通信开销都比较大。

DeepSeek-V3 会把一个 batch 的 MoE forward、backward 和下一个 MoE forward 融合起来,通过重新排序计算顺序,把 dispatch 和 combine 通信都隐藏起来。

要做到这一点,需要非常精细、复杂的软件工程优化。所有 forward 和 backward 计算都要从原子计算层面拆开,再手工重新排布。Megatron Core 里也讨论过类似事情。

第二个是 DeepSeek-V3 的 DualPipe,用来缓解 PP bubble 和不同 activation 不均匀的问题。后来还有 DualPipeV,但逻辑上是类似的。

从公开信息看,Kimi K3 没有采用这两个优化方式,而是采用了其他方案。

第一个是隐藏通信。这个和模型架构选择有关。Kimi K3 采用 Latent MoE,大幅降低了通信开销,所以通信在整个计算开销中的占比小了很多。

由于通信开销显著降低,overlap 就容易很多。不需要再和另一个 batch 的计算 overlap,只需要在一个 batch 内部采用更简单的 overlap,就可以把通信较好地隐藏起来。

Kimi K3 的具体方式,是把 MoE 的前向、后向通信和 shared expert 的计算 overlap 在一起。现在绝大多数模型都有 shared expert,而且 shared expert 有一定计算量。

正因为通信开销变小,才可以通过 shared expert 这种简单方式 overlap。如果使用传统 MoE,通信开销太大,shared expert 很难完全覆盖它,就必须把另一个 batch 拿进来,才能把通信隐藏掉。

不同的 MoE 架构带来了不同的 overlap 策略。这个策略的好处是,推理 critical path 的 latency 基本是免费的。

训练架构方面,由于通信量更小,可以采用更简单的方式排布通信 bubble。

即使通过复杂方法完美隐藏通信,也不是完全无损的。即使通信和计算完全 overlap,计算本身也会相对变慢,并不是完全没有代价。

DeepEP 也做了类似优化:使用尽可能少的 SM 占用,获得更大的整体通信 throughput,让 overlap 跑得更快。

PP 的处理也不一样。如果使用 DualPipe 或 DualPipeV,PP rank 之间相对比较对称。如果使用单向 PP,就不太对称。

有两种解决方式:第一种是让它变得对称;第二种是 Kimi 论文里讨论的,把不均衡转移掉。

朴素 PP 中,前面的 PP rank 更早进入,会积累更多 batch,activation 压力更大。Kimi K3 的方式是,把 memory 占用比较大的 PP rank 的内容直接传到 memory 占用较小的 PP rank 上,用轻量方式规避更复杂的 DualPipe 设计。

后面是 Muon 的一些优化。Muon 需要对完整矩阵做 Newton-Schulz 迭代。

传统 Adam 相当于把所有参数摊平后再切分,因为 Adam 是 element-wise 优化,怎么切都不会影响优化结果。但 Muon 不一样,因为某个 rank 上需要保存一个矩阵的全部参数。

所以需要做一些处理,才能让 Muon 在 optimizer 层面较好地切分。

多模态 infrastructure 也是一个有意思的点。纯 language model 即使优化得足够好,也需要很多 effort,但多模态每引入一项功能,infrastructure 难度都会直线上升。

首先是如何把 Vision Encoder 做好。现在通常会对 vision token 做压缩。比如最终输入大模型可能是 8K token,输入之前可能是 32K token,也就是 Vision Encoder 接入模型时做了一次压缩。

但这个压缩在 Vision Encoder 内部没有发生,所以 Vision Encoder 内部计算长度更长。如果模型主干不需要开启 CP,Vision Encoder 可能就需要开启 CP,这就需要额外的 infrastructure 处理。

PP 也很有意思。做 VL native training 时,VL token 只占一定比例。某些卡可能是纯文本状态,另一张卡可能是视觉 token 比例很高。这样仍然会出现不同卡之间不均匀的问题,也会影响 PP。

PP 首先要保证不同 PP 之间计算比较均匀,这样流水线才能打满。如果在最开始引入 Vision Encoder,第一个 PP 的计算强度就会显著增加,破坏整个流水线。

Kimi K3 的做法,是不把 Vision Encoder 放在 PP 最开头,而是放在中间或尾部。这样,在前面的 PP 处理较浅层的语言模型时,中间闲置的 PP 可以提前计算后面的 Vision Encoder 步骤。

通过这种方式,可以规避第一个 PP 带来的大 bubble。这是 PP 层面的一个优化。

张小珺

这篇论文真的写得好详细。

孙宇涛

是的。这些细节都需要处理。如果不处理,大家会觉得事情肯定可以这么做,但对于没有足够组织密度的团队,很多人就会沉迷于小道消息,私下打听这些东西到底是怎么处理的。

如果写出来,大家就不需要去寻找小道消息了。

张小珺

如果论文写出来,再复现难吗?

孙宇涛

我觉得 infrastructure 上的事情本质上没有什么难的,因为它本身是高度确定性的。所有 infrastructure 的事情,本质上都是确定性的。

但如果想自己提出来,就要求你有分析和 profiling 能力,也要求组织密度、团队氛围比较高。如果 infrastructure 团队比较好,还是可以自己做出来的。

如果不行,就尝试 follow 一些比较好的工程实践。但如果连这个都搞不定,我觉得可能就不太应该了。

前面 infrastructure 主要分为三部分。第一是 pre-training,前面讨论了大规模分布式训练中的复杂优化。后面两部分是 RL 和 inference。

RL 本身涉及大量 inference,所以这两部分之间有一些 overlap。RL 的一个不同点,是它对大规模 sandbox 有比较细的要求,但这已经是更工程化的事情。

它需要处理不同 sandbox。对于 RL task,每个 trajectory 可能都有自己的 Docker,所以如何管理大规模 Docker,是比较麻烦的问题。

Kimi K3 有时会蹦出一些比较有意思的东西。这里可以节省一个 gradient buffer,这是一个比较 tricky 的设计。

完整的 RL 通常有好几部分 model:至少有一个 policy model、一个 reference model,policy model 还有对应的 gradient 和 optimizer。如果还要做 reward model,就会再多一个 model。

所以这里会有很多模型。Kimi K3 讨论的是,不同模型之间能不能共享 memory。对于 reference model,它本身占用的 GPU memory 很大。

他们发现 reference model 可以和 gradient buffer 合并。首先 reference model 没有梯度,在求 objective 的过程中也不需要 gradient。等有了 gradient 之后,可能就不会再使用 reference model 了。

所以这里使用了一个 gradient buffer,用于 non-policy model 的 forward。这是一个比较有意思的设计,剩下的就是比较常规的处理方式。

Inference 目前不会有太多额外内容,因为主体的 inference optimization,主要是 VLM 或其他专门工作讨论的内容。这里讲的是 Kimi K3 架构在现有推理引擎中带来的增量。

首先,Linear Attention 在现代 inference engine 里有一个麻烦,就是 prefix cache。

对于 Full Attention,每个位置都有一个 cache,下一个位置的 cache 是从上一个位置增量得到的,所以 prefix cache 比较简单。

但对于 Linear Attention,每一步都要在上一步的 key-value 状态基础上进行覆写。也就是说,每一步的 prefix state 都不一样。

如果每一步都存起来,Linear Attention 的优势就完全没有了;但如果完全不存,又无法享受 prefix cache 带来的好处。

目前的策略,是按照 block 去切,每个 block 做一次 prefix caching。

另一个 long-context 相关的问题,是 VLM 的 paged KV 实现方式。从工程和概念上看,最简单的分布方式是不考虑层与层之间的异质性。

从前一两年开始,如果想直接在 VLM 中引入混合架构,infrastructure 上并不是容易的事情。现在 infrastructure 越来越 heavy,简单改动可能会把整个系统搞得特别乱。

因此需要做兼容性处理,把不同的 attention pattern 结合起来。Full Attention 可以按配置管理,但 Linear Attention 或 sliding window 不能按同样方式管理,因为它不存在长期、按 token 生成 KV Cache 的方式。

这对 VLM 设计来说需要做一些兼容处理。后面就是适配性优化,因为顶层推理优化和 prefill、training 不太一样,每个环节都需要额外的 kernel 配置。

但这些事情应该都可以做,而且确定性比较高。

Evaluation 没什么好讲的,就是每个环节都很好,结果特别好。

张小珺

Kimi K3 让你最 impressive 的地方是什么?

10. 模型规模走向世界模型

孙宇涛

个人而言,我觉得最 impressive 的一点,是它把激活参数做得特别大,足足有 100B,比我预期还大一些。

张小珺

这依赖什么能力呢?

孙宇涛

不依赖任何能力。具体定多少激活,本身不是技术性问题,取决于你想达到什么阶段的效果。

我觉得 Kimi K3 还是比较有魄力的。在已有开源模型规模基础上,它要提升一个数量级。刚才说过,它比上一代的激活参数多了 3 倍多。

这个决定是非技术性的,但需要一定魄力。

张小珺

杨植麟喜欢说“有概率的非共识”。你觉得在 Kimi K3 上能看到什么样的 different bets 或创新?

孙宇涛

我觉得没什么特别的。真正有价值的技术创新,他们都单独写成 paper 了。所以 Kimi K3 刚出来时,我主要 surprise 的是它的 size,其他方面都没有超出我的预期。

张小珺

你刚才也展示了很多他们历史上的 paper,这些工作其实之前已经发出来了,只是这次优化到了更大的模型上。

孙宇涛

我个人的观点是,科学研究不存在阶跃式提升。只是大家习惯把技术渐进式提升中的某些节点称为 milestone。

我一直认为,技术永远是慢慢提升的,靠公司里、项目里以及整个业界的所有人共同推动。所以从这个角度看,没有什么 milestone。

张小珺

有人说 Kimi 的研究方式相对比较科学,你认同吗?你怎么解释?

孙宇涛

首先我是认可的。具体来说,我觉得主要来源于他们内部的管理方式。

公开信息里大家都知道,Kimi 是一个非常强调模型可解释性的团队。他们一直尝试让 pre-training 变得更加科学,比如让不同的 behavior trace 以更可靠的方式获取,让模型不稳定或 model collapse 的现象能够更明确地归因。

他们一直强调这种模型内科式的分析。我觉得这是科学化的体现,没有问题。

科学对应的是不科学。什么是不科学,讨论清楚之后,大家就知道什么是科学、什么是不科学。

如果从整体项目角度,你想推出一个东西,想证明某个东西有效,学术创新或学术论文管理都有明确标准:需要有明确的 ablation,有足够的变量控制,用更科学的方式说明这个东西有效。

不科学的方式,就是基于某些利益需求,把科学的方法都去掉。

我特指的不是任何技术。我一直强调,Kimi 团队非常团结,能够把劲往一处使。如果大家的 motive 是这样的,判断方式自然就是科学的。

张小珺

最近也是 DeepSeek-V4 发布的时间。Kimi K3 和 DeepSeek-V4 的区别是什么?能不能做一些对比?

孙宇涛

我从不同层面讲。无论是模型定位,还是刚才详细讨论的 inference,它们的区别都比较大,完全不是一个东西。

一个比较好的 case 是 DeepSeek 出了两档模型:一档是 1.2T,另一档规模更小。DeepSeek-V3 目前更强调性价比,它们的 Flash 模型也做得很好。

Kimi 目前主要尝试提升开源模型能力的上限,而不是优先考虑性价比。当然也不是完全不考虑,但性价比不是最首要的条件。

现在 Kimi K3 的 API 也相当贵,比其他模型贵很多。

张小珺

照这个趋势发展下去,Kimi 和 DeepSeek 会分化吗?

孙宇涛

技术层面的东西,只要大家不笨,都知道什么是好、什么是不好。组织团队的走向,则取决于人的选择。

技术上没有太多 debate。好就是好,不好就是不好,有明确的客观标准。但对组织和人来说,这件事就比较模糊。

张小珺

你觉得 Kimi K3 相比之前所有模型来说,最不一样的地方是什么?

孙宇涛

它有架构创新,创新性更强。

从技术层面可以讨论很多东西,包括其中的一些创新和 trick。但它是不是成为 milestone,是一个非技术问题,最大的变量是最后的能力。

DeepSeek-V3,我觉得包括 R1 这些东西,算是锦上添花。最大的问题是,它是国内第一个把模型 scale 到一定程度,并且把全流程打通的模型。

在 Kimi K3 之前,最大的可能是 Qwen-72B。那是模型 size 上的一次较大飞跃,因为有 size 才有智能。

Kimi K3 把激活参数增加了 3 倍,模型规模也接近增加了 3 倍,它就是下一个 level。这没有问题。

张小珺

所以核心是 size 和有效 scaling。

孙宇涛

对。它完全是靠团队做起来的。

把模型增大很简单。如果只是吹牛,把几个数字调大,就可以得到一个更大 size。但这不解决任何问题。从技术上讲,扩大模型 size 本身不是很大的创新,把它做 work,中间才有创新。

张小珺

现在新的团队再去重做一个模型,还有时间窗口或机会吗?

孙宇涛

如果团队足够好,氛围足够好,单兵作战能力足够强,还是有机会的。但这些条件大概率不存在,所以后面的创业事情也就不存在。

张小珺

为什么不存在?是因为好的人已经进去了,还是其他原因?

孙宇涛

我觉得好的人和好的组织文化要同时达成,有历史的局限性。不是想达成就能达成的。

氛围这个事情听起来有点虚,也很难描述。

张小珺

你觉得它虚吗?

孙宇涛

我觉得不虚,主要取决于 leader 的 taste,或者 leader 的性格。绝大多数情况下,leader 会影响整个团队的氛围。

张小珺

我觉得 Kimi 有一个特点,好像所有人都不怕杨植麟。

孙宇涛

为什么要怕呢?有道理就听谁的,谁有道理谁说了算。

所以它还是一个非常集体的工作,不是个人的工作,也不依赖个人英雄主义。

张小珺

你觉得未来模型的发展方向是什么?有没有什么预测,比如半年之后、一年之后?

孙宇涛

模型 size 毫无疑问还会继续扩大。我说一下我的判断,我的判断比较暴论:大模型可能没有太本质的创新了,后面都是改良式的进步。

它会做到什么水平,多大 size 对应什么性能?我觉得重要的是大家如何定义能力。

只要大家能定义一个能力,就能去达到。之前大家定义的一些任务,比如数学题、AIME 题,都是清晰定义出来的,所以大家就可以针对性地做到。

这取决于大家如何定义、设计能力,或者从商业化角度关注什么能力。只要能够清晰定义任务本身,能力就能够达成。

如果是纯 language model,我觉得应该没有太大问题。

张小珺

它能达到所谓的 AGI 吗?

孙宇涛

AGI 最大的问题是没有被 well-defined。所以只要能够定义它,就能达到,后面都是一系列优化工作。

如果把 AGI 定义成具身智能,定义成和真实物理世界交互,我觉得 gap 肯定还很大。但如果仍然在 language model 的 scope 里讨论,问题不大。

张小珺

最后它会是一个多大的模型?还是会无限往上叠?

孙宇涛

无限大肯定不可能。首先,预训练数据量,包括人类能够在互联网上聚集到的所有信息量,都是有限的。

基于这个事实,从数学理论上说,想吃掉足够大的数据量,模型不可能无限大,也没有必要无限大。更大的模型可以带来更宽的 bound,可能让上限更高。

更窄的 bound,可能对应我们对模型具体任务的感知还不够充分。如果未来出现更难的任务,需要更大的模型规模,那可能会退化到更宽的 bound 里。

但无论如何,它不可能是无限大的。

张小珺

现在已经到 2.8T 了,之后肯定还会更大。你觉得它最后会有多大?

孙宇涛

还可以再大一些,这是必然的。但再往上多大,就不确定了。

张小珺

你现在为什么去探索世界模型?

孙宇涛

这主要是个人原因。我觉得大模型已经没有太大的改良空间,也没有太大的突破和 credit。对个人来说,从职业生涯角度看,这可能不是一个还能做出巨大贡献的领域。

世界模型的问题更大,但至少是一个新的东西。