一家应用公司,开源了自己的训练内核
8月4日,Cursor研究院把一个名为Mixture-of-Kittens的CUDA内核开源了,Apache 2.0协议,代码直接挂在GitHub上供所有人下载。仓库里不仅有内核源码,还带上了单层基准的复现代码,任何人都能在兼容的硬件上验证它的性能主张。单看这条消息,它只是无数开源项目里不起眼的一个,但仔细看看发布方的身份,就会意识到这件事的份量完全不一样。
Cursor是做AI编程助手起家的应用公司,不是芯片厂商,也不是云服务商,它连自己的算力都要向别人租。在AI融资最疯狂的年代,应用公司最值钱的是模型效果,内核这种底层细节通常被当作可以外包的苦力活。一家应用公司把自己训练模型的看家内核拿出来白送,这在两年前的AI行业几乎是不可想象的,那时候应用公司的护城河还是模型本身。
更反常的是它给出的成绩单:在同样的GB300 NVL72机架上,端到端训练吞吐提升了百分之四十一,从每块GPU每秒760.9个token涨到1070.2个token。这不是发布会PPT上的目标值,而是它生产环境里连续跑出来的实测数据。对一家估值靠产品说话的公司来说,公布这类数字等于把自己内部的工程水准摊在阳光下接受检验。
而做到这一切的核心手段,用一句话概括,就是把MoE层原本被拆开的通信和计算,重新焊接成一个完整的、确定性的单一内核。这句话听起来轻描淡写,背后牵扯的问题却深得惊人,值得把它一层层拆开看。从应用层一路挖到CUDA层,这种下沉速度本身就是行业竞争烈度最直观的注脚。
MoE层:训练时间的第一黑洞
先回到一个经常被忽略的事实:对大模型训练来说,MoE层早就不只是一个普通的组件了,它是整个训练流程里的时间黑洞。Cursor官方博客写得很直白,在不同的负载和配置下,MoE层可以吃掉端到端训练时间的一半以上,这个比例高得让人意外。原因并不复杂:专家路由让每个token只走少数几条计算路径,算力需求降下来了,但token的归属却变得高度动态,谁也说不准它下一秒该去哪块GPU。
这个比例看似夸张,逻辑上却完全成立。MoE模型把前馈网络拆成几十个甚至上百个专家,每个token只激活其中少数几个专家,计算量确实省下来了,但代价是token必须在GPU之间频繁搬家。于是训练系统不得不为每一次路由结果安排一次数据搬运,搬运的次数越多,通信占的比重就越大。
搬家的成本在单卡训练时代可以忽略不计,一旦进入GB300 NVL72这种整机架互联的场景,跨GPU的通信开销就会迅速反超计算开销。训练日志里最常见的画面,就是GPU利用率不满,算力在空转,数据在路上堵车。数据在路上堵车的时候,再快的计算单元也只能干等,这是分布式训练里最经典的资源浪费形态。
传统的优化思路,是把通信和计算分开打磨:通信部分交给NCCL、DeepEP这类专门库,计算部分交给cuBLAS、Transformer Engine这类算子库。两条线各自都优化得极强,但拼在一起的时候,接缝处总有漏风的地方。每次内核切换都要付出调度、同步、显存读写三笔账,账目虽小,架不住MoE层一天要跑成千上万轮。
什么是MoK:一个把整层焊死的巨无霸内核
MoK的全称是Mixture-of-Kittens,跟MoE的命名开了一个温柔的玩笑,但它做的事情一点都不温柔:把MoE层一次完整的前向过程,从token分发、专家计算、结果汇合到全部网络通信,全部融进单个CUDA内核里执行。在CUDA的世界里,内核是GPU上执行的最小程序单元,一次MoE前向在传统写法里要连续启动十几个内核,每个内核完成一小步,数据在显存和寄存器之间进进出出。
典型的执行顺序是:先做路由计算,再按路由结果分发token,然后各专家并行做矩阵乘法,最后把结果收回来汇合,十几步操作环环相扣。每两个内核之间都有调度和同步的开销,这些开销单独看都不大,合在一起却足以吞掉可观的训练时间。
MoK的做法是让一个巨无霸内核从头跑到尾,中间不退出GPU、不经手CPU调度、不产生内核启动的间隙。所有专家计算和所有通信,都在同一段代码里按照确定的顺序完成,像一个精密装配的流水线。CPU只在两头露个面,中间全程由GPU自己接力,省下的不仅仅是启动时间,还有每一轮交接时的隐式同步。
正因为它是一个确定性内核,同样的输入在任何一次运行里都会产生完全一致的执行路径。对训练来说,确定性意味着可复现,意味着出了故障可以精确回放现场,这对数万卡规模的生产集群是性命攸关的特性。这种特性在推理侧叫稳定性,在训练侧叫可诊断性,两个词指向的是同一种工程能力。
瓶颈的真正来源:内核边界不是免费的
为什么把内核焊在一起能快这么多?答案藏在GPU的工作方式里。内核与内核之间的边界并不是免费的分界线,每一次内核启动、每一次同步、每一次CPU介入,都是真金白银的延迟成本。内核启动本身是微秒级的开销,单独看微不足道,但乘上MoE层一天上亿次的执行次数,就是实打实的训练时间。
MoE前向尤其吃亏,因为它的通信模式是典型的全对全:每个专家可能收到来自任意一块GPU的token,每块GPU也要把token发给任意一个专家,这种模式天然就是碎片化的。全对全通信在系统里对应的原语是all-to-all,它在网络拓扑上的流量模式最散,也最难被局部优化吃掉。
碎片化的直接后果,是GPU大部分时间处于半空闲状态:算完一批分发要等通信回来,通信完成了又要等下一个内核被调度上去,计算单元和网络单元永远在互相等待,谁也不肯先干完。利用率曲线因此变成锯齿状,每一个低谷都是一笔被浪费的电费和机时。
Cursor实测过这个等待到底有多贵。在它的生产环境里,仅分发和汇合两个阶段的信令开销就要103微秒,在微秒级优化的世界里,这已经是一个大得惊人的数字,相当于好几轮内核启动的时间。103微秒里既有握手信号,也有同步等待,还有缓冲区的管理开销,每一块都被Cursor的团队逐一量化过。
两份成绩单:2.37倍与1.41倍的差距是诚实
MoK发布里最值得玩味的地方,是它同时公布了两组数字:单层基准的2.37倍,和端到端吞吐的1.41倍。两者差距巨大,而恰恰是这组差距,让它显得比大多数发布更可信。愿意把层级的漂亮数字和端到端的朴素数字一起摆出来,本身就是一种工程自信。
2.37倍来自MoE单层的MXFP8前向基准,对比对象是业界公开的最快方案,包括NCCL加PyTorch、DeepEP加PyTorch、DeepEP加Transformer Engine,以及英伟达HybridEP加Megatron的四种组合。MXFP8是英伟达新一代浮点格式,在精度和吞吐之间取了平衡点,能在它上面拉开差距,说明内核的调度质量是真实的。
但MoE层只是完整训练步骤里的其中一层,它再快,也快不过整条流水线里的其他环节。单层的2.37倍摊到全流程之后,变成端到端的1.41倍,这是符合工程常识的换算,也是诚实发布该有的样子。这个换算关系,恰恰是很多性能发布故意含糊过去的细节。
对外行来说2.37倍是新闻标题,对工程师来说1.41倍才是真相。一个在真实规模上把吞吐抬高四成的内核,比一个只在单层基准上翻倍的演示有价值得多,因为它经过了生产的检验。生产环境里的每一个百分点,背后都是真金白银的GPU账单。
| 方案组合 | 组成 | 单层前向相对性能 |
| NCCL + PyTorch | NCCL集合通信加cuBLAS计算内核 | 公开基线中的最慢档 |
| DeepEP + PyTorch | DeepEP通信路径加cuBLAS内核 | 低于MoK |
| DeepEP + Transformer Engine | DeepEP加TE融合算子 | 低于MoK |
| HybridEP + Megatron | 英伟达HybridEP加Megatron内核 | 公开基线中最快者 |
| MoK | 单一确定性megakernel | 比最快公开基线快2.37倍 |
通信压到18微秒:拉取分发与推送汇合
MoK把信令开销从103微秒压到了18微秒,降幅超过百分之八十,靠的是两招组合:拉取分发加推送汇合。分发阶段由接收方主动拉取自己需要的token,汇合阶段由计算方直接推送结果,数据流向和信息流向被彻底解耦。这套组合拳的本质,是把原先串行的通信步骤改成并行的数据流,让GPU的多个引擎同时干活,而不是排队等活。
传统实现里,分发是一个推的动作:发送方把token推给专家所在的GPU,中间需要大量的握手和确认信号。MoK反过来做,让接收方按需拉取,发送方只负责把结果推回来,中间的冗余信号被成批砍掉。一拉一推之间,通信链路上的无效往返被压缩到了极限。
另一项关键设计是环形token缓冲区。传统实现里token缓冲区的管理需要CPU参与,MoK让缓冲区在GPU上自行旋转,既不丢token,也彻底移除了CPU与GPU之间的同步点,这是去掉内核边界后的自然红利。缓冲区像一条环形传送带,token流上去又流下来,全程不需要外部干预。
这些优化叠加在一起,在512张GB300 GPU的实测里,端到端吞吐从每卡每秒760.9个token提升到1070.2个token,整体提升百分之四十一。在已经高度优化的生产栈上还能挤出这么多,说明之前的瓶颈确实被精准命中了。通信被计算完全覆盖之后,GPU的空闲窗口消失了,利用率曲线从锯齿状变成了一条平滑的高位直线。
重叠粒度之争:中间值才是最优解
为什么MoK不直接复用现有的通信计算重叠方案?因为重叠也有粒度问题。Comet走的是细粒度重叠,DeepEP走的是粗粒度重叠,而Cursor团队论证,最优解在两者中间,而且取决于具体的工作负载。粒度太细,调度开销反而压过收益;粒度太粗,通信又藏不住,两头不讨好。
它给出的启发式规则很具体:每个按专家分组的GEMM,至少覆盖两个完整的SM wave。SM wave是GPU调度里的一轮完整执行波次,两个wave意味着计算量足够把通信完全藏在计算身后。wave的宽度由硬件决定,一旦算力跑满一个wave,调度器就会自动开始下一轮,这个机制是所有GPU吞吐优化的底层语言。
这个阈值不是拍脑袋定的。以Kimi 2.5的模型形状为例,也就是Composer 2.5的基座模型,按这个启发式算出来的token下限是2368个,实测延迟和这个估计高度吻合,误差小得惊人。这说明启发式背后有扎实的硬件模型支撑,不是靠经验碰出来的。
小于这个规模的批次,通信占主导,融合的收益有限;大于这个规模,计算占主导,通信自然被盖住。MoK的调度器就贴着这条线做文章,把每一轮执行的节奏都卡在临界点附近。这条线既是性能的分水岭,也是设计哲学的浓缩:所有的优化都围绕一个物理事实展开,而不是围绕框架的抽象层展开。
一段可运行的代码:复现SM wave启发式
这些机制里最值得工程师亲手验证的一部分,是SM wave阈值的估算逻辑。下面是一段完整可运行的Python代码,它根据SM数量、每SM每wave的token处理能力,计算覆盖指定wave数所需的最小token数,并给出调度建议。只要机器上有Python3解释器,把代码粘贴进任意文件就能运行,不依赖任何第三方库。
def estimate_wave_tokens(sm_count, tokens_per_sm_per_wave, waves=2): """估算覆盖指定数量SM wave所需的最小token数。 规则:一个完整wave能处理的token数等于SM数乘以每SM每wave的token数。""" return sm_count * tokens_per_sm_per_wave * waves def decide_batch(tokens, threshold): if tokens >= threshold: return f"{tokens} >= {threshold}: 通信可被计算隐藏,走融合路径" return f"{tokens} < {threshold}: 通信占主导,建议增大批次或走非融合路径" if __name__ == "__main__": sm_count = 132 tokens_per_sm_per_wave = 9 threshold = estimate_wave_tokens(sm_count, tokens_per_sm_per_wave, waves=2) print(f"两个完整SM wave的token阈值: {threshold}") for batch in (1000, threshold, 5000): print(decide_batch(batch, threshold))这段代码在任意装有Python3的机器上直接运行,输出的是:两个完整SM wave的token阈值是2376,1000个token的批次会被建议走非融合路径,2376和5000的批次会被判定为通信可隐藏。这个数量级与Cursor官方按Kimi 2.5形状算出的2368非常接近,说明启发式的骨架是可以被独立复现的。把参数换成自己模型的专家配置和GPU规格,就能估算出自己训练任务里通信开始被隐藏的临界点,这是从这篇发布里能直接带走的最实用工具。
确定性:训练回放能力的隐形价值
确定性带来的收益,被绝大多数人低估了。分布式训练里最痛苦的排查场景,是同样的输入两次运行得到不同的结果,你根本分不清是代码问题、网络抖动还是别的环境因素。没有回放能力的时候,排查一个分布式问题往往要花掉整个团队好几天,而有了回放,定位时间可以压缩到小时级。
MoK把整条MoE路径变成确定性的,等于给训练加上了回放功能:任何一次崩溃,都能用完全相同的执行轨迹复现现场。对正在数万张卡上训练模型的团队来说,这个能力本身就是巨大的工程资产,它把玄学问题变成了可复现的bug。
另一个隐性收益是性能剖析的质量。当执行路径完全确定时,剖析器抓到的热点就是真实热点,不存在调度抖动造成的假信号,优化工作可以像调试单机程序一样按部就班地进行。每一轮优化都能确认是变好了还是变坏了,不会把噪声当成收益。
还有一层是安全收益:确定性执行让行为审计变得可行,任何一次异常输出都能追溯到确定的输入和参数,这在模型安全治理越来越严格的当下,会成为训练基础设施的加分项。监管要的回溯能力,在确定性系统里是天然自带的。
门槛:只有Blackwell整机架玩得起
当然,MoK不是免费的午餐,它的硬件门槛高得直接。它只支持英伟达Blackwell架构的SM100和SM103芯片,需要CUDA 13.0以上的工具链,PyTorch 2.10以上,目标平台是GB200和GB300的NVL72整机架。整机架拓扑意味着七十二张卡之间通过NVLink组成一个高速互联域,卡间带宽比传统以太网高一个数量级,这是它敢把通信写进内核的硬件前提。
这意味着绝大多数团队现在用不上它:单机八卡实验室跑不了,AMD的集群跑不了,上一代Hopper架构的卡也跑不了。它服务的是一小撮拥有整机架Blackwell互联的玩家,普通开发者只能先看个热闹。但门槛高不等于没有意义,看懂它的设计思路不需要任何特殊硬件。
开源的价值在于,它把一条被验证过的完整工程路径摊开了:别人怎么分析瓶颈、怎么设计内核结构、怎么权衡重叠粒度,每一步都有据可查,后来者可以踩着脚印走。即使现在用不上,等硬件到位的那一天,方案已经等在那里了。
等Blackwell普及到更多数据中心,这套内核可以直接拿来用,不必重新发明轮子。开源的时间点往往领先硬件普及三到五年,MoK正好卡在这个窗口期上,提前把方案固化了下来,让硬件普及的那一天直接有成熟软件可用。
行业信号:应用公司开始改写算力
这件事更大的信号在产业层面:一家应用公司开始自己造训练基础设施了。Cursor在模型上的投入,正在从单纯地买算力,转向直接改造算力,这是质变。当应用公司开始把训练内核当作核心资产来经营,芯片厂商和云厂商的定价话语权,都会在不知不觉中被削弱。
过去两年的AI叙事是应用公司用现成的模型和云服务,Cursor的Composer模型加MoK内核组合说明,这个叙事正在被改写。应用公司手里握着真实的训练负载,比任何芯片厂商都清楚瓶颈长在哪里,这是它们做基础设施的天然优势,也是它们敢于下场的底气。
Cursor说MoK已经在数万张GPU上支撑Composer训练,这个部署规模本身就是宣言:训练基础设施不再是只有头部大厂才碰得起的领域,有真实负载的公司都可以下场。规模在这里不是炫耀,而是验证,验证这套方案在真实压力下确实站得住。
对独立开发者和小团队,这轮开源的直接价值在认知层面。当你还在纠结提示词怎么写的时候,头部玩家已经在对CUDA内核动刀了,这个剪刀差本身就是值得警惕的信号。竞争的战场已经下沉到了硅片之上,这个事实比任何单个数字都更值得记住。
冷静看发布:哪些数字要打折
也要冷静看待发布里的水分。百分之四十一和2.37倍都是Cursor自己报告的数字,公开仓库单独跑不出端到端结果,外部能复现的只有单层基准部分,这一点官方在文档里也承认了。在自报数据的年代,愿意把参照系讲清楚的人,反而更容易被社区记住。
官方明确说,端到端数字来自内部生产系统,无法仅凭公开代码复现。这是所有公司自报性能数据的通病,MoK只是比大多数发布做得透明,把层级基准的复现方法一并交了出来。复现的门槛是硬件,不是代码,这一点它没有藏。
还有一个容易混淆的参照系:2.37倍的对比对象是公开基线,不包含Cursor自己的旧栈,而百分之四十一恰恰是对比它自己的旧栈DeepEP加自家优化得出的。两套数字的参照系不同,不能混在一起解读,否则就会得出错误的结论。
另外,MoK要求GB300 NVL72的整机架拓扑,NVLink域内的高带宽互联是它敢把通信写进内核的前提。离开这个前提,整套方案直接失效,移植到别的拓扑需要重做大量工作。方案的有效性边界划得很清楚,这也是它专业的地方。
四课:普通工程师能从MoK带走什么
第一课,通信和计算的边界是人为的,不是物理的。性能优化的最高形态是消除边界,而不是在边界两侧各自拼命优化,MoK把这条原则贯彻到了极致。当你下一次优化遇到瓶颈,先问问自己:这个边界是不是我自己画的。
第二课,度量单位的选择决定了优化方向。Cursor报告吞吐用的是每卡每秒token数,而不是抽象的FLOPs,因为对训练来说,真正有价值的是每卡每秒吐出的有效数据量。指标选对了,优化才不会跑偏。
第三课,好的启发式胜过盲目调参。两个SM wave的阈值来自对硬件调度模型的深入理解,规则少而准,比在超参数空间里大海捞针高效得多。一条有物理依据的规则,顶得上一百次随机实验。
第四课,发布要诚实才走得远。同时公布单层的2.37倍和端到端的1.41倍,看起来数据不够惊艳,实际上建立了稀缺的可信度,工程社区最缺的就是可信的基准。这四课没有一条需要Blackwell硬件才能实践,它们属于方法论层面,任何规模的团队都能立刻用上。
下一次,瓶颈可能就在你定义之外
MoE训练优化的战场,正在从谁能把专家计算写得更快,转向谁能把通信藏得更彻底。MoK是这条路线上的一个里程碑,但肯定不是终点,Megakernel的思路正在向更多算子蔓延,内核融合会成为越来越多性能故事的共同主角。
下次打开训练日志看到GPU利用率不满的时候,可以想想Cursor的选择:瓶颈可能根本不在计算,而在那些看不见的内核边界上。答案往往藏在问题被重新定义的地方,而重新定义问题的能力,才是这次开源真正给出的礼物。