张小珺
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。对个人来说,从职业生涯角度看,这可能不是一个还能做出巨大贡献的领域。
世界模型的问题更大,但至少是一个新的东西。