Hello,大家好,我是小俊。今天的节目是一集学习播客,学习Kimi K3的技术报告,希望和大家一起领略技术之美。K3是有效扩展到2.8T总参数并全量开源的MoE模型。大家可能注意到这期技术报告的领读播客,能距离模型发布已经过去了一段时间。期间,我们试图寻找一位合适的嘉宾。我们希望这位嘉宾他的工作和学术背景非常适合的来讲K3。
最后找到了孙宇涛。宇涛目前是清华大学计算机系博士候选人,上海创智学院普瑞学者。他从博士开始的研究方向是 LLM 架构,呃,预训练架构创新一直都是他的兴趣所在,这正好是 K3 的亮点之一。那宇涛,呃,透过领读 K3 的论文,也串联讲解了十多篇相关的论文。他的语速非常快,所以前方语速高能预警。期待二零二六年,我们和AI共同进步。
当然了,这块我觉得可能还有一些别的 concern,比如说我们发现,其实如果用命的话,它其实是会更容易出现奥特莱尔的。就你控制中间的激活值,总不是一个比较错的一个现象。呃,当然,如果我说这个命更容易引来奥特莱尔,这个苏建林一定会反对,他肯定会说,呃,对于任何优化器来说,它都一定会出现奥特莱尔,因为你从模型架构上是控制不了的。
所以说,如果想严格控制的方法,它一定是直接从模型架构下手。的这个哲学上还有一个对吧对应的概念,就是泰修泰修斯之船嘛,就是你刚开始对吧,二零一七年这个船刚开始行驶的时候对吧,是船头门。对,但是这个船刚开始是怎么拼起来的吧?它是attention加recurrent。拼始的过程中呢,对吧?我们会把可能会把慢慢的把某些部分换了,某些部分换了。
其实跟超参数已经,对吧?我觉得像素已经很低很低了。就是你是否还把这个东西叫做超参数?呃,这我说一下我的判断啊,我的判断比较暴论。我的暴论就是大模型可能没有太本质的创新了,后面都是一些改良性的进步。好的,那我们的论文学习播客又来了。这次我邀请了清华大学的 PhD candidate、上海创智学院普瑞学者孙宇涛,将由他带领大家一起来学习和阅读最近大家关注度非常高的Kimi K3的论文。
但是宇涛会带领大家读一系列的论文啊。那宇涛,你能不能先给大家做一个自我介绍,并且介绍一下你的研究方向?嗯,好的,各位观众朋友,大家下午好。然后我是来自清华大学的孙宇涛,我在这个博士期间的主要的研究方向是大模型的架构和预训练。嗯,然后这个博士课题呢,我是从二三年从那个时候开始,我们主要去研究这个大模型的模型架构的一系列的工作。
然后在那个时间点,应该是 ChatGPT 刚刚发布一段时间吧。但是我们的架构研究从其实从 ChatGPT 发布之前就开始,对,差不多就开始了。呃,然后我这两三年的主要的一个这个研究方向就是去,主要是去尝试解决,然后大模型在推理这个环节的一些这个呃低低效性吧。然后所以说我们主要的一些研究方向都是围绕着推理高效性来去展开的。
然后其实大家也可以注意到,说就是在模型架构这个方面呢,整个业界的研究方向也是逐逐渐从偏这个性能为导向,逐渐的变得是以以以效率为导向。呃,然后在这个方面其实是有一些范式上的变化的,因为可能在Vision时代,或者说在ImageNet时代,大家还是尝试去。做到更精妙的一些架构是,然后去提升模型本身的一个表现。
呃,但是在大模型时代呢,然后我们其实逐渐发现,对于模型的性能而言,模型的参数量永远是一个最主要的一个因素。然后在这个在模型架构本身的一些改进性的变化呢,其实相对于模型参数本身的提升,对带来的这个性能提升是相当微小的。呃,但是其实不同的架构在这个模型的推理方面,然后性能差异是巨大的,而且这个也是主要决定了模型最后的一个部署的价格。
然后其实呃,这两年大家呃,主要是在这个方向去努力。呃,然后对于我而言的话,其实我们是在二三年开始,然后探索这个线性注意力,呃,这样的一个方向的一个工作。呃,然后我们GPT Runway的工作刚开始主要是解决了两个问题的。我觉得从现在这的这个阶阶段,这主要解决两个问题。第一个问题就是线性注意力怎么能尽量的去在一些比较general的场景下能逼近这个。
呃,全注意力的这样的一个性能,因因为Linear从刚开始提出,主要是为了去用一个比较现呃Linear Kernel,然后去一个Kernelized的方式去拟合,然后二次复杂度的这全注意力这样的一个Pattern的,所以。所以在之前那个时代,其实对于这个linear attention而言,它的位置信息它是其实是不够sensitive的。
然后其实当在那个时代,这个linear attention和这个和RN只是在形式上比较相似,但是从这个建模的特性上来讲呢,RN其实还是比较强调这个,比如一些一些locality的一些表。是,所以说在那个时代,我们在Rete上是比较早的引入了一个衰减的一个机制。这样的话,可以让这个线性注意力在一个有限的这个状态空间里,然后尽量的去建模着一些对最后的结果贡献足够大的一些信息。
然后,对,然后这个其实刚开始的一个motivation。除了这个模型性能以外呢,我们当时也是主要比较先的提出了这种这个 transformer recurrent 就 transformer recurrent 这样的一个这个线性注意力的一个 kernelized 就是 kernel 的这个计算形式。
因为对于这个线性注意力来说呢,如果把这个整个的状态都展开,然后然后在 token 这个维度去做这个去做递归的计算的话,它其实从从效率上并不是最优的。但是如果用仿照注意力这种这个计算方式去建模呢,它又享受不到这个整体计算复杂度带来的优势。呃,所以说我们当时就是在这种 parallel
representation 从一些并行的,就是像全注意力这样的一个计算形式,和就是全递归的这个计算形式之间,然后找到了一个trade off,也就是这个块递归的这样的一个计算形式。
而这个叉块式recurrent呢,我们既可以拿到这个整体的一个计算复杂度上的一个收益,同时我们能呃在kernelized层面,然后我们可以尽量多的去调用tensor
core,然后把这个local的一些。计算密度都打满,这个是我们提出了一个比较有效的一个计算范式。然后大家其实如果可以关注到,就是之后的一些,其实所有的这些呃线性注意的改进工作都是基于这样 chunkwise 的计算形式去去计算的,对吧?
包括 mamba two,然后 gated delta net,包括然后来到今天的这个 kimi linear KDA 这样的一个计算模式。然后在这个计算大的计算模式之上呢,然后呃又带来了一些新的比较细节上的变化。然后这个可能之后对今天的后面会进更详细的来进进行讨论。呃,然后当然从现在这个视角的呃纯线性注意力,对吧?
就作为纯线性注意力的一个模型而言,无无疑是一个比较失败的一个尝试,因为无论如何,这个比较有限的一个
context,它都难以带来就是在长上下文中和这个全注意力比较完全相等的一个性能,对吧?这个其实在这个今天这个时间点,我们都呃知道是不可能。的,呃,所以说这个当时我们在二三年吧,也是注意到了这个现象,所以说我们就会尝试说,就是从这个全线性注意力,然后转到一个这个呃 hybrid attention
的这样一个架构的形式,就 hybrid attention 就是其实大家不明所以,就是很简单,包括Kimi K3其实也是这样的嘛,就是用一些线性注意力和一些这个全注意力然后组合起来,然后作为一个模型的一个架构,然后这个本质上听起来就是。
呃,像是一个工程上的 trade off,然后也是一个比较工程的解法。但是虽然如此呢,我们当时就发现一个现象。不过这个也是目前所大家公认,就是混合注意力它其实虽然从架构上来讲是一种 trade off,但是从最后模型本身的表现来说,并不是一个 trade off。包括大家其实发现,在保持一定的全注意力比例的基础上,整个模型其实是可以获得无损甚至更好的一个长上下文表现的。
也就是说,其实,在混合注意力模型的架构中,我们并没有牺牲一定的这个全注意力的一个模型能力,呃,从而带来工程上的收益。所以,从这个角度上来讲,也是,也是因为这个实验上的一个结论,然后从而导致这个混合注意力现在被大规模的利用起来。这是你的第一篇工作,是吧?对对对对对,是的,对。然后后来的话,就是当时我们会发现说,这个混合注意力其实在工程上是一个百分之work的方法。
呃,我觉得其实没有问题。当时其实直到今天work的也还是不错嘛。当然了,对于一个博士生来讲,就这个东西就是虽然它比较work,大家也愿意去用,但是那这个东西。从脑体上其实感觉就差点意思,而且感觉也不够有趣,因为当时我们觉得就是如果只是把这两种混合注意力模型结合起来的话,它有这么几个问题。我觉得最大的问题就是它在推理的加速比,它它永远是和这个混合比是正交的,或者说不也不是正交,就是完全成正比例的。
因为现在比如大家比较常用的是这个混合注意力比。全注意力大概大概是三比一这样的一个比例,也就是全注意力,然后在整个模型里大概是四分之一这样的一个比例。所以说,如果说我们认为就是四分之一是一个比较无损的,也是一个比较极限的比例的话,其实我们很难拿到更大的加速比。也就是说,我们无论是 profile 还是做抵扣的。
呃,我们最多的加速比也就是四倍。当然,我们在做纯线性吸引注意力的时候,我们希望是更高的嘛。我们希望最后如果混合注意,它其实只是一个这个常数级别的改进。所以当时觉得可能不是很有意思,所以我们后来就做了UQO这样的一个工作。对,当时我们的呃一个motivation就是我们从第一性原理去思考的,为什么纯线性注意力没有办法获得和这个纯全注意力呃一样的性能?
呃,原因也很简单,就我们至少期望模型有一些比较基本能力,比如说我们至少有一个呃可以获取前全文信息的能力。呃,所以说在这个场景下,其实传上下文的 KV Cache 这一点是没有办法去省掉的。呃,所以说就 KV Cache
既然没有省掉,对吧?我们能不能从另一个维度去省啊?所以当时我们就觉得,既然说这个从从偷看长度这个呃维度没有办法去节省,所以说我们找到了了另外一条节省的方向,就是从这个层间这样去节省。
所以,UQO当时做的是一个,就是所有层共用一份KV Cache这样的一个架构的方式。然后,另外一个就是从模型的计算角度,就每一个头梗在Decode的过程当中,对它的计算密度是没有办法去这个减少的,因为我们希望它保持一定的这个全注意力的计算能力,然后这样它才能达到我们希望的长上下文能力。所以说,我们提出的另一个东西就是,我们希望把这个。
呃,模型的计算和存储解耦开来,也所以说我们我们当时可以看到,就我虽然我们只有一份的KV cache,但是我们可以保持一个多层的复合attention的这样的一个计算结构,所以所以说在这个基础上,我们当时的UQ架构就可以,就是我们只保留一份的KV cache。但是可以获得这个和全注意力或者混合注意力基本上可以等价的一个这个模型的一个计算结果啊。
然后这个架构还有另外一个优势就是我们在 prefill 的时候可以直接跳过这个全注意力的计算,因为 prefill 它就是就比如说就也就是模型处理这个用户输入的呃这样的一个阶段,我们本质上只是希望我们可以拿到模型的 kv cache,然后可以这个 kv cache 是用于后续的这个 decode 的一系列的 hidden state。
所以说这个 prefill 的唯一目的就是去达到这个模型的 kv cache。所以说在这个这种架构上,我们经过前面的一些 linear attention 的一个呃计算,然后拿到了 kv cache,呃这个就够了。因为 prefill 阶段我们是没有必要就是呃解码出每一个位置的后续的 next
token prediction 的,所以在 prefill 阶段我们就可以直接不过 cross attention。
但是在 decoder 的阶段,我们可以保持和这个传统模型一样的一个计算能力。对,然后这个是我相关的一些第二点工作。这个标题也挺有意思的。对,这个也是致敬嘛,有 Only Look Once,当然后来也也有后面一系列的致敬的工作。呃,你只能缓存一次,是吧?呃,对,是的,对这个其实,在这个从KV cache的存储角度,基本上已经达到极致了。
因为我们都同意,对吧?如果从tokenize角度,我们必须能保证所呃的话,一份其实就是最少了,不可能再少了。所以这个从KV cache角度是一个比较极限的一个阶段。对,然后我讲我的 personally
我的一个第三篇工作,就是在这个工作里,我们其实解决了,就是从一个更通用的角度来去考虑问题的话,就是模型的推理开销主要就分为三个部分,就是 prefill 的这个时间开销,然后 decode 的开销,然后和 kv cache 的存储开销。
这三个是最主要的个模型的推理瓶颈,不可能有第四个。然后优酷这个工作呢,我们主要解决的是prefill和解决了那个KV cache,但是我们没有解决decode。然后decode的话,我们后续是或者大家会尝试用这个sparse和tension的方式去解决。然后但是K三它其实目前是没有用sparse和tension,所以这块对今天就对今天就先不讲了。
对,然后我们后面的一个工作是一个和另一个赛道是一个比较相似的工作,也就是 loop language model。loop language model 一个这个顾名思义,也就是我们在保持一个固定的模型参数大小的情况下去,通过多次迭代,嗯,来去提升模型的 flops,从而去提升模型的总的一个这个能力。
所以,loop这一系列的工作主要目的就是可以在保持一个比较小的模型参数的基础上,然后取得比同参数的模型好更多的一个效果。但是,其实传统的这种loop language model它在decode的情况下,它的这个成本其实是难以忍受的,因为它只是省了模型参数,它其实并没有省计算,而且在相同计算下的话,它其实是并不如呃把参数展开或者说用用一个更大的但是不去loop的模型,它最后总的效果好呢。
比较传统的呃,LoRA、LangChain Model,其实还有一个问题就是它的这个推理,它的这个 KV Cache,它的存储,它会随着这个模型推理的深度而增加,所以说最后总的算起来的 LoRA、LangChain Model 所带来的总的 KV Cache 其实是相当大的。呃,然后 UQO
Universal 的这个工作其实就是在这个 UQO 架构的基础上,然后去做一个位置上的改变,也就是我们把 Loop 的单元,然后变成一个很 efficient 的一个单元,然后从而去避免。
就是推理的时候一些额外的一些或者比较大的成本,但是能保持它模型的一个呃效果比较稳定的一个增长。解法也很简单,因为对于UQO而言,它毫无疑问它是一个这个混合注意力架构,但是我们混合注意力方式它它不是一个交错式的一个结构,它是一个呃两端的一个结构。也就是说,我们模型推理的前期它是一个全线性注意力,但是模型的后期是一个全注意力这样的一个架构。
呃,所以说我们的选择是把这个把loop这样的一个架构只集中在这个线性注意力这样的一个位置,然后这样的话,我们呃对整体的Q开始增长是比较小的,因为linear attention它本身的Q开始它其实是微乎其微的。然后第二个就是线性注意,它不仅省存储,它其实也是省了计算,就是对在长上下文这样的一个场景下,它其实带来的额外的计算是相当小的。
但是虽然它呃 linear attention 所这个带来的 attention 的 decode 的计算它是相当小,但是从 in general 的模型能力上的话,它从比如说模型的 capacity 或者说从模型的 scaling behavior 上,它是可以获得足够接近全注意力的这样的一个模型能力。
所以说我们我们这个架构它其实可以达到的一个效果就是从用用差不多这个,比如说我们用两倍于原模型的这样一个计算强度,就我们基本上就会可以获得两倍左右的一个性能提升。但是我们的模型存储和这个模型的 Q cache
还是保持和原模型的一个差不多这样的一个这个推理开销。对,这个是我的第三份工作。然后这边工作是因为去年开始这个 Loopy Language Model 是一个大家比较热议的一个话题嘛,然后我们在这方面然后呃做了一些探索。
所以你从二三年一开始读博,你的研究方向就一直在架构创新上,对吧?呃,对,是的。而这次K3它在LLM的架构和预训练上也做了很多工作,这是我们今天来找你来带我们读论文的原因。呃,对,是的,因为Kimi Liner刚发布的时候,当时我们其实之间也也有一些讨论,然后其实这工作的这个连续性其实还是比较强的,包括K Kimi Liner它其实也是比较原封不动的搬到了K3的一个总的一个核板的里面了嘛。
你为什么一直对架构创新比较感兴趣?我觉得两方面吧,对吧?从个人角度,我觉得架构创新比较有意思,就是比较好玩儿。呃,对,因为别的层面的工作的话,它其实呃工程性的因素会更强一些的。当然,架构创新它也有一些比如说工程性的因素,但是它的工程性主要来源于就是你需要做一些infer上的code
design。但是即使是infer的上的code design,其实我们之前也提到了,比如说我们提出这种chunk recurrent这样的一个计算结构,它本身其实也是infer层面的一个创新。
呃,所以我觉得这个事情比较有意思,而且它比较能起到一个呃四两拨千斤的效果吧。我觉得对于一个博士生而言,这块是一个相当好的一个这个研究领域。当然,在啊,在二零二三年是这样的,二零二六年的话,可能。架构创新能做的其实是越来越少了,这个是其实从个人层面带来的一个考虑。然后整个这个领域的角度而言呢,我觉得其实全注意力的话,它当时是一个非常大的一个瓶颈。
如果说在这个大规模的这个如果对,如果大模型推理是大规模的应用的话,就是attention这个东西是一定可以解决,就是是一定需要解决,而且我们相信是一定可以解决的。所以说在那个时间,我们觉得从我们整个行业来讲。架构创新是对于模型部署而言是最重要的事情。那我们这次的主题其实是一起来读Kimi
K3论文,但是你对于这篇论文有很多自己的想法,所以你也做了一个不一样的一个分享的结构,并不是完全是根据这篇论文展开。
能不能介绍一下你整体的分享的一个结构和逻辑?我一般讲 talk 的主要的逻辑就是从它模型本身,比如说从一个论文本身出发,当然所有论文都是建立在这些之前无数个这个呃 related work 的基础之上嘛,所以我会选一些。比如说,他一个论文,他有几方面的贡献,然后他可能一个论文贡献,他他在背后对吧,有一个历史研究的一个脉络。
对我一般的风格是会把这个脉络。打开,然后这样会达到一个效果,就是如果只看这篇论文,你会知道他是这样做的。呃,但你可能会不太清楚他为什么这样做,或者说历史上大家是怎么做的,为什么最后达到了这个结果?我觉得,比如说从一个比较重要的点展开,我觉得从观众的角度是一个比较好的学习的方式。然后这样的话,呃,也会讨论的更综合一些,因为如果只是一个点的话,它其实。
我觉得意义是不够大的。当然这块儿可能这个模型架构是一个比较多的一个篇幅,呃,主要也是因为一个是Kimi K3它也做了比较多的一个模型架构本身的创新度,呃,另一个就是模型架构这一块它的也这个研究的脉络它其实是相当清晰的,而且它每一个部分它其实都有一些比较固定的一个credit,呃,我们可以就拆成一个一个点,然后把大家去讲出来。
当然,后面也会有一些关于infer的内容啊,因为现在其实呃都是比较依赖这个infer和模型架构的和科技栈嘛,所以这两块它其实是密不可分的。别的一些,比如说这个pretrain data的话,但是大家肯定都是一个比较秘密的状态,paper里也没有写,对吧?对我也不会讲这个paper除了公开内容以外的一些东西,所以这块可能就会涉猎的少一些。
哎,你的罗列结构让我感觉到,其实,嗯,我们最后看到的是K三的一个呈现,但其实它是有很多人的credit,它不只是Kimi一家公司,对吧?它也这也是现在做Frontier这些模型的一个有意思的呃地方,它要吸收很多之前其他人的工作,然后我们也把credit都给到大家。我们这篇篇讲解就是除了你能理解K三,也能理解它是怎么来的,对吧?
呃,对,是的,我觉得作为一个公司比较科学的方式,就是如果你最后想把这个模型做好,你肯定是几百家之长嘛。呃,当然是如果说,比如说你只想用自己的工作,那这样可能就是呃没有必要了。如果是基于这样的目的去做工作,那可能你就会错过一些这个别人一些比较做的比较好的工作,因为无论如何,这个整个行业都是由大家集体推动的嘛。
所以我觉得这个也是。呃,Kimi
K3一个比较好的一个点,它其实我觉得包括它之前的一些paper也是这样的,我觉得比较客观或者会比较真实的把之前的一些工作用一个比较呃可靠的方式呃去引出来,不会说想办法去削弱这个之前一些人的贡献,我觉得这个其实是它做的也比较好的一个点。所以我们这次是从K3出发,然后其实串联起了,不管是十几篇论文也好,还是技术报告也好,还是比如说苏建林老师的博客也好,就是是有很多的内容。
那我很期待啊,我们开始吧。好。Kimi K3从前面它的一个主要的卖点来说的话,它其实主打的是一些,我觉得从几个方面它有一个比较大的一个囊括。首先,呃,他说了他的一些结果,对吧?这个结果特别好,而且对吧?这些数都摆在这里,其实也没有太多可以解读的。然后为什么能达到这样的一个结果?然后Kimi K3主要claim的是。
三个维度的一个 scaling,然后当然我觉得最重要的还是说模型大小的一个 scaling,嘛,就是它做到了一个二点八 T 这样的一个模型大小,而且它是一个比较有效的一个 scaling 的结果。什么叫无效呢?无效的scaling,我今天就可以给你,我晚上回去的起一个这个两点八T的模型,一lit,我跑个一百B的token,然后我就可以放出来,对吧?
这个显然是无效的。所以说这个scaling当然是要永远是建立在有效的基础上。Kimi K3就是在这个二点八T这个scale做了一个有效的scaling,然后这个是模型参数大小,包括模型的一个激活的,它来到了一百B左右这样的一个量级。其实,在Kimi K3发布的时间点,其实是比国内开源模型的其他几家要大很多的这样一个。
情况的,然后它另一个扩展是在就模型上下文长度的这样一个扩展,呃,在模型上下文长度的这样的一个维度呢,它做到了 one million 这样的一个量级,然后 one million 的话,它自然是可以获得更大的这个上下文的窗口,然后去解决更复杂的一个任务。所以说,就是从模型总的来看的话,我觉得还是遵循一个第一性原理,就是更大的模型才有更大的一个智能上限,对吧?
如果别的东西没有做太错的话,其实大家可以看到,这个模型的参数大小还是解决模型智能最本质的一个参数量。当然,如果只看bench mark的话,你有无数种方式去达到一个对内或者对外一个满意的结果。但是从模型的能力本质上,模型的参数大小还是最有效的一个方式。而Kimi K3是一个相当早期或者说相当成功的达到了这样的一个量。
对,然后到这个模型结构章节,模型结构章节的话,就是我们Kimi K3其实是综合了就是Kimi整个团队,包括这个这整个业界,然后过去一年以来比较重要的一系列的创新。呃,K2不一样,对吧?K2当时Kimi的发力方向主要是这个模型scaling本身,或者说一些非模型架构的一些创新。呃,所以说Kimi K2当时主要沿用的就是DeepSeek V3的一个结构嘛,但是K3。
这块的话,它其实就跟K二大不一样了。Kimi K3它本身引入了很多呃比较新的或者说比较创新的一些设计元素,对,包括对吧自己的也好,别人的也好,就是有些比较创新的一些setting也好,或者说比较细节的一些调优也好,它其实这块做了很多。对,比较充足的一些准备,所以从观感上来看,其实跟K2感觉是很不一样的。
呃,首先的话是Hybrid Attention,Hybrid Attention我刚刚也讨论过一些啊。对,我们可以重新翻回头来,然后再从Kimi本身它的一个写作的writing来去看起。然后这块的话,我会先讲一下这个线性注意力的一个在过去三四年以来的一个历史的发展状态。因为你如果直接读这个Kimi
Delta Attention的话,你会发现它的这个公式相当复杂,而且说对不同的项,然后具体是怎么来的,它具体承担什么样的一个作用,如果直接看这个公式的话,它会你会发现它特别特别长。
比如说,比经典的Tension它其实是要复杂很多的。它其实每一项它背后都有一个呃历史性的一些因素,或者说大家从呃对整个模型结构探索呃最后得到的这样的一个结果。所以说从所以说,如果想了解这个媲美Delta Tension。呃,对这个最后是怎么设计出来的?我们还是有必要去探索之前的一些线性注意力经过了怎样的一个发展阶段。
然后让我们再回到这个ResNet,对这个其实是刚开始我们必不可少的一个这个线性注意力的力的一个发展的阶段吧。因为刚开始这个线性注意力非常非常简单,我们就是KV乘出来得到一个外积,然后把它加起来。对,刚开始的线性注意力其实比ResNet还要更简单。然后ResNet在这个线性注意力的基础上呢,然后我们引入了一个衰减项。
然后这个衰减是跟token的位置是有关的。然后这样的话就把这个linear attention从一个比较position invariant的这样的一个角度,从位置无关,然后不让它变上的一个位置有关,然后位置有关。呃,最主要的方式呢,一个就是我们可以加 rope,对吧?另一个就是我们可以引入衰减项,因为无论如何,语言的特性它就是更近的位置,它有更高的一个权重。
所以说,如果我们在一个有限的上下文里想达到更好的结果,衰减这项其实是必不可少的。呃,对,所以说这块是这个现实主义比较前期的一个这个一个经验吧。然后这个,然后这个衰减项把所有工作基本上都都保持住了。然后另一个主要的这个影响就是长可瑞康的这样的一个计算形式。呃对,因为如果我们只是这个做一些偏学术性的研究,或者说只是发paper的话,其实从这个kernelized的一个足够高的一个有效性,其实是大家不会从一个比较刚开始就比较强调。
一个是我们主要发现,对吧?我们完全使用这个递归的这样的一个形式去计算,呃,它其实特别慢,甚至比就就是在训练过程中,甚至直接要比这个parallel computing,就是类似全注意力这样的一个计算方式,它还要慢。但如果我们直接用这种 parallel representation 的又感的又感觉十分傻逼,对吧?
因为,对,因为我们在训练之后,相当于完全没有享受到这个线性注意的收益,它跟全注意力的这个计算强度是一模一样,对吧?甚至还要更高的,因为它可能有一些对别的处理,或者说我们的这个 kernel 写的写的没有 flash attention 好,呃,这些都是有可能的。所以说我们当时觉得,无论如何呢,我们都要找到一个比较可靠的一个计算 pattern,让它足够发挥 GPU 的能力的同时,然后享受到一个。
复杂度的一个加速,啊,所以当时我们就做了这样的一个事情。然后 right now 之后呢,我有两个比较重要的一个阶段在这儿。对,我觉得一个是Mamba,呃,Mamba当时是把这个位置无关的衰减变成了这个位置有关的,是一个衰减。然后接下来就是Delta Net,Delta Net的话,当然这个概念不是松林去提的,当时是这个是Delta Net是之前的一个工作。
然后松林是在这个Delta Net的基础上呢,然后引入了就是开发了一个Pull Don't Read,其实就一句话,就是如何能让这个Delta Net转化为一个GPU可计算的一个这个Chunk Recurrent这样的一个计算模式。对,当时松林去去做这方面工作的时候,我我还稍微有点疑惑,我说看上去好像这个DeltaNet不太可以并行啊。
他说可以并行,并且他已经搞定了。所以说从这个GPU efficiency的角度,这个DeltaNet主要是解决的是infrastructure上的一个困难,而且这个解决方式去我觉得还是一个比较本质的一个方式。然后DeltaNet刚刚出来的时候,我们当时尝试去解决,就因为当时我们知道这个线性注意力它。
在处理全上善文的这样的一个能力上,它其实是不如对不如全注意力的,所以当时就有两个方案嘛,对吧?第一个方案就是我直接认输,对吧?我就去认定,呃,现在就注意力是这个不可能匹敌全注意力的。当然,可能当时我是这种心态,我当时意识到,对吧?可能从这个全线性注意力的这个视角出发是很难去匹敌全注意力的。我当然是这个想法,呃,当然松林是另一个想法,他当时觉得,对吧?
我还还可以再努力吧,我们可以努力的去提升这个线性注意力本身的一个长扇门的一个容量,知道,从而获得更好的一个结果。然后 DeltaNet 当时就是这样的一个目的,所以通过这种方式,我们可以获得比之前的这个 ResNet 和 Mamba 更好的一个长上上下文的一个容量的能力。呃,本质上其实也就是在相同的这个 KV Cache 大小的情况下,就是从算法上提高了这个线性注意力的一个上下文的容量。
当时 DeltaNet 是没有做这个位置衰减的,当时从这个从 perplexity 或者说从这个 benchmark 上,它的结果不是特别好。所以说,我觉得一个一个比较显然的事情就是,既然我们知道这个位置衰减这个事情。本身是可以帮助这个模型总的一个能力的,对吧?那我为什么不把这个模型衰减,然后和这个 Delta Net 这样一个更高容量的 Linear Transformer 结合起来?
GPT 的 Delta Net 正是这么做的。我我们可以去这个结合 Delta Ro 这样的一个这更高的一个线性注意力的计算容量,然后同时我们呃给它带来一个衰减,然后同时融合这两个,我们就可以得到一个更优的线性注意力的一个表达形式。然后这里就可以看到,如果没有阿尔法T这项的话,这项的话,它其实就是一个比较经典的DeltaNet。
然后引入衰减的引入衰减之后的话呢,我们就可以得到这个 gated DeltaNet 这样的一个。的形式,然后大家就可以注意到,这个表达形式其实可以,其实已经比这个刚开始的线性注意力要复杂很多了。呃,对,因为如果把这项,对吧?如果把这个呃,st 减一呃后面的一个系数完全消掉的话,其实就是最经典的这个 linear attention。
然后 ResNet 和 MaVa 呢,只是把这项消掉的,得到一个结果,就是我对这个呃上一个时间点的。呃,历史状态,然后进行一个衰减,然后这样的话是之前的呃ResNet和Mamba这样的一个结果,然后DeltaNet呢,它是引入了一个呃Gate Delta Rule的这样的一个方案,然后从这个然后写成低维形式的话,它其实就额外再增加了一项,然后这样的复杂度其实就慢慢的去叠加了上去。
我们再回到Kimi K3技术报告:从架构创新聊起,注意力美学、多教师蒸馏和开源MoE。我们再回到Kimi K3技术报告:从架构创新聊起,注意力美学、多教师蒸馏和开源MoE。比如说在ResNet,然后Mamba Two和这个Gated Delta Rule的情况下的,当然了,就是线性这个注注意力是分head的嘛,所以说呃一般的线性注意力也是分head的。
但我们一般写的,但我们一般写公式的话,我们会考虑只有一个head的情况。所以说,如果只有一个head的话,Gated Delta Net也好,然后其之前的工作也好,它其实这个衰减上它是一个标量。对它是一个标准解,就是说这我整个一个 head 它遵循的这个衰减系数是一致的。然后这样的好处是它在 kernel 上比较容易,就是写 kernel 比较方便。
因为衰减项它本身想做一个比较好的一个对,如果说我把这个你可以拆成更 refine 的形式的话,我们再去写 kernel 的话,它其实是一个不太好处理的一个项。这个是出于写对写 kernel 方面。然后从这个模型能力方面,当然我们毋庸疑问,就是我们把一个标量的衰减,然后变成channel-wise衰减,它严格的来说是能力更强的。
对,然后Kimi Delta Attention,它它其实就是把这个AT的Delta Net的这这个衰减项,然后从一个标量,然后变解变成了一个更fine-grain control这样的一个量,然后这样的话,它就可以带来就是每个channel可以的衰减系数是不一样的,这样的话我们这样可以带来一个严格更好的一个能力的上限,对吧?
因为从公式上来讲,它是严格更好的。无论如何,这个channel-wise的decay它是可以退化到一个比较均匀的decay的,这样一个严格更强的一个模型能力呢,它会带来一些更好的效果。呃,当然了,就是对于Kimi Delta Tensor来说,一个更强的模型能力,它其实是有一些代价的。它的代价就是它写Kernel会更麻烦一些。
它的麻烦的点就在于说,我们不能说我们作为一个这个底层单元,我们其他部分可以用一个比较呃方便的方式去做这个,去利用摊平号来进行计算。如果是一个标量的衰减项的话,它的处理会特别特别容易,它其实一个tile就只就就只有一个变量就完事儿。呃,但是如果把它从标量变成一个channel wise的话,对它的这个处理难度就会就会增加很多。
然后这样的一个处理难度也会带来这个在Kimi K3里边。呃,一个更更细节的一个cotzant的一个处理,这样的话我们就来到了这个lower bound的dk,就为什么有这个东西,两方面的原因呢?一方面就是我们可以认为的。从算法层面,就我们希望它不要 decay 的太快。但是从从 paper 本身而言的话,它其实是为了和 kernel 来来进行一个 co-design。
呃,原因在于说,就是我们想去处理更 fine-grain 的 decay 的话,我们需要在这个数值上做一个比较巧妙的处理。也就是对于 Q 和 K 而言,我们会做一个这个 decay 的倒数的一个变换。我可以举个例子吧,最简单的例子就是减二可以表表示为这个三减五嘛。这个其实也呃跟RoPE的思想是比较一致的。
呃RoPE的其实其实在这个Infer上一个特别方便的地方,就是它可以通过这个绝对位置变换来去表示相对位置变换。所以如果是在这个情况下,它整个的一个计算会会容易很多。然后RoPE它的思路就是,其实就是用绝对位置来去表示相对位置。所以说,对于衰减而言,它其实也可以用绝对位置来去表示相对位置。也就是说,比如说我们有一个衰减项,它比如说它是一个阿尔法的平方,对吧?
阿尔法的平方的这样的一个衰减项。当然,这个衰减项可能是对吧?第零个token对第二个token的,或者说对吧?第一百个token对一百零二个token的。呃,所以说我们如果想用绝对位置的话,我们就会选择让Q先做一个比较大的一个衰减,然后让K就是往上提升的一个比较大。比如,也就是说,我让K的话又做一个这个三次方的一个衰减的提升,然后让K的话做一个比如说五次方的一个反衰减,然后这样的话,我通过这个乘法结合律,我们就可以得出和原来的递归。
一个比较等价的形式,然后这样就带来一个问题,说对于这个Kimi Delta
Attention来说的话,它会对QK,呃,它有一边儿,它会除一个很小的数,呃,对,乘一个很小的数可能没有关系,它无非就是抵克到零,它并不会带来这个啊,当然我们也不希望抵克它抵克到零,但是从数值精度上来讲的话,我们希望让它控制在这个BF幺六的精度范围内,这样利用RoPE那种就绝对位置来表示相对位置编码的这样的一个方式,它才是有效的。
呃,所以说,为了让衰减在一定的窗口范围内,然后控制在B F幺六的就就就在一个固定的窗口内部,让它控制在这个一定的进度范围内的话,我们是需要从数学上把它控制住的。比如说Kimi Linear它这块是一个对吧?它这块是一个十六个投影态,我的我们就希望这个衰减的在这十六个token的range里边不要超出这个B F幺六的这样的一个范围,当然。
呃,bf16的精度范围,这个是我们已知的。呃,我们可以通过这个bf16的精度范围,然后反解出来在十六个token的这样的一个区间内,然后我们最多可以衰减到多大的量?然后kimi delta
tension它它就大概选了这样的一个量。然后这块我们可以去证明说,就在十六个token的tile里,我们是可以这个衰减,像是不超出bf16 dynamic range这块的这个lower down body底的decay,它更像是一种口底赞,知道吗?
我们通过这个模就模型算法层面的一些控制。对,然后让它获得就是在一定tile的内部,然后不要让它有数值方面的问题。这样的话,整个kernelize的一个方式会更加的去通畅。当然了,如果不去限制这个kernel,肯定也有自己的写法。当然了,那那种写法可能就会低效一些。所以说,为了保证一个高效的实现。Kimi
Delta Attention是采用了在一定的这个tile窗口内,然后控制它最大的一个系数就衰减程度这样的一个方式。
对,然后 Kimi Delta Attention 大概就是这样的。其实拖拉东瑞的也也也很不简单。第一个就是我们 Kimi Delta Attention 把这边这样的一个对计算方式扩展了一下,它的计算能力。然后为了扩展的这个计算能力带来的一些额外的 infar
上的麻烦,然后他们在模型的表达范围内采取了一些限制,然后让它满足呃 kernelize 的一个方式,然后最后得到了这个 Kimi K3 采用的最后的一个形式。
呃,OK,下一个环节是 K T 的 M L A,顾名思义,它就是把两个对把两块的模型结合了起来。M L A 可能大家都很熟悉了嘛,对,是 Deepseek V2 刚开始去去去用的,主要目的是就是对主要目的是减少一些开开始的一个开销。然后 M L A 的这个配置呢,后面主要是被这个 Deepseek V3 和 Kimi K2 然后去去采用的,当然 Deepseek V4 没有用。
因为Kimi K3也用了,然后Kimi的同学们认为呢,就是MLA如果在这个全注意力这样的一个scope内部,大家觉得至少还是一个可以接受的一个形式,或者说没有必要去大动的一个形式,所以说这个K3还是采用了跟K2一样的这样的一个形式,然后在这个MLA的基础上呢,它增加了一个GT的这样的一个操作,然后GT的attention呢,呃,最早应该是Temen团队呃刚开始去用的。
对的,然后从千万这个团队的标题也可以看出来,就GPT的attention它当时主要是解决的哪些问题?比如说这个long linearality,然后这GPT的attention可以带来额外的一个计算的一个强度,然后sparsity和attention free,然后这个东西可能并不是那么显然,这个就得具体看它的一个呃paper了。
但是whatever,我觉得Delta的attention大家最buy in的一个点就是它的一个训练稳定性。呃,而且这个训练稳定性它是一个,我觉得是一个被广泛验证过的这样的一个形式。呃,大家可以从前面这个训练图里可以去看到,对于一个这个 pretrain 的 run 而言,我们还是希望它越稳越好。从模型能力上,如如果不是最优的,但也没有关系,对吧?
因为模型的能力其实本质上最主要的因素是模型的参数大小,所以说好一点、差一点,它都不如稳定性要重要。因为如果稳定性不好的话,它会带来很多麻烦的问题,呃,甚至比较对比较比较大的问题就是你整个round都训崩了,然后你前边整个的这个前边整个的checkpoint都废掉了。这个其实对于这个,对我觉得对于任何团队而言都是不可以接受的。
呃,所以说如果说一个方法能比较有效的去提升模型的稳定性,这个还是一个大家比较愿意采用的一个技术吧。然后千万的GPT的Tensor的这个千万三应该是对,千万三应该是没有用。后来的这个后来的千万Next,包括千万三点五、三点六,应该都采用了这这样的一个架构。呃,虽然它会带来这个一定的这个额外的这个计算开销,但是它会对这个模型的稳定性会带来特别大的一个好处。
啊对,然后这个是嗯对,之前这个千问团队的一个工作,千问是在这个J K A上引入的嘛?对,但这个设计它其实无论是你跟我这个东西是跟J K A或者说M L A。它本身是一个的正交的一个设计方式,所以说这个Kimi K3把这块对这块做了一个结合,就把GPT的Tern的这样的一个这个稳定性的一个方式引入到MLA当中。
呃,然后这样的话,它本身也不会破坏这个 MLA 本身的一个推理性质,的同时可以提升这个模型的一个学对可模型的一个训练稳定性。为什么 V 四没有再继续沿用 MLA 了呀?呃,对,因为他们有别的东西了嘛。你觉得 MLA 在未来还会成为一个共识吗?因为我记得卢福利之前跟我说过,他觉得在 A 正时代,MLA 应该会被替代。
你觉得 MLA 在未来会成为共识吗?我们先从技术上讲,MLA它本身就是MQA的一个等价的一个形式,所以说MLA其实本质上并没有带来新的东西,它只是一个更好的trade off。大家其实没有发现的一点就是,如果大家想把MLA用好的话,它其实想达到相同的一个计算效果,它其实会增加更多的attention的计算去弥补这方面的一个损失。
所以说我个人认为,就是 M L A 主要拿到的收益其实是可以被更好的这个 G Q A 的这个参数设计,基本上是可以拿到绝大多数的收益的。所以为什么 DeepSeek 没有继续沿用 M L A 啊?呃,对,因为 M L A 这样的一个转化形式,因为 DeepSeek 四它主后面主要推 Sparse
嘛,呃,对,Sparse 跟跟 M L A 它其实不是一个百分之百兼容的东西,尤其是在这个在 Profile 阶段。
呃,对,而且他们其实是用了这个 MLA 的等价的 MQA 形式,因为从从数学上来讲,MLA 它本质上就是一个大号的 MQA,所以 DeepSeek V4 用的是一个大号的 MQA。呃,我觉得本质上区别不是很大的。罗弗利当时是在 V2 Flash 里面采取的是 MTP,他觉得 MLA 对 Chat 来说是一个优秀的模型结构。
但是他觉得不那么适合Agent的范式。MLA在设计之初,为了达到很好的访存和计算的比例,在当时的H系列芯片上实现既不浪费算力又打破访存瓶颈,是在这个架构下设计的。就发现计算剩余的实在太多了,他觉得MTP能够更有效的能够利用起来啊,对对,这这个其实是一个比较reasonable的一个点,就是MLA在推理阶段,它其实的它的计算其实是大大浪费掉,它它其实从它的计算是远大于它实际的这个建模能力的。
对,所以说就就对于计算而言的话,它这块是有一定的浪费。罗弗利可能主要讨论点就是就这种计算模式,它它跟MTP的收益它不是正交的,它是甚至它可能是这个互相缓冲的,因为MTP本质上就是用更多的token同时去计算,然后在memory bound的这样一个条件下,然后主要逐渐往这提高这个compute bound的呃方向去推,所以说也对于MLA而言,MTP的这个对加速比会大大减小。
呃,我觉得它从来也没有是共识,它只是一个选择。OK,但K3这边起码它选择继续沿用的是MLA。呃,我觉得K三是reasonable的,因为K二当时主要是follow DeepSeek嘛,他们当时的选择是先不做模型架构的创新,先把结果跑出来。对,然后就是说,然后如果从K二到K三的话,这块儿我觉得对于一个从工程或者说从组织管理上能跑的东西就不要动。
就是如果MLA它不是一个特别大的问题,那可能就暂时不会动。但我觉得未来也不一定。我觉得这块儿它我觉得是一个比较暂态的一个状态。当然了,MLA也不是这个没有好处嘛,所以说我觉得这个都还好的。所以它是加强了MLA的可控性,对,那GPT它主要是提升MLA本身的训练稳定性,那这块跟MLA是正交的,就是任何任何复合参数其实都可以用。
好的,我们现在讲到二点二,对吧?对,二点二就是 attention residual,attention residual 其实当时还挺火的。但是其实如果从 follow attention residual 这样的一个研究脉络来讲的话,我反而会认为 hyper connection,我觉得是一个相当好的一个工作。
对,Hierarchical Connection 是很早以前 C 的团队去提出的的。对这块主要讨论的就是在一个比较深度的模型当中的一个由深层到浅层的一个连接方式,对吧?如果我们再仔细去去考虑问题的话,对吧?因为它叫 Attention Residual 吧,对吧?这个本质上跟 ResNet 其实都有一个比较深刻的一个连接关系。
呃,ResNet它本身解决的就是这个模型能力,在这个模型参数增长的情况下,它至少可以达到一个不退化的一个效果,对吧?包括从稳定性角度,它其实也是对,或者对它其实从无论是从模型稳定性和模型能力上,它其实ResNet本质上都会比之前的一些工作,呃,有本质性的提升嘛。不过这个大家都很熟悉了。然后大家其实没有注意到的是,ResNet它其实是有两个版本的,它一个是CVPR的版本,然后一个是这个ICCV的版本。
其实是在ResNet那个时代,凯明就已经讨论过,就是pre-learn norm和post-learn norm和训练稳定性的这样的一个关系了。呃,然后其实,而这个其实也可以追溯到这个,比如说在BERT时代,就是BERT时代,它其实大家还是会更常用post-learn
norm的。大家在BERT时代会觉得Post-LNorm它的结果可能会稍微好一些,但是在模型增大的效果的在模型逐渐增大的这个情况下呢,大家会发现Post-LNorm它有这个梯度消失的问题,或者说有训练不够稳定的问题。
所以大家后面就会逐渐的去采取 pre layer norm 对这样的一个残差连接的手段。然后 attention ratio 它其实之前苏建林讨论过这样一个观点,就是 attention ratio 它绝对不是这个 pre layer norm 到这个到另外一个 layer norm 放放方式的一个区别。
这样的话,它其实这个风险是很大的,因为它会有,呃,如果说你一旦触及了这个 post layer layer norm 之前的问题的话。对整个大的状,大家肯定是不敢上的。所以说,Ten Residual 它当时这个强调的就是它一定是 Pre Lear Norm 一个超级,就是它至少是可以退化到 Pre Lear Norm,它是严格的是比 Pre Lear Norm 更强的一个结果。
然后这块是主要就是呃简单讨论一下呃 Residual 这条研究线,呃这之前大概是怎么来的,呃对,然后 Have Connection 我觉得这个工作是相当有意思的。其实我觉得呃无论是这个 Team Seek
后来做的改进也好和这种也好。本质上都是其实都是从这篇工作来的。它主要讨论的一个点就是,如果这就是我们在这个 pre-linear 的基础上,如何去增加模型残差的容量,从而去提升模型能力的一个表达能力。
呃,当然了,这个我之前也跟这个 Hyper Connection 这个一作的同学交流过,我说我觉得这个工作本身从技术上还是很好的,但是它一个最大的问题就是它 paper 写的太抽象了,不太容易读。Hyper Connection 我觉得本质上就可以说一句话,就是我们在 residual
的这个分支上去用比模型 hidden state 更大的一个容量,然后来去这个表示这个模型在这个模型推理深度上的一个状态。
所以说,如果我们有更大的容量,它一定是有更好的一个效果的。我觉得Hyper Connection它其实,我觉得从我觉得从思想上是相当简洁的,对。但是这个paper呈现形式可能相对复杂了一点,呃,所以说当时这个工作其实没有出圈,可能只是一个比较对大家做做架构或者说技术层面的一些同学去了解的,呃,但是后来这个MHC可能就比HC本身要的要火了很多。
但是我觉得最重要的原因还是当时这个MHC是DeepSeek提的,我觉得可能没有别的原因。所以说,在HyperConnection之后的话,就是大家会尝试去从模型,呃本身的一个连接方式来讲去提升模型能力。因为从HyperConnection包括Tensor Recidio,它一个比较好的点就是它对于推理来说基本是免费的。
也就是说,对,在模型的inference阶段,它其实几乎不会增加任何的推理开销,它就可以拿到对更好的一个模型结果。这个其实是大家这个喜闻乐见的,对,因为如果一旦涉及到对,一旦涉及到我们通过更慢的一个。实现也好,更慢的模型架构设计也好,取得模型更好的表现,那这块就带来一个自然的吹到火,就是我为什么不能去扩更大的size,这样还这个简单一些。
所以说,一切比如说通过这个更慢的模型实现的去提升模型效果的方法,其实都是会被福利question的,或者说甚至说对于一些呃保守的,或者说不是自己提的时候,可能大家就不会愿意去用。呃,对于这种模型设计,它可能在推理阶段是几乎免费的,这样的话大家上的时候没有什么压力,而且它其实是。和这个模型参数本身的提升,它其实并不是一个重要的一个状态。
对,然后Hyper Connection 最下维度的话,其实还有一个比较绕不过的,就是 DenseNet。呃,DenseNet 这个是一个更早的一个工作了,就是它是对,它是黄高老师在那个 ResNet 之后,它提出一个连接方式。DenseNet 其实和 Tenry Celo,它其实在思想上一个是一个相当密切的一个方式。
对,只不过在 DenseNet 时代,它其实是因为 residual 它其实只是这个层和层之间的一个连接方式,但 DenseNet 它其实是就是在深层要去看这个所有浅层的状态,然后再把它聚合起来的这样的一个呃方式,呃,只不过就是其实在 DenseNet 时代,因为那个时代其实没有 attention,或者说大家也没有过度重视呃 attention 本身的一个。
啊,能力,所以 DenseNet 里边主要是一个大的 Linear 来去把这之前所有的这个对之前所有的 hidden state 然后聚合到一起的,呃,对,然后到 Attention 时代的话,其实 DenseNet
它的那个对它那个实现其实本身是不快的,呃,对,因为它的这中间对于这个连接方面的,它会带来一些大量的额外的计算,但是到了这个 Attention 时代的话,大家会其实发现,就是我们可以把这个 DenseNet 里边。
呃,一些比较high weight的部件,然后变成更light weight的部件,然后这样的话就诞生了Ternary Zero这样的一个工作。啊,Ternary
Zero它最大的优势就是它其实比DenseNet它是一个更对,它其实一个更efficient的架构。我们可以通过一些这个更深刻。更深层次的 inference design,对,比如说用 block attention
的方式去解耦掉这个模型的深度,对,因为如果只是全注意力的话,它上层会跟底下所有层来去进行交互,对吧?
这个其实也是这个之前的一个比较大的问题,就是模型越深,它这块的 overhead 其实越不可忽略。然后 block attention 的话,在这块做了一个解耦,所以说它整体。呃,一方面是 tensor 它本身的这个计算比较 lightweight,然后第二方面就是它解耦的深度,所以最后呃总的看起来它其实就是一个比较灵巧,但是一个能结实的去提升模型能力这样的一个组件。
然后这块儿他们对这块儿可以看一些这个 scaling 的一个结果,就 block 对 block ten reciduo 它因为它结果的深度,它严格来说表达能力肯定是不如父 ten reciduo 好的,对,但是这块儿大家 claim 的点就是它其实并没有损失太多能力,而且对于 baseline 来说,它是一个比较显著的一个状态。
对,然后 ternary zero 这块应该主要就是上一个技术 paper 里讲的,然后 K3 这块应该没有做太多特殊的处理。对,然后这块大概就是这样的一个一个情况。你刚才讲的这几个,你觉得哪个创新性是最强的呀?其实我更喜欢 DenseNet 和 Cover Connection。为什么呀?因为
DenseNet 它是一个相当早的工作嘛,就是因为在那个时代,其实大家考虑这个连连接的问题,我我觉得本质上它的 ResNet 考虑的问题,其实 DenseNet 都考虑到了,只不过当时没有延伸而已。
然后 Hybrid Connection 的话,其实它相当于是在 Transformer 时代重新把这个东西带了回来,然后让大家在这个连接方式上重新去讨论如何有一个更强的连接方式,然后从而去提升模型的性能。我觉得后面的工作当然会有一些这个抠点烂或者说有一些模型稳定性的问题,但我觉得大的框架其实是之前的工作已经定好的。
OK。嗯,然后它的MoE是应该是年初对英伟达他们一个团队去提出的。对我觉得这块,我觉得一个比较大的一个,我觉得一个比较大的好处就是,包括大家如果熟悉这个DeepSeek
V3的同学,其实都知道,就是训练MoE其实其实无论从这个模型的稳定性或者训练方式,包括从一块上,它其实就是一个很大的挑战的。呃,然后最大的挑战就是这个呃M O E的autoal dispatch,其实在E P的情况下,它的这个overhead是相当大的。
也就是为了解决这个问题,然后我们不得不引入D P E P这样一个比较高优化的一个通信的通信通信库的方式,从而去降低这个autoal的这样的一个开销。包括其实不同的autoal的不同的M O E的设计架构方式,它不仅影响了模型架构本身,它甚至影响了第。从不同的 infra 的一些设计选型,这个之后后面会在这个 infra 那块会做一个更多的讨论。
呃,但是 Layered MoE 这个它其实本本质上的东西就在于说,我们是否可以把这个 auto dispatch,呃这块的开销来去减小。因为 auto dispatch 这块的话,我们需要把这个 hidden state 分发到各个专家卡上,而且这个通信量它是会随着这个 expert 这激活的数量和这个这个模型 hidden state 的大小来去并行的去增长的。
对,然后 latent MoE 它的思想就是我们是否可以把这个把通信量减少的同时,来去保持模型的这样的一个表达能力。然后,linear MoE的方式就是我们把 dis dispatch的这样的一个hidden state减小,它可能减小二两倍,减少四倍这样的一个量。当然了,如果我们直接去减小它的hidden dimension,它后面的模型的这个MoE的参数量可能就会随之增长。
为了去弥补这个linear dimension减小的一个参数量的话,呃,这样呃,然后这里边就有两种方式,对吧?第一种方式就是提升MFFN intermediate
dimension,就是通过这个提升MFFN本身的一个。参数量,然后把之前呃降的那部分弥补回来,呃,这是一种方式。另一种方式就是我们去进一步去把模型拆碎,啊,这样的话我们去用对,我们去用更多的expert和更多的激活,然后来去弥补这个模这个参数量的这样的一个减少。
然后最后其实我们可以看下来,就是当然在英伟达这个paper里,它其实结果是更好的。其实总总的来说就是一句话,就是如果一个恰当设计的latent
MoE的一个configuration,它其实是呃可以完全保持这个standard的MoE的这样的一个结果的。就是也就是说,我们可以在这个模型能力呃完全相等和对吧,甚至还能好一点的的一个context底下,然后来去就是减少模型的这个latent,呃去减少模型的一个通信开销。
而且通信开销其实是在这个在通信和在训练和这个推理中是不一样的。呃,训练因为我们主要优化的是输出嘛,我们可以用一些这个overlap的手段,然后来去把通信这部分去弥补掉。对于inference
latency来讲,尽管我们可以用一些手段,呃,来去掩盖来来去掩盖通信开销,但是这个时间它是避免不了的,因为它整体是在这个 critical path 上嘛,所以说就是对于模型推理的这个 latency 来说,通信开销它还是一个呃相当不可忽略的一个点,呃,所以说就是其实从模型的这个
efficiency 上来讲,这个推理的收益其实是比训练的收益要大的,当然训练也有一定的收益,所以说如果说latent MoE 不是一个 trade off,就是我们不需要去三百号牺牲模型的这个表达能力,呃,来去来去降低通信的话,它其实还是一个这个 free lunch 或者类似 free
lunch 的这样的一个结构,呃,对,所以说 Kimi K3 其实是 follow 的这样的一个结构。
当然了,在 Later Moe 之上的话,还有一些比较细节的一个改进。然后针对这样的一个比较细节的改进呢,我们可以讨论一个比较经典的问题,就就说起来也很简单,就是两个矩阵连乘。这是一个非常非常基本的单元,就两个矩阵连乘,其实在模型表达能力上是 trivial
的,对吧?因为两个矩阵连乘,严格的是可以是可以合并到一个的,但是优化性质上其实是并不是这样的,就是两个矩阵连乘经常会出现这个模型训练不稳定的问题,所以说两个矩阵连乘一般中间都会用一些这个搭配一些稳定性的手段,然后来去弥补这样的一个事情。
这个思想其实在这个MLA里也是出现过的,因为MLA本质上也是就是先做一个low projection的投影,然后再把它打回来。它其实本质上也是两个linear连乘的一个方式,然后两个linear连乘中间的话,一般会采取一个normalization的一个方式,然后把中间的hidden state控制住,从而那个提升模型整体训练的一个稳定性。
对,所以这突然 don't read 就是很简单,就是一般来说,就是模型在模型架构的设计的当中呢,如果你不得不把两个矩阵连成拆开来写,而不是合并到一起的话,中间一定要加一个类似 normalization 的一个手段。然后这个思想其实在对一个是在 MoA 里有个设计,然后其实这块的 latent MoE 其实也是类似的道理。
归根结底,这个 latent MoE 我是先把这个模型通过一个呃模型的 hidden state 通过一个 linear projection。把它压到一个低位的状态,然后在我们在这个 linear projection 的基础上,然后来去进行后面的一些计算。然后当然了,呃,对于 FFN 来说,对吧?
第一个计算当然也是一个 linear projection,所以这块其实就会出现两个 linear projection,呃,连乘的情况。所以这块我们需要一个 RMS norm 来去控制它。OK,然后下边就是这个 C2GROU
这个设计其实也是一个大家看起来可能对没有那么直观的一个东西。然后这个东西其实也跟之前的一些设计是有关系的,因为大家其实会发现,就是对于大模型训练来说的话,就FFN这块的这个MLP,它其实中间的hidden state是一个特别容易一个activation
explode这样的一个状态,而且这个东西一个是跟优化器有关,另一个就是跟模型的精度有关。
呃,就在模型精度更低的情况下,中间的这个hidden state更容易出现outlier。然后为了解决这个问题呢,然后GPT
OSS其实刚开始采用了一个对吧特别简单的状态,就是把最简单的Swiglu就是没有没有当地的那块儿,直接通过一个Clip,然后控制,比如说我们可设一个Clip的值,比如说五到十,然后我就把它Clip Clip到这样的一个程度,这样的话就是可以从数学上比较严格的可以把这个它的上限控制住。
呃,然后 clip 它是一个比较粗暴的状态,然后你如果把这个 hard clip,呃,变成这个 soft clip,然后你就会比较自然得到这个 tanh h,呃,这样的一个算子,因为 tanh h 它它符号就是一个 soft clip,如果你指定一个下界,指定一个上界。它可以用一个比较平滑的方式,对吧?
比较一个比较平滑的方式,然后它毕竟你希望的一个是很上界,所以从这个角度上来讲,我觉得可以理解为一个 clip 的一个升级版。但这个升级版具体在模型的表达能力上有多大的影响,我觉得这个是另一回事,而且这个肯定是需要这个具体的实验来去证明的。呃,但 whatever,我觉得 soft clip 它还是一个比较安全的一个做法。
从SwitchGLU开始,然后首先把一个比较自由的那个Linear Projection,然后改成了一个Tangent H Bonded的一个状态,然后另一块的话就是Switch,因为SwitchGLU它前面就是一个也就一个Linear的一个结果,然后再加一个SwitchGLU的一个结果嘛,呃,这个Switch我们又可以拆成这个Sigmoid和一个这个Linear Projection。
当然,这块它是一个共享 weight 的一个状态,所以 C to JL 相当于是你把我把所有这个中间可能出现 unbounded 的一个环节,然后把它通过一个 tanh 的 h 的上下界放松,然后来去 bound 住,这样的话就可以把整个 MLP 中间的一个激活得到一个严格的数学上界,然后这样会可以用于保持模型的训练稳定性。
当然了,这块我觉得可能还有一些别的 concern,比如说我们发现,其实如果用没有的话,它其实是会更容易出现 outlier 的。就你控制中间的激活值,总不是一个比较错的一个现象。呃,当然,如果我说革命更容易引来奥特莱尔,这个苏建林一定会反对,他肯定会说,呃,对于任何优化器来说,它都一定会出现奥特莱尔,因为你从模型架构上是控制不了的。
所以说,如果想严格控制的方法的话,一定是直接从模型架构下手。什么?苏建林跟你观念不一样?这个他没有说,但我猜到他会这么说。对,因为这个其实之前在 Kimi K2 的这个 MoE Clip 里也做过类似的讨论。大家如果之前对 Kimi K2 或者 MoE Light,大家如果记得的话,但当时就会说,就是因为用了 MoE 优化器,所以 QK Logics 会更容易去爆炸。
所以 MoE Light 他们采用了一种就是对于 QK 的一个比较特化的一个处理方式,然后来去压制模型的 outliers。然后在那个时间点,大家就问嘛,说为什么对吧?为什么我们之前用 Adam 训练的不需要加这个东西?然后为什么对吧?之前的这个QK老师都很稳,就不需要额外的处理。但是Moe为什么要特殊处理?
当时苏经理就是这么回复的,他就说从严格来说,Adam也不是完全稳定。然后当时Deepseek V三可能Some号也有一些不稳定的现象。当然,这个并没有影响模型最终的结果。他当时在对没有clip的观点就是,如果说在没有训练里有可能出现的一个错漏现象,它严格来说就是容易出现的,只不过你可能出现的早晚问题。
所以说,为了严格的限制这样的一个模型的行为,还是从这个从模型架构本身去做限制是一个更本质的方案。他当时是这样一个观点,呃,所以说这块他肯定也是这个相同的观点,就是我们为什么不直接在architecture上做一些改变,然后让它整体把bound梯度限制住就完事儿了,也不需要去纠结更复杂的优化的细节。其实我觉得是一个道理,所以说我觉得他应该还会这么说的。
对,Miu是对于K二的一个沿用,对吧?对对对,这块儿该相比K2没有做太多的改进改变,嗯,没有当时比较严重的问题,就是它其实控制不住这个对控制不住,中间还ACTIV是outlier。更早的一个版本,它它是更粗放嘛,它当时连维的维DK都没有加。所以说,这个 MoE Lite 比较率先的,就是把呃把
VDK 这样的一个对这样的一个因素,然后是首先引入到这个比较大规模的模型训练里,然后这样的话,其实在这个更更长的 run 里边是可以保持的。
另外,就是在Kimi K2的时候,它就在这个Weight Decay的这个应用基础上,就额外对额外搞了一个的QK
Clip的一个放缩方式。然后其实这两个加起来是一个对,就就就是Kimi团队在这个优化器上一个对比较完整的工作。呃,当然现在其实大家用用的方式比较多了,但是大家解决的方式不太一样。比如说你用MLA,你知道你就没有办法去加QK Norm,因为QK Norm它是严格可以限制的,就是QK这块的一个边界了嘛。
呃,所以说为了去适配MLA和妙的一个结合,对吧?所以说当时Kimi K3我引入了这个QK Clip这样的一个操作。呃,当然大家可以注意到,比如说,对吧?比如说那个 Deepseek V4,然后包括那个这个 Stable Diffusion 那些,他们应该都是用了 Moe,然后在 Moe
的基础上,因为他们又都是用的那个 GQA 嘛,没有用 MLA,所以直接用 QK NoM,它其实是本质上是一个更简单的办法,就是尝试去控制,就是呃这个 Moe 带来额外的 outlier,这个 outlier 在 QK 那块更容易出现的。
它也一定会在这个 MLP 这块出现,相当于采取了不同的方式。就 QK 那块通过 clip 也好,然后 normalization 也好,然后把它限制住。然后在底下 MLP 这块的话,当然会用一些比较更 lightweight 的手段。然后 Kimi 现在就是通过这个用设计了一个就一个激活函数把它绑得住,就大概就是这样的一个思想。
呃,然后 quantile balancing 的话,这个没有发什么论文,是是是苏建林在他自己的博客里去讲的。然后 quantile balancing 的话,它主要是可以 follow 到就之前的这个 loss free 的 routing 的方式。它主要的控制方法就是它只只通过一个 bias,而而不是通过一个偏整体的 loss 控制方式来去这个解决模型 expert 的负载均衡的问题的。
然后当时 loss free 大家比较对比较奇怪的一个问题就是它这样的一个 bias 的变量,因为这个 bias 的变量它直接决定了这个每个 token 它选哪些 expert 的嘛。但这个更新方式 somehow 是是有效的 work 的,就是它采取了一个比较启发式的更新方案来去做这个 bias 的更新。
然后这块的话,一个问题就是它这个东西它其实没有一个比较严格的一个呃数学的一个收敛标准。另一个就是它其实呃容易和这个主模型的更新,给大家一个感觉就是可能没有那么这个耦合啊。当然这个形式还是本身还是可以work的,对,还不错的。就是在整体work不错的情况下的话,其实当时loss free有几个问题可能是没有完全解决的。
最主要的问题就是如果在使用loss free的时候呢,大大家可能会采取就是模型最最底下几层一层或者三层,然后都把MoE去掉的一个方案。主要原因就在于说,对于 LoRA 这样的一个控制方案,对对于底层的模型来说,它做 work 的不是很好。正是因为 LoRA 它整体没没有做整体的一个扩定,所以它可能会采取一些别的方式,然后来去弥补这个模型在大规模训练中碰到的一些问题。
呃,对,然后 quantile balancing 这其实是主要是尝试用一个更 principle 的一个思想,然后来去这个解决模型推理的一个模型这个 MoE 负载稳定性这这样的一个问题。它本身 loss free 的这个 update 的方式,它肯定是就是经过大量的这个调整之后,呃,得到了一个就是 work 还不错的一个方案。
所以它本质上也很简单嘛,就是如果你某个专家对吧,你的激激活的多了,然后就把 bias 往下砍一点,对吧?如果每个哪哪个激活的少了,就就往上加一点。然后之前的 loss free 是一个比较启发式的方案去做嘛。嗯,对,然后这个Kimi团队呢,用的更principle的一个方案,就是我们能不能对吧,直接通过一个这个线性关的方式是直接推导出来,就是这个bias它应该是长什么样的?
答案就是这个是可以被推出来的,而且推出来的具体的方式也跟之前的expert的choice呃有一定的关系。然后最后的话就是 quantile bias,它呃经过一系列推导,它最后就得到一个一步的一个这个形式。也就是说,比如说我们对于一步呃对于一个 step 内部的一个整体的激活,我们是可以求一个 bias,然后这个 bias 它本身就是一个这个它本身就是一个让模型可以这个负载均衡的这样的一个方案。
然后他博客里又写到了,就为了去避免这个信息泄露。也就是说,我们不能让任一个 token 然后来去获得其他 token 的的的一个信息,所以说这个 beta 并不会在这个当前 step 使用,而是会在。呃,下一步去使用,然后这个是中间这个 control balance
的这样的一个细节。苏电林博客里其实就主要提到的一个优点就是,首先它其实它不需要调参数,因为 loss free 它是有一个类似 learning rate 的一个更新的方式的。
这样的话,它其实少了一个参数,整体的看起来会更加 principle 一些。然后第二个优点就是它其实对于负载均衡 balance 这样的一个能力,它其实是一个更优的一个能力。然后它这块的博博客里就会贴出一个图。对于第一层而言,就因为呃其实我刚刚也提到,为了这个兼容这个 model loss free
balance,之前大家会把前几层搞成 dense,不用 MV 这样的方法,然后把去把这个东西去规避掉。
然后,如果说对于这种Q B这种方式的话,其实就没有必要去规避这样的一个问题了。其实它其实就可以,呃,直接把第一层变得balanced。这个其实可以发现,前底层用dense,它其实是一个,对,它其实并不是一个ground truth上一定要去这么去做的一个方式,而是它其实在loss free的这样的一个context底下不得不去采用的一个方式。
然后其实如果你不采用 loss free,你直接就采用了加辅助 loss 的方案之后,比如说千万 MoE 的工作,它其实就是采用直直接求 loss 方案的,对第一层也会没有问题。所以说这个这块的话,它主要就是可以处理到就是之前这个 loss free
一些比较失效的一些情况。啊,当然了,它它博客里也提到,如果本来是三 S S G D 就比较 work 的情况下,这个 Q B 它也是比较 work 的。
而且他博客里也可以证明,对吧?也比较这个正常的情况,它其实是可以推出来说,这个Q B如果我们不采用这个直接去均衡,而去采用一些梯度更新的方案的话,它其实是可以和loss
free做到一个相当等价的一个数学形式的。然后这块其实还有一个细节是,这个之前的那个博客里没有去提及的。简单来说,就是我们为了去在这个在整个一个batch,也因为现在大家大模型训练一个batch会特别大嘛,比如说这个对四million可能都会比较小,可能到几十million这样的一个量级。
就K B需要在几十million的token之间恰巧取到在一个比例的位数,也就是说,如果对于一个精确的计算的话,我们需要把所有token的所有token的这个激活情况都都存下来。呃,其实这个是相当heavy的,甚至在工程上是不可能的。然后当时在博客里提出了一个方案,他采取的方案是每个G P
U都去做一个local的一个分位数计算,然后再把这个不同G P U的这个分位数的计算,也不一定是不同G P U了,反正就是你得把一个大的batch切碎,然后在一个小的batch里,然后去求分位数,然后这个分位数最后在这个做一个pooling。
嗯,对,然后Kimi K3这个paper,它这个paper其实是有一些不太一样的一个变化,它它并不是按token去切切chunk的啊,当然也有可能是我理解错了,它其实是对这个模型的在值域切一个chunk,也就是说,比如说这个对于这个对于sigmoid的激活而言,它一定是零到一之间的,所以说我们就可以在这个零到一或者说负一到一啊这样的一个这个区间范围内,然后切成n个桶。
然后在这个桶里边,然后去进行 histogram 的一个统计,然后这样的一个统计值,这样的话它有一个好处,它是它可以是一个常数范围,呃常数量、常数的这个存储大小的一个,就就就可以做的一个。啊,计算,而且它的这个计算,大家会比较朴素的实现要高效很多,而且它可以比较好的去处理这个,就是在大规模的这个DPEP的这样的一个分布式的架构底下,呃,是一个比较容易扩展的一个状态。
然后这个其实是相当于K3,它后来放出来之前在博客里没有去详细讨论的一个技术。这个是其实对QB的一个比较必要的一个实现方式。呃,归根结底就是奶牛的实现它基本上是不可行的,所以必须去用一些比如工程上可行的方式,然后去把这个比较精确的解得出来。然后到二点四了,那微这vision这块对其实没啥好说的。它主要讨论的一个点就是是否有必要就用用一个已有的vision
encoder去做这个ViT vision encoder的一个数字化。
用已有的ViT的话,当然它对用已有的vision encoder,比如说用Cleve Two这样也比较大规模训练的一个vision encoder,它的好处就是它你收敛的会比较快。但是这个Kimi K3它中间讨论的一个问题就是,如果说直接用这个Ciklepy
initialize的话,它的这个模型的不稳定性会比直接native train它是要来的大的,也不一定是模型不稳定的,因为不稳定它是一个比较相对,甚至它不是一个严格被定义的东西。
只是大家可能会一般会去看 gradient norm 这样的一个分布,然后中间有一些东西是大家比较 concerned,比如说它的单词多不多,然后甚至说它这本身 norm 大不大。呃,这个团队会发现,就是如果说我们直接 from scratch 训练,可能会多用一些算力,但是至少第一个就是它的最后的结果它是不会有损的。
如果我们经过恰巧的训练,它不会带来更差的结果,对吧?甚至可能会带来。差不多,甚至更好的结果。对,第二个它主要claim一点就是原模型会带来一个更好的兼容性,那就会体现在呃这个gradient的norm会更加稳定。呃,我觉得这个其实可能有一个类似的观察,就是就就就是Cleve它其实是用Adam来去训练的。
之前大家其实也讨论过一个比较相关的话题,就是用 Adam 训练的模型对吧?是否能用 MoE 去反定?然后反过来就用用 MoE 去训练的模型是否用 Adam 去可以使用 Adam 去反定?当然最后的结论就是肯定是比较原生的方式,它肯定是最好的。当然用别的方式的话,如果想达到一样好,可能就得做一些处理,或者说它是有一些限制。
所以说可能对于这个 Kimi K3 而言,他们是希望去采用一个全 MoE 的一个优化方式,这样的话对于模型整整体的这个训练的这个。稳定性也好,它的兼容性也好,是一个更优的状态。说到这里,我们倒回去讲一下最早那个线性注意力机制的问题吧。为什么K3它用的是纯线性注意力机制,它没有用任何的sparse attention?
就是线性注意力、全注意力和这个sparse attention,你可以三选一和三选二,对吧?对,呃,就是为什么不用sparse attention,我们就会带来一个点,为什么要用?用了会有什么好处,或者说会有什么问题?这个其实一方面是跟模型架构有关,另一方面其实也跟这个模型它每带这个这个GPU硬件的一个feature有关。
比如说这个 DeepSeek 三点二那种 DeepSeek Sparse,它一个是这个三点二用了,一个是那个 G L M G L M 五,呃,也用了 Deep DeepSeek Sparse,它是这这样一个架构。也就 deep sparse,其实到到最后在 decoder 里边,其实加速是特别特别小的。
原因就在于说,就 sparse 求 index 这一步,它是相当昂贵的。而且在 Blackwell 的硬件当的情况下,越先进的硬件,它其实这个 overhead 是越大的。甚至其实在 decoder 当中,这种 sparse attention 的一个方案,它其实甚至呢跟这个 full attention 并不会带来一个显著的一个加速。
为了解决这个问题的话,当时这个 G L M 团队做了一个工作,叫这个叫 index cache。他当时的做法就是把这个求解 index,就是求解哪一部分哪些 token 需要算 attention,呃,这样的一个计算操作,然后把不同层之间共享了起来,呃,就比如说每四层、每八层,然后做一个共享。呃,只有用这样的方法,它其实才可以比较有效的去减小这个 sparse 本身带来的开销。
只有 sparse attention 呃本身开销足够小的情况下,其实才能带来一些比较可观的一个算法的上的一个收益。啊,然后 sparse attention 这块其实我们也做了一些相关的工作,也大概是一个类似的结论。当然,我们做的更极端了,我们在 UQ 的架构上直接取 library sparse attention 的话。
因为我们之前的KV Cache是ones的,所以我们当时采取的方式就直接把Sparse Index这步也做成ones,也就是说我们把每层的这个Index开销直接分摊到这个所有层上。那这样的话,其实那个开销就会特别特别小。这样的话,我们才能吃到这个Sparse Attention本身的一个这个计算收益。
对,然后我们再回到Kimi K3,为什么它不去采用?第一个就是我们认为说,呃,就是每层都用sparse特征这样一个比较简易的方案,它其实在black wall上它的收益是特别特别小的。呃,为了解决这个问题,无论是这个index cache的解法和我们的解法,其实结论都一样,就是我们希望呃把多层的这个sparse的一个结果,然后来去跨层来进行复用。
然后跨层的方式呢,其实呃比较简单的方式就是相邻的层去跨。然后相邻的层去跨层的话,其实对于 hybrid attention 就对于线性注意力和全注意力这样 interleaved 的方式的话,呃,它其实并不是一个显然的,因为对于这种 hybrid attention,呃,对它不同副
attention 它并不是挨着的,它每个副 attention 中间它其实隔了很多个线性注意力的,呃,所以说就是在隔很多层线性注意的情况下,就是这种 index share 是否有效,呃,加速比是否足够高,呃,这个其实是相当 question 的。
呃,然后其其实前有个问题就是 sparse attention,它基本上是没有办法进行 from scratch 实验的。呃,就是 sparse attention,大家现在一般采用的都是这个 post train,然后从 full attention 进行转化的一个方式。不排除这Kimi
K3可能未来会把已有的这个full attention的部分,呃,然后来去进行这sparse attention转化。
那当然,如果他们用来MLA的话,这个会更难一些。所以说,我觉得主要就两个原因,一个是想拿到实际加速比,就是其实对于这个 hybrid attention 来说,是一个 non-trivial 的东西。就是如果想拿实际加速比的话,可能需要做更多的事情,对吧?第二个事情就是它跟 pretrain 它并不是一个比较兼容的状态。
所以说这个其实呃留一个接口之后再做也行就。我刚才讲的这些,呃,不管是架构创新,还是训练,还是推理工程,你觉得它中间有哪些 trade off, 有哪些取舍?我觉得 hybrid attention 它主要的 trade off 就是你要去调节这个线性注意力和全注意力的比例嘛。就你肯定比例越大,就是负线性注意力比例越大,它肯定加速比较高嘛。
但是如果你想达到一个偏无损的一个呃加速状态,就是一一个比较无损的状态的同时,想获得加速,然后三比一就是一个比较就实验上就是一个比较work的方案。对这块儿其实就是一个主要的一个trade off。Sparse它严格来说它肯定大概率是不会带来更强的表达能力的,所以这块儿其实就是另一回事儿了。它其实跟hybrid它的架构它其实是另一条线,对吧?
只不过说,如果对吧,如果你坚持不用这个hybrid的话,那你可能就不得不采取一些别的方案。我听到这里的感受是,就是现在的模型训练好像没有一个巨大的所谓的范式创新,但是它把之前很多的工作都融合起来,然后再去寻找一个可能的更优解。我不知道这种感受对不对?对,我觉得其实问题不大,就是我觉得不完全是技术的原因,是为什么呢?
就是因为大家现在都叫传送门,但什么是传送门?这个其实是其实是没有办法清晰定义的,对吧?这个哲学上还有一个对吧对应的概念,就是泰修泰修斯之船嘛,就是你刚开始对吧?二零一七年这个船刚开始行驶的时候,对吧?是传送门,对,但是这个船刚开始是怎么拼起来的?它是attention加recycle对吧?这些东西或者说对这些东西拼起来,包括这个。
包括 stack layer 这种方式,它其实并在传送门之前,它其实也并不是一个全新的概念。所以说这个船对吧,刚建起来的时候,我们认为这个这个传送门是一个慢速中,但是这个这个船呢,已经行驶了对吧,八年九年了对吧?在就是在这个船慢慢行驶的过程中呢,对吧?我们会把可能会把慢慢的把某些部分换了,某些部分换了。
然后其实我们现在看对吧,到二零二六年,其实跟传送门已经对吧?我觉得像素已经很低很低了,就是你是否还把这个东西叫做传送门?呃,这当然这个是哲学上的一个问题,但是其实从现在大家来看的话,大家还是会叫。呃,但是我觉得就如果说历史的走向如果有些不同的变化的话,可能也就不叫了。我们上面讲的这些,你觉得它总体来说是一个什么样的工作?
我觉得这个东西很难定义,因为首先它跟有时候它是一个偏综合性的工作,就是它严格来说就是一般大家来一般大家会把比较有创新性的单点突破会专门拿出来去专门去做讨论嘛。其实之前也考虑过,也之前也专门讨论过来。然后中间其实比较大的就几点,对吧?第一个就是注意力怎么设计,这这个这个是一个点。第二个就是 MV 这块儿对吧?
有没有一些更好的设计?然后第三个是优化器,然后第四个可能就是中间的一些连接方式。这个其实专门这个其实,比如说你放到这个你放到 Roast Net 时代,其实其实这些专单拿出来它可能就是一个架构了。对对,我觉得在 Roast Net 时代它肯定是这样的。就但是其实在 Transformer 的时代它可能并不是这样的。
但是你可能你把这个东西综合起来,它可能你最后再把它跑出来它才有意义。因为之前大家做架构,就比如说大家在这个 ImageNet 上跑这个足够高了,它其实就是一个 Mausdon。呃,但是大家在这个时代,你想把这个实际的东西跑出来,你的要做的东西就特别特别多了。你得做这个 scaling
的验证,然后你得把这个各各个工程东西搞定,你得把 data 搞定,然后把这些东西都搞定,然后你把这个配分或者说你把这个架构卖出来,大家才会 buy in。
当然,我就从研究方面,我觉得我 personally 我是不会太去关注的,因为我觉得架构的验证它是有一个,我觉得是有严格的标准的,或者说不需要就把这个这些东西卡不在一起。但是我觉得从非技术角度,它现在是一个这样的状态。理解,所以上面是Kimi这篇论文的一些亮点的突破,对吧?然后接下来他开始讲他的预训练和后训练的工作。
呃,对,我觉得架构方面这块,相比于K二,对吧?至少不一样,对吧?也不一定叫创新,对吧?有些叫创新,有些叫这个比较偏偏调优的部分啊,我觉得还是比之前呃大不一样的。你觉得为什么K二到K三变化这么大?我觉得是个战略的问题。其实K二在那个时间点,他们也可以不一样,只不过他们当时主要的重心是把模型跑出来。所以在K二到K三这个中间,他们有更多的时间去做了很多的优化调整。
我觉得主要是K二它本身是做的不错的,包括的包括K二大家可当时他们主要考虑的问题,比如说怎么把模型训出来,对吧?怎么怎么有效的把模型scale上去?因为当时K2就是One trillion嘛,就是当时One trillion的话还是比之前的,比如说比DeepSeek V三还是要大一些的。其实,在那个时间应该也是一个比较相当大的一个模型了嘛。
所以当时他们解决的是这样的一个问题:先把这个,先把先把Base model整体的一个这个pipeline做稳,然后在这个稳的基础上的话,然后后来这个K3,然后再去追求一些这个更精益求精的一个优化,就是。你从上面的这些亮点工作,就是这是最后的结果嘛?你反推你能看出这个团队的整体的状态是什么样的?我我觉得看怎么去定义,对于不同团队定义是不一样的。
说如果只是Kimi的这个架构团队或者预训练团队,我觉得没什么变化,就是我觉得一直就是一个样。就是但对于整体公司而言,还是有这个战略性的侧重的。我觉得侧重点就是K2,当时Kimi的团队主要的诉求还是把这个base model这个东西做稳,就是先把能力做出来,就然后然后先不去考虑这个更高的efficiency也好,更精益求精的创新也好。
当然了,他们团队内内部内部是一直在做的,只不过你看是你什么时,有什么时候这个亮出来。就是研究工作是一个更长期的工作嘛,他可能要看放在哪个模型里,跟他一起结合。对对对,好的,那接下来我们是预训练。对,接下来后面其实就是一些对,因为 pretrain 和 posttrain 的话,首先 posttrain 的它是一个偏工程或者说偏具体的场景的一个东西,这块可能就会不会讲太多,因为它也没有写太多。
然后 pretrain 和 posttrain 的话,我觉得主要是一些经验性或者说一些能耗的东西,主要创新可能是前面多一些。对,然后中间会有一些比较,我觉得比较有意思可以讨论的点,我觉得可会我会专门拿出来去讨论。就是后面主要的风格会是这样的。然后我们就一个一个来。跟又唠的话,我觉得一个比较值得讨论的点就是用哪样的这个 learning rate 的策略。
因为 learning rate 的策略的话,其实刚开始就是 mini CPM 当时那个 paper 提出的的 WSD mini CPM 之后,对吧?呃,Kimi K3 之前,我觉得几乎可能所有团队都会都在用这个 WSD 的一个优化器。呃,因为这个这样的一个优化器,我们可以去学习 mini CPM 当时他们是怎么去考虑这个问题的。
简单来说,就是WSD考虑的一个问题就是,如果我们如何能把这个这个data schedule和这个learning schedule结合起来。首先,这个MiniCPM刚开始讨论的问题就是WSD,然后和这个CoT Dk,它们是可以取得一个对比较相近的一些结果。比如说,我们从一个更高的学习率到一个更低的学习率,中间怎么去调配,它对最后的结果其实是影响是没有那么大的。
所以在这种情况下,这个 mini CPM 的团队这个工作的认为,就是中间具体的这个 DK 的方式对结果不是影响特别大的。呃,既然具体抵K的方式对于最后的结果影响没有那么大,然后这块我们就可以跟Data
Pipeline一些联动的方案,对吧?因为在实际训练中,我们还是会发现,对吧?包括在这个图里,我们可以看到,就是在抵K阶段的话,这个模型Loss的这个衰减速度还是比这个大的这个学习率稳步去跑它的这个Learning Rate的下,就是Loss的一个下降速度还是会大很多的。
所以说,就是之前大家会认为Cool Down这个阶段,它其实是模型学习最快的一个阶段。所以说,呃的这个 Mini CPM 当时采用的策略就是,既然呃库档这个阶段是模型学习最快的状态,那我们为什么不把更多的这个更好的数据,然后去放在这个库档这个阶段,然后来去做训练?这样的话可能会取得比这个所有
data 均匀分布,然后所有 learning rate schedule 也均匀分布,然后可以取得一个更好的效果。
然后这个是当时这个 Mini CPM 包括 LWSD 提出的这样的这样的一个背景,我觉得这个还,我觉得这个还是这个挺有意思。我觉得一方面对吧,他讨论了一个一个 natural 的问题,就是为什么我们要采取不同的这个 learning rate decay 的方式,然后 learning rate decay,一个是为什么要这么去做对吧?
另一个就是它不就 decay 的不同阶段,它具体承担。什么样的一个 role,然后他们利用这个用这个不同 learning rate decay 阶段的一个行为,然后跟这个 data 的具体的策略,然后来去结合,这样最后可以取得一个更好的一个结果。然后 Kimi K3 这块的话,其实他们讨论了一个不太一样的事情,就是我们为什么他们为什么不去用 WSD 的这样一个结果?
然后这个其实在 WSD 之后的一些 paper 里也是可以去讨论到的。因为WSD它除了这个可以用更好的data schedule,它还有一个额外的好处就是,就因为前面的learning rate它其实是无变化的。也既然它不去变化,就是它跟你整体要训练的loops和token量是无关的。哎,因为它是无关的,所以它所以说我们可以更自由的去在这个模型训练的过程中去选取我们最后实际的config。
呃,比如说我们刚开始可能预定的是要跑实体token,呃,但如果我们跑了实体token,呃,跑到中间对吧?说比如说这个训练策略改变了,或者说公司的策略改变了,或者说我们要更早的发版或者更晚发版,呃,然后WSD这样的一个优化器呢,我们就可以更自由的在中间来进行切换,而不用在刚开始就把整个模型要训的token量定死。
对,然后这个它其实是这样的一个好处,但是它其实带来的一个问题没有讨论,就是我们虽然可以去任意的去选择这个你实际要跑的头根数,但是你实际的 learn rate 是和是和你要跑的头根数是是有关系的。比如说你要设六一负四,把六一负四作为一个比较稳定的一个 schedule。你跑十T,呃,可能六亿浮子是最优的。
你可包了,你跑二十T,可能就是三亿浮子是最优的。所以说,从最优的角度考虑,呃,对任意去扩展token数,它可能并没有大家想的那么有效。然后这块儿这个Kimi K3的这个paper其实就讨论这个问题,就是说,基于就WSB它实际的schedule。它的这个调节的难度其实和这个V T
K呃是一样的,而且它可能并不一定的并不一定好去调整,就任意去选取,呃最后训练的投肯量这个事情也不一定只有W S D才能做到,对,我们可其实用别的方式也是可以做到的。
呃,这个paper里可以写到,因为这些原因,其实他们可以选择一个更简单方案,然后cosine decay它的方案就是它它其实更好调。就它只有两个变量,这一个就是你要跑多少头跟,然后你要一个就是你的那个 maximum learning rate 具体设多少。呃,但是你如果 WSD 的话,它就其实就会多一个变量,就是你要 Dk 的这个比例具体是多少。
所以说从调参的角度来讲的话,cosine Dk 是一个更容易去调参的一个方案。所以说,呃,Kimi K3 他们在 paper 里就写到,如果说他们是因为这个发现这个 cosine Dk 它是更好的去能找到一个。Hyperparameter setting的话,他们最后会采取一些,也可以算是一个比较经典的一个 learning it decay 的方式吧,而且这个其实是。
大家都用这个 WSD 的情况下,一个不太一样的赛艇,然后一个是基于一个不太一样的 learn rate scheduler 策略,然后当然了,Kimi 团队被对比了从 K2 到 K3,然后整体的一个 scaling efficiency。首先 K3 比 K2 大了很多,对吧?也从一 T 左右到了二点八 T,总参数得从一 T 到二点八 T 到大了不到三倍吧,然后。
激活量是从三十二点六B到一点零四B,对它其实是比三倍要更多的。它其实从模型参数上毫无疑问,它是比Kimi K2强很多的一个模型。然后中间它有一些别的一些config,当然这个主要是上面表的一个总结。最后他们团队给出了一个scaling loud的一这样的一个结果,K3比K2最后的在scaling efficiency上是二点五倍的这样一个量,对吧?
但是它从对当然。对于一个简单的dense model,它的这个scaling efficiency是一个比较经典讨论的问题。它这个之前很多open AI的scaling law,呃,central scaling scaling law,包括一些比较新的scaling law,其实都讨论过这样的一个问题。
啊,当然这块其实比较注意的一点就是,大家其实也问过,说就是Kimi K K二到K三的这样的一个scaling behavior是不是固定data的?我记得他们的回答是应该不是,而paper里应该没有直接写是不是。当然也可以理解对吧?K三和K二它用的data肯定不可能是一样的嘛,所以我觉得这块大概率应该是有一个不一样的data recipe。
这个整体的这个scaling behavior它其实一个是综合那个模型架构,也也综合了一个模型的recipe training recipe。然后再叠加上这个模型的这个呃这个数据策略之后,总的一个结果,然后总的结构作为一个大的一个综合的一个结果,是比这个K二的要高了很多的。OK,然后接下来是这个长上下文。
长上下文的话,因为K3是一个原生去支持一万命令长上下文的一个模型。然后这块其实比较有意思的点就是,这位置编码如何去选取?我们从刚开始比较传统的这个Transformer的架构来去做的话,大大家都会用RoPE来去做位置编码嘛。但是如果用 RoPE 的话,它在这个长文扩展的时候,它有一个问题,就是呃 RoPE 的这个具体的一个参数是需要做调整的,是吧?
如果不做调整的话,这个 RoPE 直接去扩长文就会显得没有那么有效。然后这个是其实是这个 RoPE 时代大家一个经典的做法。但当然说,如果现在如果你还是用一个全注意力,或者说如果你不引入线性注意力的话,这个策略不会有太大的改变。也就是说,你还是得去在不同的长度的setting来说来去调调节不同rope的参数。
但是这个事情在这个混合模型里是可以改变的。最早是这个考菲尔团队的一个工作,主要讲了这样的一个因素。呃,他们的结论也很简单,简单来说就是因为这个hybrid的attention排布方式对于linear attention来说,它已经引入了这样的一个这个位置信息。无论说你用这个 rope 也好,
rope 加斯莱尼 window 也好, linear attention 也好,就是在线性注意力的这样的一个阶段,其实位置信息是已经被引入到的。
呃,所以说如果在这个 setting 下,就是在 hybrid attention 的 setting 下,如果我们可以把这个 full attention 从 rope 改成 nope,也就是说在全注意力的情况下把位置编码去掉,它其实是可以带来一个更好,一个是可以带来更好的一个模型的表现。呃,第二个就是它在这个长上下文是更容易扩展的,也就是说 nope 它是在模型扩长的情况下。
不需要调整任何模型架构的参数就可以达到一个长上下文的这样的一个效果,这个效果无疑是很优雅的,因为我们会觉得模型架构的这个参数选择当然是跟这个具体的长度是没有关系的,然后也没有任何的这个理论去支持说就是我们具体我们为什么要去这个不同的这个长度 recipe 下,然后来去采取不一样的参数,然后这种架构其实就可以有效的避免了这一点。
一个是刚开始我比较早的看到,然后可能看到第二天我就去复现了一下,因为我当时看了就觉得特别有道理,然后我第二天复现了一下,然后对也很work。我当时觉得这个肯定这个在混合注意力的一个里里边比较好的一个方式。呃,我对我在会议里边还是审到了这篇文章,当时我直接给了一个strong
accept。我感觉我这几年可能也都没有给过几个 strong sample,因为我觉得这个确实是一个很有效,也是一个很优雅的解决方案。
然后,当然这这个也可以,对不对?讨论一个大家之前理解错误的一个问题,就是 rope 它本质上它带来的是这个 recency bias,就是 rope 它 work 最有效的点就是对它对 short context 的这个。建模能力是特别有效的,但是他其实对长文来说是没有帮助的,甚至是呃有负面影响的。
对于某一些这个舆论观点会认为这个是RoPE在引入了这个长文的这个表现,这个其实是错误的。就RoPE它并不带来任何的长文能力,它甚至是损害长文能力的。所以说Kimi K3会把这个RoPE在长在在这个长上下文的这个负荷特征这块直接下掉,然后直接下掉之后就会一个是如果你直接侧外推,就直接侧外推它都会好很多。
如果用RoPE的话,你扩长度你需要调参数嘛?如果如果你调了参数你不去训练,对吧?它那个结果其实是很差的。所以说,如果有Nope,你不用调参数,它的外推效果也很好。然后长上下文的这个效果也没有任何问题,甚至还要更好。它其实是一个在混合注意力的一个context呀,呃,是一个相当优美的解决方案。所以说,这个Kimi K3也用了这样的一个解决方案。
然后 post training 的话,首先其实可以讨论的一个问题就是,低梯度这个训练应该在什么阶段去引入?然后这个其实大家采取的策略是不太一样的。就比如说 Deepseek V3,他们是刚开始是原始 FP8 来去训练的,然后。DeepSeek V4他们就直接用这个W4A8来去做延迟训练的,但是Kimi这块采取的策略不太一样,对吧?
他们是首先用高精度去训练,然后在SFT阶段,然后再把这个低精度的这个QAT引入进来的。像至少我就有两点值得讨论,对吧?第一个就是从项目而言,就抛开技术角度,从整个这个项目的管理而言,大规模的训练才去更高精度,肯定是一个更保险的方案,呃,对不对?因为它无论如何也不会错,对吧?如果用高精度训练在这个大规模的scaling中带来了其他问题的话,我觉得这个是一个相当不可控的一个因素,而且这个东西。
呃,更大规模的训练是很难,就是提前被充分验证的特别精确的。呃,我觉得第一点就是从项目管理的角度的一个优势,第二个优势就是从技术角度,对吧?我们是否有必要从刚开始就用低精度训练?起码从我的实验而言,应该也是没有必要的。而然后Kimi可能他们发现也是没有必要的。也就是说,对于低精度推理而而言,本身就是从from scratch刚开始就引入,并不会带来任何模型能力的一个提升。
也就是说你。WCA八你在什么时候引入?只要你过了一定量的训练,它它最后的结果可能都差不多。所以在SFT阶段引入是一个更保险的,然后在技术上也也不会带来额外损失的一个方式。对,然后 R L 这块的话,因为 R L 其实也是对,因为 Kimi 刚开始它其实对 R L
这块是一个比较充分的一个,因为咱们其实从很早以前就比较重视 R L 这块,所以说从 Kimi K 一点五到 K 二点五,他们其实一直在做一些比较持续的创新,然后其实,在 K 三这边也会,呃,对比较充分的引入进来,然后这些其实都是一些比较对比较成熟的成熟的一些方案了,这块就不太展开去讨论了。
然后四点一点三的话,这块可以讨论一下O P T。O P T刚开始也是董老师团队这边比较早去讨论的一个方式,就是研究院的对啊,微软研究院的董立对。然后零点L M这个是玉贤做的,玉贤去年也是清华特奖嘛,就是这个是他在董老师在研究院这边去做的。然后其实O P T从刚开始就刚开始大家用起来和其实和后面大家实际在工程中用的方式不太一样,这个其实可以讨论一下。
就是O P D刚开始的motivation是什么?后来大家又是怎么做的?当时这个O P D讨论的contest是这个蒸馏,蒸馏有两种,就一个是黑盒蒸馏,黑盒蒸馏就是大家现在比较采取的方式嘛,就拿一个A P I,然后我们不知道模型内部的状态,我们也拿不到这个模型就是就推理的logit。对于这个外界来说,这个模型它完全只是一个黑盒,我们只能拿到它的这个输入和输出。
然后这个叫黑盒蒸馏,然后白盒蒸的话就是就是另一种蒸馏方式。我们可以获取到这个模型本身,然后我们也可以任意的去拿到这个模型推理的过程中我们想得到的任何的一个状态。然后在这个场景下,就我们如何去做这个蒸馏,然后是我们是否可以在基于比黑盒蒸馏更好的一个表现。然后 Mini L M 当时采取方式就是反其道而行之,因为之前大家采取的方案就是让模型就让 Teacher 去生成。
答案,然后然后再把这个生成的答案用 SFT 的用 forward KD 的方式把它引入到 Student 的模型里,然后 Mini MM 是反过来做的,也就是让学生去生成答案,然后让 Teacher 做一个每步的一个纠正。然后直观来讲的话,其实就有两种,一个是老师讲课,老师讲课,然后你把这个老师讲课的结果学进来,然后第二个就是你自己去做答案,自己去做题,自己去呃写这个中间的推理过程。
然后老师会把你中间呃推理哪里做的不对,然后给你指出来,然后然后告诉你怎么去做。这个叫这个 reverse KL。然后 reverse KL 的话,这然后后来这个 thinking machine lab 另一个名字的话,就就叫 on policy distillation。就是大家会意识到这个是一个比较有效的一个,从蒸馏的角度是一个比较有效的方式。
就是说从就我们不直接去学习模型的答案,而是在 student 自己的推理过程中,让让教师模型逐步的去 verify 或者说去纠正学生模型的这样的一个推理的方式。然后这个范式呃刚开始其实是是为了这个蒸馏来去使用的。无论是你做白盒的一些实验性的这个,包括说从公司的角度,你可以有一个 pro
的版本,可以有个 flash 的版本,然后 flash 的版本你可以用 opd 的方式,然后来去蒸馏更大的模型的这样的一个结果,然后从而去获得这个更好的一个表现。
你如果 from scratch 是吧,训练一个 flash 的模型,你可以比这个 flash 的模型获得一个更好的表现,呃,从而在这个比较对比较便宜的模型这一档,然后获得一个更强的竞争力。这个是这个O P D刚开始的一个motivation,但是其实后来大家更常用的一个方式不是去做蒸馏,原因在于其实原因在于,如果你想做蒸馏的话,你至少得有一个大模型,然后你再去训练一个小模型,对吧?
如果你自己训练自己的模型而言,呃,但是如果说你想去蒸馏这个,比如说对吧,蒸馏一些呃黑盒的模型,这套方案是完全不可用的。从公司或者说从这个项目策略上来讲,如果我们不去基于一个大模型,然后来去这个训练一个更快、更更小的一个小小模型,呃的话,因为现在大家都都不是这个setting嘛,大家都一般都是这个搞一个旗舰模型,然后就完事儿了,然后来去它作为inference服务。
然后在这个场景下的话,就不存在大到小蒸馏的这样的一个行为了。然后大家逐渐去采用的蒸馏的方式,就是自己蒸馏自己。呃,然后为什么要自己蒸馏自己呢?我觉得也,我觉得还是两部分对吧?一个是非技术层面的,一个是技术层面的。我觉得从非技术层面的原因的话,我觉得这个技术可以让这个整个这个Post Training Team的管理变得更加简单。
因为Post Training核版它其实是一个比较heavy的一个东西,因为因为Post Training它不跟它跟Pre Training不一样的,Pre Training我只要把数据合起来,然后一块去干就完事儿了。但大家一般Post Training的话会用一些更复杂或者一些更先进的一些训练策略,而且这个这些策略可能会不太容易去那啥,可能会如果在直接去做核版的话,可能会有一些难度。
所以说,基于项目管理策略的话,on policy distillation 它其实就是一个比较好的策略,能把整个这个 post train 的 team 的管理变得简化一些。然后从技术角度的话,比如说大家训 RL,RL 它一般有不同的策略嘛。比如说你训 mask,它可能就是个这个 variable reward。
然后你如果你有些 preference 的一些需求,你可能就就会有一些 reward model 来去做。然后对吧?如果你再想扩展这个 RL 别的能力,你可能你可能每个能力对于 RL 来说,它它的 reward 的它都是一个独特 reward
的。然后你如果想把所有的模型的所有的能力都搞在一块,因为poshion一般大家都会这个专项呃专项突破嘛,然后你想把直接专项模型的不同的这个这个reward直接拿进来一块对吧一朝会它其实是比poshion的难度要大的,我我也不是说完全不可能啊,还是还是有可能的,呃,但是O P
D的话它就会变得很简单,我们可以把这个不同的reward model或者说不同的reward范式,然后简化成不同的模型。
然后简化成不同的模型,这个事情就容易很多了,因为对于R L策略或者说对于这个data来说,它是一个高度预构的一个状态;但是对于模型来说,它是一个高度统构的状态。因为现在我们也不会为了不同的任务去专门设计不同的模型架构。如果模型都长这样的话,我们在做一个multi teacher的一个核板,这个这个就会容易很多。
不过这个也不是K3首先去用的,这现在大家这个是一个大家现在比较widely accepted的一个做法。我印象里应该这个小米啊,这个JLM啊,应该大家现在都是这么去。对,然后这个 quantization 这个刚刚讲过了,然后 draft model 这块其实我觉得还是挺有意思的,这块还是可以额外去有一些很延伸的工作的,对,因为我觉得这块Kimi K3目前优化的不是很完善。
之前小美他们推出了一个能达到一千TPS的一个方案嘛?那个主要是用了两个技术,一个就是太遥亮团队,然后他们做的一个可以高度融合不同阶段的一个算子,然后这样的话,其实它可以获得比这个传统的这个。VLM推理方式强很多的这样的一个推理效率,然后那个可能达到三四百TPS,然后小米是个基于太流量团队的那个一一个结果,然后再加上那个基于太RT的一个结果,然后再加上那个Deep
Flash这个投机推理带来的额外的加速比,最后能带来一个比原模型强很多的一个对很强很多的这样的一个推理速度,然后这个其实主要的服务是对于一些成本可以付出更高的成本,但是想拿到更强的一个推理速度的这一波用户去做的,因为它本质上如果说你。
呃,是为了整体的 throughput 的服务的话,这个其实它的收益会小很多。但是如果你是小 batch size,但是大的 throughput 的这套方案是会强很多的。然后这样的话,就是抛开 PaRT 那方面的贡献,然后这个最后就落到了如何去做更好的 MTP,或者说用做更好的 draft model。
然后这块的话,有一些有历史脉络的工作。然后刚开始就是一过三或者MTP,呃,一过三和MTP它其实的它主要的方法就是因为刚开始 speculative decoding 你这个提出的时候呢,大家还是用一个呃没有关系的小模型,然后来去 spec speculative 比较大的模型。然后这样的话,它它其实有一个问题就是你无法充分的去利用大模型中的一些 hidden state。
如果说你可以利用大模型中间的hidden state的话,你其实就可以把小模型做得更小,或者说你在相同的参数底下,然后你的接受率做得更高,最后可以带来总的更强的一个推理效率。然后MTP和一个Three,然后它其实都是这样的一个思想。当然,MTP呃,如果从from scratch的话,它还有一些别的好处。
然后 DiffLash 的话,它其实会更有意思一些,对,因为它联系了传统的 language model 和去年比较火的 Diffusion language model 这两条脉络,然后通过 DiffLash 这这条线结合了起来。对,因为因为 Diffusion language model
它刚开始提出的时候,这个大家主要的 claim 就是 Diffusion language model 在这个单用户或者说 batch size 比较小的情况下,呃,可以获得比这个可以获得比传统的 language model 快很多的这样的一个推理效率。
呃,对,但是 differential language model之前最大有两个问题嘛,对吧?第一个问题就是它,比如说如果 from scratch,它的训训练的训练效率不够高,它的整体的结果很难和这个传统的 A R 的 language model 相去匹敌。然后第二个问题就是它只能打 throughput,就是它只能打这个小 batch size 的 throughput,但是如果是多用户。
最后追求总的 throughput 的一个场景呢,它其实这个 diffusion language model 并没有优势,呃,所以 DiffLash 当时主要就是统一了这两者,就试图去利用 diffusion language model 更快的一个推理方式,然后进一步,呃,去优化这个 MTP
或者 draft model 这块的一个呃加速比,最后可以得到一个更优的总的一个单用户的 throughput。
啊,当然了,就是 MTP 这块其实是。呃,之前我对我跟陈建,就是也就就是那个 DeepFlash 那个同学也交流过,他当时提了一个点是,对于整个模型是很重要的,就是即使我们用 DeepFlash 这种更先进的这个 draft model
的策略。它跟预训练的关系仍然是很大的。呃,也就是说,对于draft model来说,我们它是需要利用这个大模型的一定的这个推理能力的基础上,然后再去使用draft model进一步的去扩大。
也就是说,对于MTP来说,MTP。是需要给这就是就在 pretrain 阶段需要给 MTP 提供一个接口,然后这个接口会对下游的这个 draft model 的提升会特别有帮助。然后这部分其实是需要在这个 pretrain 的阶段就引入的。然后当然了,draft model 也是需要做一些 fine tuning,它是需要做一些自己特化的处理的。
比如说我们可以用一个 KL loss,然后来去替代这个比较传统的这个 last token prediction 的 loss。这样的话,我在原猫的 Wi-Fi 的过程中,它可以对得更齐。这样的话可以进一步的去提升 draft model 接收的一个效率。对这块儿,它我觉得之后还会有一些更深层次的工作啊。
我猜哈,就因为这个肯定不是对于 MTP 的一个重点。然后后面这个 RL task 的话,它是一个比较 specific 对于不同的。任务来说,它有不同的具体的一些策略。我觉得这块的话,只要看原文就好了。对,然后接下来的一大块就是infar。对infar这块的话,首先现在其实对于模型架构的设计来说,关键的设计它是需要和这个infar进行一些co design的。
一个是 code land,然后一个就是模型架构本身,它会影响整体的 inference 它本身的一个设计。然后这块包括跟那个 deepseek,呃这一系列的 inference,它是有一些设计上的区别的。这块我觉得也是一个比较有意思的一个点。然后首先就是 KDA,对吧?KDA
之前对在在前面其实已经讨论过了,因为我们如果想去这个追求更高的一个上课的效率,然后我们是需要呃对KDA的衰减系数做出一定的限制的,这样的话我们可以用一个更好的kernel的设计形式,然后来去带来更强的一个kernel level的一个效率。
然后这块其实多的一个点就是KDA的这个CP,KDA的CP是一个,我觉得只有linear它的CP其实是一个可以简单讨论一下的一个点。因为比如说,对于 sliding window 或者说对于 four attention 而言,其实 CP 它其实从概念上是相当容易的。呃,因为比如说你对于 four
attention 来说,比如说现在有些比较经典的算法嘛,比如说你可以用用润 attention,或者说用 zigzag attention。
因为它是它本身的这个计算模式是够简单的,而且它很多地方是省不了的。我至少我得把这个跨GPU的这个所有的KV Cache都拿到一个GPU上,然后来去做计算。我对这块是一个相对来说比较简单的一个概念,但是对于Linear Attention的CPU而言,它它的概念其实是一个更复杂的。然后这个大的框架其实我们还是可以回到最经典的一个 chunkwise recurrent。
就 chunkwise recurrent,首先我我们都同意说 chunkwise recurrent 对于 linear attention 来说是一个必备的算法。然后对于一个正常的单机的一个不开 CP 的一个这个训练场景来说,chunkwise recurrent
它其实就有两部分。一个就是你可以拆成,比如说比较小的十六 tile 或者六四 tile 的一个上壳,然后上壳之间,然后使用这个呃递归的方式去去计算,然后上壳内部的话,可以用一些比较 parallel 的方式去。
去计算,然后KTA也是这么做的。然后KTA的那个DK的限制主要是解决这个创客内部的一个可以用parallel计算的一些高效性。然后这样的话,就是对于单机的这个linear来说,就是一个创客内部用并行的方式去计算,然后创客之间用串行的方式去计算这样的一个计算的pattern。但是呢,就对于CP来说,我们就需要讨论它的一个linear
attention比较呃有意思的一个范式,就是它这个chunk本身对吧是可以任意去拆分的。
也就是说,不同的chunk的数字,就比如说你想五幺二个token一个chunk,或者说八k token一个chunk,它在数学上是完全等价的。这个就跟早年一些比较拼接式的方案,比如说有一些工作会尝试这个chunk之间对吧用。用 linear attention,唱可内部用 full attention。
如果用这种策略的话,它的这个唱可的大小就跟你具体的模型的这个 architecture design 是有关的了。但是纯 linear attention 其实是无关的。既然是无关的的话,我们就可以对这个唱可的层次做出一个比较任意的处理。比如说对于单机来说,它唱可是一步去拆分的,我们就这个十六 tile 去拆分,然后十六 tile 内部用一个并行的方式去去计算。
但是它其实并没有限制说你唱可只能拆一次。它的思想就是,比如说我有一个 one million 特别长的一个唱可。然后我们可以这个我们拆可我们可以拆成八K放一张卡,八K放一张卡,这样的话我们就构建了一个以大创客为单元,然后不同GPU之间,然后采取异构计算的这样的一个创客的拆分方式。然后我们拿到这个八K的这样的一个拆分方式之后,我们可以在这个内部进一步去拆分。
就在 linear attention 的时候,我们没有任何的限制,说一个 chunk 中间是如何去计算。因为如对于一个比较小的 chunk 而言,这个 parallel 是一个比较优的实现。但是说如果我们拆 chunk 足够大的话,我们可以采取这个 chunk 套 chunk 的方式,然后来去进行计算。
也就是说,呃,对于 linear attention 的 CP 而言的话,我们是做两一个层次性的 chunk。我们首先是在这个不同机器上做一个上课,然后在一个机器内的话,我们再在 kernel level 然后做一个上课,然后通过这样的一个双层上课的形式,然后组成一个对于 linear
attention 一个比较大的 CP,然后这个呢 work 主要还是就是来源于说就是唱 linear attention 的唱可以任意拆分的一个特性,然后这样的话可以带来就是 linear attention 的一个 CP 的一个方案,然后这个其实是对于这个 full attention
不太一样的一个处理方式,这个是可以讨论一下大家。
然后接下来是呃上面这个这个是 CP 或者说 kernelized 的一个 infra 的方案。然后接下来的话,其实就会讨论,就是从这个分布式训练的一个角度,然后我们如何去优化它的分布式的这样的一个方案。然后这块的话,我们后面就可以发现,其实它跟DUC的方案是稍微有些区别的。然后这个区别是主要是来源于不同MoE的一个架构的一个方式。
然后首先的话,五点二点一这部分。Kimi 团队带来了一个基于 DPP 进一步延伸的一个 EPP 的一个计算方案,然后他们的主要的 claim 的一点就是,对于传统的 EPP,因为我们现在都用那个 DropPlus EPP,DropPlus EPP 就是对于每一个 token
而言,我选哪个专家它是不受整体的一个约束的,就是我想选哪个选哪个,然后这样带来一个方案,我们汇总起来之后会发现不同的专家它的负载是不一样的。
然后,既然它是不一样的,它就会带来一些问题。对吧?第一个问题就是对于一批而言,因为每个GPU它分到的头棍数不一样,头棍数不一样的话,它就会带来它的整体的这个执行时间不一样。然后执行时间如果一旦不一样,它就会互相等,互相等就会浪费这个模型的这个会会浪费G P
U的这个算力,这是第一个问题。第二个问题就是,如果我们不同的卡上的它的那个头阵数是不确定的,然后对于这个G P U的通信来说,它会额外多一个阶段,就是我们首先是需要告诉呃所有G P U,就是你要接受多少头阵,它再把这个头阵发过去。
所以基于这两个阶段的话,传统的E P它它严格来说当然不是一个最优的一个方案的。如果完全为了infra,它最优的方案就是这个带job的E P。也就是说,我们每个 token 然后要去受到全局的一个影响,然后受到一个全局的影响的情况下,我们可以通过一系列的一个 allocate
的方式,从模型的角度让每个 expert 都受到完全均匀的一个 token,然后通过模型的方式,然后让它达到完全的 balance,完全理想的情况其实就是这样的。
所以说,如果在这个 infer 的层面完全均衡。然后是一个最优的话,从英法的策略就是我们努力把英法从呃非最优导上一个最优,然后同时保持模型能能力是不下降的,因为因为如果drop投肯的话,大家现在都不会用嘛,因为它那个对于模型损失对模型能力损失还是相当明显的。然后这个,然后MoE EP它它就采取了一个,我觉得是一个比较高端的一个方案,它把模型的这个这个EP的方式所变成了一个更动态的一个方式。
就是它是它是可以计算出,比如说,呃,之前的一个经典的方案就是我,比如说我有一百二十八个专家,然后我我如果一批大。如果我们一P八的话,可能每张卡放十六个专家的话,呃,它是一个比较静态的一个方式。然后MoE一P的话,它采取的是一个动态性的方式,就是它有一些冗余的专家,然后通过这个额外冗余的专家的话,然后它从数学上是可以证明说我我存在一个策略。
可以使得就是我们只需要增加一个小比例的荣誉专家就可以保证这个头根数的完全对齐的。然后我感觉像是一个比较经典的数据结构与算法的一个问题,这个是可以证明到的。然后他们可以证明到这一点的话,他就可以得到一个结论,就是我们通过少量的荣誉专家就可以。达到就是所有卡上都均衡的这样的一个效果,然后具体如何去达到,他们采取了一个这个
online planning 的方式,然后这样的话呢,我们去提前去这个规划,就是哪些卡应该有哪些荣誉专家,然后在这种情况下可以达到不同的这个对不同卡上这个就是从token数的的一个完全的一个均衡。
当然,即使说你从卡的角度是均衡的,它并不代表专家层面是均衡的,因为这个算法它只是保证了所有每一张卡,对吧?每张卡的这个它的这个所有的头门数是一定的,但是它并不保证这个每个专家是一定的,因为一张卡里有多个专家嘛。那如果说你还想保证这个每个专家的这个都是一定的,那就没有办法了,那你就只能采取这个有损的一个策略去优化。
这个可能如果大家是不希望的话,呃,这个上限可能就卡到这里。所以说我们在这个两个中间可以采取,就可以找一些更优的一个处理方式。这块是这个Kimi团队带来的一个比较有意思的一个创新。接下来就是这块,就是memory的finetuning。我觉得这块比较有意思。就首先他们带来了一个从软件工程的层面,这个比较简单的一个方案,就是我们可以去更细粒度的去控制,就是哪个呃每个部件就是应该去采取这个activation还是去采取这个offloading的一个策略啊。
然后这块不一样的一点就是。呃,Kimi K3它采取了大规模的这个 offloading,对,把中间计算得到一个结果 offloading offloading 到 CPU 上,然后这个其实是一个 non trivial 的一个东西,因为理论上如果想想满足这个 offloading 不拖慢这个模型的训练,它是有一定的条件的。
你得保证这个CPU和GPU之间的通信,它满足的某个不等式,这样你才有那个完全这个用计算overlap做通信的一个可能。然后为了达到可以做offloading的话,然后Kimi
K3它把所有的可以offloading的东西都用FP8去存,这样它可以省一倍嘛?对吧?省一倍,它可能才能从呃,一个边界,然后跨到另一个边界,然后具体这个边界怎么算,这个就跟具体的这个卡这具体具体环境集群环境也跟具体的模型config是有关系的。
然后后面的话,它一方面他们是需要去优化这个attention residual它本身的一个infar的关系的,这个其实在attention residual的paper里其实也讨论过。然后我觉得PP这块其实它,我觉得一个是PP,一个是那个通信的overlap的手段,这个其实跟DeepSeek是不太一样的一个方案。
呃,因为首先,比如说从DeepSeek V3的角度而言,它它采取了两个不太一样的,至少是non-trivial的一个呃方式,对吧?一个就是这个比较细粒度的MoE角度的overlap,MoE角度的overlap,就是因为首先就是MoE中间有两个通信嘛,有两个通信,它是一个是dispatch,一个是combine。
然后这两个通信它是 overhead 是比较大的,其实,在这个 Blackwell 上它其实又不太一样,但是无论如何,它是一个比较大的一个开销。然后 Deep DeepSeek V3 的话,它一个是在 MoE 的 overlap 这块,它会拆的特别细。然后具体的方式,它就是会把这个MoE上一个batch的MoE的forward还有backward和下一个MoE的forward。
把它俩融合起来,然后通过重排序这个计算的一个先后顺序,从而达到这个把所有的这个大的这个 dispatch 和 combine 的计算,然后这个 combine 的 dis dispatch 和 combine 的通信这个都都藏起来。呃,然后想达到这点的话,其实是需要特别精细或者也也特别复杂的一些这个软件工厂的一些优化的。
这个其实在这个 Microsoft Core 里边也讨论过这样的类似一个事情。因为这个事情,如果想做的足够好的话,我们需要把这个所有的 forward 和 backward 的计算从原子计算的层面就拆开,然后是手工进行重新排布。我觉得这个还是有一定的难度的。然后另一个就是这个 DeepSeek V3
采用了一个这个 do pipe 的策略,也就是为了去缓解这个 PV 的气泡和这个不同的 activation 不均匀的方式,然后他们去采取了 do pipe 的一个训练。
的一个PAP的排布方式啊,当然后面除了DoPAP还有个DoPAPV,对吧?但他们达到的效果是一样的。对它从逻辑上会更简单一些,对吧?起码从公开的他们写到的里边,Kimi
K3是没有采取采用这两个优化方式的,他们采用的其实是一些别的方式。然后第一个就是如何去隐藏通信,这个就跟实际的模型架构的选型有关系,对,因为Kimi K3它采用了那个latent MoE嘛,呃,因为latent
MoE它本身是极大的降低了通信开销的,所以说它在整个的计算开销里边,它其实是减小了特别多的,因为它的通信开销减小了特别多,所以其实如果想把它overlap掉,就会变得容易很多,就是我们没有必要再去跟。
另一个batch的计算来去做overlap,我们可以采取这个一个batch内部更简单的overlap手段,就可以把这个通信很好的隐藏掉。然后Kimi K3它具体采用的方式是把这个MoE的前向和后向的通信跟shared expert的计算这个overlap在一起,因为shared expert现在绝大多数都有嘛,也而且shared expert它是有一定的计算量的。
然后正是因为这个通信的开销减小了。所以说它才能被这个 shared expert 的一个比较简单的方式去这个 overlap 掉。但是呢,如果你用传统的 MoE,它的这个同一开销就会特别大。特别大的话,你用 shared expert 的去 overlap 就很难 overlap
掉。呃,所以说,如果你十二个expert overlap不掉的话,你就必须把另一个batch拿进来,这样你才能完美的把通信都隐藏掉。
我用不一样的这个MoE的架构,然后带来了不一样的一个这个overlap的一个策略。然后这个策略它带来一个好处就是推理的这个critical path的latency它是免费的。然后从训练架构上的话,就是我们因为通信量更小了,我们就可以采取更简单的一个策略。然后来去排布这个对排布通信的一个细胞,然后其实还有个另一个问题就是,我们即使通过更复杂的方法去完美的把这个通信去强调,它其实也不是完全无损的。
因为即使是完美的去通信和计算隐藏,计算也会相对的去慢一些,它不是完全可以无损的。然后针对这个问题,DPEP也做了类似的优化嘛。DPEP的优化方式就是用一个足够少的SM的占用来去获得更大的一个整体的通信的 throughput,从而才能让这块的这个 overlap 跑得更快。所以说这块是一个很不一样的一个设计方式。
然后另一个设计方式就是PP的处理其实是不太一样的。因为如果用 dual pipe 或者用 dual pipe v 这样的一个 pp 的一个排布方式的话,它其实不同对不同 pp rank 之间,它相对还是一个比较对称的一个状态。如果你用单向的 pp 的话,它其实就不太对称。它然后不太对称的话,就有两种解决方式嘛。
第一种就是让它变得对称,呃,第二个方法其实就是 kimi 这个 paper 里讨论到的,我们可以把不均衡的方式然后 transfer 掉。因为比较朴素的PP的话,比如说前面的这个PP rank,它会进入的更早,它会积累的batch就会更多,它的这个activation的压力就会越大。然后Kimi
K3采用的方式是,它把就是memory占用比较大的一些PP rank,然后直接传,直直直直接让它存到这个呃比较小的一个这个PP rank上,然后通过这种也是比较lightweight的方式吧,然后去规避了更复杂的一个多pipe的一个设计方式。
然后在后面的话,其实就是 Muon 的一些优化,因为 Muon 它是需要这个全矩阵去那个做这个牛顿-舒尔茨迭代的嘛,所以说如果用传统的这个 Adam,因为 Adam 它相当于是你是把这个所有参数都摊平,然后之后才去切的,然后因为 A Adam 是这个 element-wise 优化,所以你怎么切它都不会影响这个模型的一个优化的一个结果。
呃,但是对于 Muon 来说它是有影响的,因为我在某个 rack 上我是需要把一个矩阵所有的参数都去保存下来的。呃,所以说这块的话需要做一些处理,才能让应用比较好的去在 optimizer 这个角度去切起来。对,然后多模态这个 infra 也是一个比较有意思的一个点,因为其实从 infra
的角度,就纯的 language model 它其实是以呃,当然了,大家呃,想把它优化的足够好的,也是需要相当多的 effort。
这刚刚也讨论了很多。但是,其实对于多模态而言,你每引入多模态的一项功能,它的 inference 难度其实都是直线提升的。这块的问题就是如何去把微身影扣着做好。微身影扣着做好的话,这块呃,它提出两个问题。第一个就是我们对于现在的这个微身影扣着的的话,大家是会对这个微身影扣做一定的压缩的。比如说你这个微身影token最后输入到这个大模型里边的话,它可能是八k token。
但是你输入之前,它可能是三十二K token,也就是说,微信语库的接入模型的过程中,它其实是有做一个压缩的。那但是这个压缩在这个微信语库的内部是没有做的,所以说它在微信语库的内部计算的时候,它就会更长。所以为了解决更长的一个问题,可能你如果对于金蛋,对于呃模型主干不需要开CP的话,你可能就对于vision encoder它可能就需要开CP,所以说这块它是就需要做一些额外的infra的一个处理。
然后PP这个就更有意思了。PP这个大家其实注意到一个问题,就是我们做这个VL native training的时候,VL的token它其实只是有一个比例的。也就是说,你对于某些对,你对于某些卡来说,它是一个纯文本的一个状态;然后你对于另一张卡,它可能是一个全序列的一个VL的这个比例相当大的一个状态。
如果是这种情况的话,你还是会出现一个对不同卡不均匀的一个现象。然后这个现象呢,它不仅会影响DP,它PP也是会去影响的。呃,因为PP的话,我们是首先是要保证不同PP之间它是一个比较均匀的一个状态,这样它的流水线才能打得足够满。呃,不然的话,如果我们在这里引入了一个新的微生以后的。第一个PP,它就它的这个计算强度就会显著去增强,它就会破坏整体这个流水线的一个打满的一个状态。
然后为了去规避这个行为呢,Kimi K3这块采用的一个方式就是把PP不去放在这个PP的刚开头,它是会放在中间或者尾巴上。然后所以在在前面的PP。对,在前面的这个微生引扣的这或者说比较浅层的language
model做的过程中呢,中间的pp它是闲置的,它就会把中间闲置。这部分利用上,提前把这个微生有codeer后面的一些步骤提前算出来,然后通过这种方式去规避掉这个呃第一个PP带来的足够大的一个气泡,然后这个是一个在PP的层层面需要做的一个优化。
哇,他这篇论文真的写得好详细啊!呃,是的,就是这些细节东西其实是需要去处理的。就如果你不处理的话,就是你写出来,大家就觉得对吧?这个事情肯定也没有问题,可以去这么做。然后有一些没有写的部分呢,大家就会去这个追求。如果有些团队的这个组织密度没有那么足够,说我我自己就能把这个事情搞定的话,大家就有一部分人就会沉迷于小道消息嘛,呃,大家就会私下里打听,对吧?
这些东西到底是怎么处理的,对吧?如果你写出来这个事情,其实就对大家就不需要去找小道消息了。嗯,哎,如果他写出来再复现难吗?我觉得一发上的事情本质上没有什么难的,因为它本身就是个高度确定性的东西。我觉得所有一发上的事情都本质上它是一个确定性东西,但是你如果想自己提出来的话,它就对你本身分析profile的方式,或者说对于你本身这个组织密度,或者说就是你组团队氛围,就是有比较高的一个要求。
呃,但是你如果说就整个infar团队比较好,你还是可以自己搞出来的。但是你如果不行的话,你就尝试去follow一些就比较好的一些工程实践的practice。但如果这个事情都都搞不赢,那我觉得就可能就不太应该了。前面主要是就infar大家主要就分三部分嘛,对吧?一个是pretrain,然后pretrain的话,前面主要是讨论了一些。
大规模分布式的情况下,一些比较复杂的一些优化方式。然后后面的话,一个就是后面的话就是两部分对吧?一个就是RL,然后还有一个就是inference。然后RL的话,因为它本身就是涉及大量的inference的,所以在这两个中间呢,其实是有一些overlap的。然后L它本身一个对不太一样的点就是它它需要对三大规模的sandbox会有一些比较细的一个要求,对,但这个其实就算是一个更工程的一个东西了。
这块的话,它其实就是一些比较细的处理,如何去处理不同的sandbox。对于LL的task来说,你每一个trajectory它可能都对应一个它自己的docker嘛。所以说,就如何去管理大规模docker,其实是这块比较麻烦的一个问题。然后上面这块的话,我觉得这个Kimi K3这个比较有意思,就是它会时不时给你蹦出来一些比较有意思的东西。
对,我觉得这块儿比较有意思的东西,当然也不一定是刚开始就是他提的了,这块儿可以省一个 gradient buffer。呃,对,这个这块儿相当于是一个比较 tricky 的一个东西,因为对于一个完整的 AI 来说,它有好几部分的 model 嘛,对吧?它比如说你至少你你至少有一个主
model,然后你还有一个 reference model,然后你主 model 它还有对应的一个 gradient 和 optimizer。
当然,如果你还想做这个 reverse model 的话,它还会再多一个 model。然后然后其实这块儿的话,它就会多特别特别多的 model。然后这个 Kimi K3 这这块讲的一个比较有意思的事情。呃,就是它不同 model 之间,呃,因为你放一个
model,它对于这批来说,它还是很大的一个这个 memory 嘛,所以说它这块相当于是把两部分 memory 就拖到一块了,就对于 reference model 而言的,然后他们发现它可以跟 gradient buffer 来去合起来。
因为首先,等 reference model 它是没有梯度的。然后在你求 objective 的过程中呢,你是没有 gradients。等你有了 gradient 之后呢,然后你可能这个 reference model 就不会去用了。对,所以说它这块用了一个 gradient buffer reuse for for non policy model for forwarding。
然后这块是一个对比较有意思的一个东西。然后剩下的我就感觉出一些比较常规的处理方式了。然后我觉得 inference 目前不会有太多的一个东西,因为主体的这个 inference optimization 它其实是 VLM 或者 SJ 这些的专门讨论的一些内容。然后这块它其实讲的就是对于 Kimi K3 架构它所带来的增量,就是在这个现代的这个推理引擎中是如何去处理的。
对,然后首先就是呃,首先就是会带来就也就 linear attention 它在这个现代的这个呃,inference engine里它有一个麻烦,它有一个麻烦就是它prefix cache,它是一个比较麻烦的一个点,因为对于full attention来说,它相当是于是每个位置它都有一个cache嘛。
啊,所以说你可以任意就就是你下一个位置的开始,它一定是上一个开始的一个简单的一个增量。呃,所以说在这种情况下,就是 prefix attention 会对简单很多。但是对于 linear attention 来说的话,它会有一些,它会有一个比较麻烦的特性,就是 linear attention 它每一步它是需要它是会在原来上一步的这个 kv 开始的基础上,它是做一个复写的,也就是说对于每一步而言。
它的这个 prefix state 它其实都是不一样的,所以说如果我们把每一步都存起来,那其实零点二三三的好处就完全没有了。但是你如果完全不存的话,你就完全没有办法去享受到这个 prefix cache 所带来的好处。对,然后这块它这块的话,就是对现在目前对于这个 linear attention
它的一个采用的策略,就是按照 block 去切,就是我每个 block 去做一个那啥,去做一个这个 prefix caching。
然后同样的话,我们还需要另一个 long term 视角的点,就是 vlm 这样的一个 page kv
它的一个实现方式,从工程上或者从从概念上,它最简单的一个分布上方式,它是不考虑层和层之间的异质性的。所以说,其实从去年还是前年,就是如果想直接在这个BLM里去引入混合架构的话,它在Infer上并不是一个容易的事情,而且因为现在Infer三这越来越heavy了,所以说如果简单的一些改法的话,会把整个这个Infer三这搞得特别特别的乱。
当然,现在这个Infran三者可能都有一些比较先进的管理方式了。但是这个就是需要去特殊处理一下,就是把这一个是一个就是把不同的Tenant Pattern去结合起来,对,因为对于Four Tenant来说是按配置管理的嘛。但是对于Linear Tenant或者Sliding的话,它它是不能按照配置管理的,因为它并不存在一个长久的一个。
对于 token size 而言的的一个这个 kv cache 的一个产生方式,这个本身对于 vlm 的设计来说,它其实是,呃,需要做一些兼容性的处理的,然后。我觉得后面就是一些就是适配性的一些优化,因为底层电力优化它其实跟 prefill 或者说跟 training 不太一样嘛,所以说这块的话就对于每个环节都需要做一些额外的一些 kernelized 的一个配置。
呃,但我觉得这块应该对我觉得这块都是可以去做的,而且对我觉得应该是一个确定性比较高的一个事情。然后后面就是 evaluation 了,我觉得 evaluation 这个没啥好讲的。就是好呗,特别好,就是在每个环节都好,然后后面主要就是这样的一个状态,然后应该就没啥了。觉得K3让你最impressive的地方是哪里啊?
个人而言吧,我觉得impressive一点就是他们把这个激活搞得特别特别大,就足足有一百 billion,比我预期的还是还是要大一些的。这个依赖的是什么能力呢?呃,这个不依赖任何能力,就是你具体定多少激活,这个本身它不是一个技术性的东西,就看你想到达到什么阶段的一个效果。我觉得Kimi K3它还是比较有魄力,就是在已有的开源模型这个菜的基础上,他们要提升一个数量级。
所以我刚刚就说,他们比上一代的激活其实是多了三倍多的。我觉得这个决定是一个非技术性的一个决定,但是这个是要一定的魄力的。嗯,因为杨志林喜欢说有概率的非共识,你觉得在K3上能看到他们的什么样的different dots或者说创新?我觉得也没啥,因为有价值的技术创新他们都单写了一个paper了,所以这个K3刚出来的时候,我主要就surprise这个size,别的我都不合我预期的。
嗯,就是你刚才给大家也展示了好多他们历史的paper,其实中间就已经发出来对吧?但是他把它优化到了一个更大的模型上。对我其实的一个观点就是,科学研究是不存在节约性的提升的,只是说大家习惯把这个技术的渐进性提升的某些节点会成为一个 milestone。我我其实一直是这么认为的,技术永远是慢慢去提升,然后靠靠这个公司里的所有人、项目里所有人,包括整个业界的同学一块去推动的。
所以我觉得从这个角度没有什么 milestone。有人说Kimi的研究方式相对比较科学,你觉得这个你认同吗?你怎么解释?首先我是认可的,呃,但具体认可的方式的话,我觉得首先我觉得这个主要是来源于他们内部的一些管理方式吧。呃,当然的,有些公开大家都知道的,就是Kimi其实是公开里边大家认可的最强调这个模型内科的一个团队。
就Kimi他们一直尝试去让这个pretraining变得更加的科学,比如说让不同的行为的trace。可以一些更可靠的方式去获取到,然后呃让比如说模型的不稳定性或者说模型collapse这个现象可以更明确的一个去归因,所以他们所以所以他们其实一直去强调这个模型内科的这样的一个case。对,我觉得这个其实是他们科学化的一个体现吧。
我觉得这个其实没有任何问题的。我觉得科学对应的就是不科学嘛,就是什么是不科学的。我觉得这个事情就是讨论清楚,大家就知道什么是科学的啊,什么是不科学的。我觉得不科学的方式就是,如果从整体项目的角度,你想去推一个东西,你想证明端某个东西是有效的,我觉得这个东西不存在任何疑问,因为学术创新或者说你从学术论文的管理的角度,我觉得这个大家都是有明确标准的,对吧?
你得有明确的ablation,你得有足够的变量的控制,你得用更科学的方式去说明,呃,你这个东西是有效的。我觉得这个大家都是认可的。然后为什么不科学?对吧?不科学就是呃,对吧?基于某些利益需求,然后把科学的方式都干掉了,那这就是不科学。我特指任何技术。我一直强调的就是,我觉得Kimi这个团队非常团结,然后非常的能把劲儿往一处使。
如果是大家是这样的磨题方式,你的判断方式自然而然就是科学的。因为最近也是V四发布的时间嘛,啊,K三和V四,你觉得他们的区别是什么?能不能做一些对比?呃,我觉得不同层面吧。我觉得从模型定位也好,然后从这个。刚刚咱们比较详细的讨论的在infer上的一些区别,然后从模型角度层面的话,我觉得目前区别还是比较大的,我觉得完全也不是一个东西嘛。
啊,我我觉得其实比较好的一个case就是Deepseek现在出了两档嘛,一档是这个一点二T的,然后另一个是一个更小的size。然后Deepseek我觉得目前还是更强调一个性价比的,就是他们其实那个flash那个模型做的还是挺好的。但K,我觉得他目前主要的精力还是尝试去提升开源模型的一个能力的上限,而不是去考虑这个模型的这个,也不是完全不考虑嘛,至少说你模型的性价比不是一个最首要的一个考虑条件,对吧?
当然也可以看到,对吧?现在K3的A I相当贵,对吧?比别的模型贵多了。呃,照这个趋势发展下去,Kimi和G P U会分化吗?呃,我觉得技术层面的东西,只要大家不笨。都是知道什么是好,什么是不好的。我觉得组织团队的走向则取决于人的选择。我觉得就是这么简单。我觉得技术上这个东西不存在太多 debate 的,好就是好,不好就是不好,这个是有明确的客观标准的。
但是对于组织而言,对于人而言。这个是比较模糊的。你觉得K3相比之前的所有模型来说不一样在哪里?它有架构创新,它创新性更强吗?呃,我觉得两方面吧。我我觉得从技术的层面来说的话,我们可以讨论很多很多,就是它中间的有一些对吧,有一些创新也好,有些trick也好,这个对于技术同学而言是可以去讨论的。但这个东西是不是成为里程碑?
它是个非技术的问题,所以说它最大的变量是你最后的一个能力。对 DVC 给 V3,我觉得呃,比如说它那些比如 R1 这些东西,我觉得这就是锦上添花。我觉得最大的问题就是它其实是国内第一个,对,把模型结构到一定程度,并且把然后全流程打通的。对,因为在 K3 之前,对吧?可能最大的就是那么千问七十二 B 嘛。
这个其实是从模型 size 上一个比较大的飞跃,因为有有 size 它才有智能,对吧?所以说这个 K3 对吧?你把激活多了三倍,对吧?把模型也扩大三倍,它就是下一个 level,我就是这个就没有任何问题,就是。所以它核心是
size。有效的scaling,对,确实是这样。对,这是个完全是一个靠团队来去做起来的东西,因为你把模型增大,最简单,如果纯规模来看,我就把把模型把几个几个几个数字调大一点,我就可以达到一个更大的size。
呃,但这个不解决任何问题嘛?从技术上来讲,它不是一个太大的一个创新嘛?因为你扩大模型size,它本身不是创新,你把这个东西做work,它中间才有创新,就是。觉得新团队现在再去重做一个模型,还有时间窗口或者机会吗?我觉得如果这个团队足够好,这个团队的氛围足够好,然后单兵作战能力足够强,是有机会的。但这个条件我觉得大概率是不存在的,所以说后面的创意事情也就不存在。
嗯,为什么不存在?因为好的人其实已经进去了,还是怎么说?我觉得好的人和好的组织文化想达成,我觉得是有历史的局限的,就是就是你不是想达成就能达成的。就氛围这个事情真的是有点虚,很难去描述它。呃,我觉得也不虚,我觉得就是取决于这个 leader 的 taste,就是或者说 leader 的性格是绝大多数影响到整个团队的氛围的。
我觉得 Kimi 有一个特点是,所有人好像都不怕杨志林吧?呃,对呀,为什么要怕呢?对吧?有道理你就有谁有道理谁说了算嘛。所以它还是一个非常集体的一个工作,它不是一个个人的工作,它不依赖于个人英雄主义。对的。嗯,哎,你觉得未来的模型的发展方向,你有没有什么预测?比如说,半年之后、一年之后,模型size毫无疑问还会继续扩大。
我说一下我的判断啊,我的判断比较暴论。我的暴论就是大模型可能没有他本人的创新了,后面都是一些改良性的进步。然后他会做到一个什么样的水平呢?做多大size对应的是什么样的性能呢?我觉得这个重要的就是大家去定义什么能力,去定义一些,只要大家能定义一个能力,就就能去达到。因为大家之前定义的方式,比如说就是强口令、A类的口令这些东西是清晰定义出来,然后大家就可以去做到。
这个取决于大家怎么去定义这个能力,或者说从商业化角度大家注重什么能力。只要他能清晰定义这个任务本身,他的能力就能够达成。对,我觉得如果是纯language的,应该没有太大问题。它能达到所谓的AGI吗?我觉得AGI最大的问题就是它没有被well defined,所以只要能够定义它就能达到,后面对是一系列的优化工作。
对,当然,如果说,对吧?你定义A G I,对吧?是具身,对吧?是这个是真实物理世界交互,我觉得这个事情肯定还是gap是更大的。但是如果你还是在这个language model的这个scope里讨论问题,我觉得问题不大。啊,你觉得它最后会是一个多大的模型呢?还是说它是无限大,无限往上叠上去?我觉得这个事情肯定是不可能的,对,因为因为首先就是对预训练的这个数据量,包括说我们已知的,对吧?
人类对吧?我觉得从抽签来讲,就是人类互联网上能集结到的所有的信息量,这个是有限的,这个事情是不可能无限提升的。基于这个case来讲,从数学理论上,对吧?你想吃掉一个足够大的数据量,你模型不可能是无限的,没有必要是无限的。所以从这个能带来一个更宽的棒的。然后这个宽的棒呢,可能上下会更啊。然后更窄的棒的,就是在什么情况下,就是我们对于模型具体在任务上的一个感知可能会没有那么充分。
然后这个是一个更窄的一个棒的,或者说如果未来有更难的任务,它必须有更大的size,那可能就会退化到更宽的哪个棒子里,我。对,但是我无论如何不可能是无限的。你觉得它会最后有多大?这个模型现在 scale 到了 2.8,以后呢?必元的肯定还是有更大的嘛?目前,呃,所以如果想完全 match 必元的,肯定还是可以再大一些的。
但是更大的话,这个就不确定了。你现在为什么去探索世界模型了?我觉得这个主要是一个 personal 的一个东西,因为我觉得这个大模型不存在太大的,对吧?太太太大的改良空间、改进空间,没有大的突破,对吧?就没有大的这个,对。