MiMo-V2-Flash 技术报告解读:309B 参数,15B 激活的 MoE 奇迹
最近读了小米 LLM-Core 团队发布的 MiMo-V2-Flash 技术报告,这篇论文很有意思。在现在大家都卷参数量、卷万卡集群的时候,他们拿出了一个 309B 参数但激活只有 15B 的 MoE 模型。显存占用和推理延迟压得非常低,但性能却能硬刚 DeepSeek-V3 和 Kimi-K2 这些更大体量的对手。
这里面有几个把工程压榨到极致的设计,值得做底层架构和模型训练的同行琢磨琢磨。我把其中最核心的几个技术点拆解一下。
激进的混合注意力机制
这篇论文最让我意外的是他们在 Attention 上的刀法。现在的长文本模型通常恨不得把所有 Token 都塞进显存,但 MiMo-V2-Flash 反其道而行之,采用了 5:1 的混合滑动窗口注意力机制。
大部分层是滑动窗口注意力(SWA),窗口大小压到了极小的 128。这意味着在这些层里,模型是个严重的”近视眼”,只能看到当前这 128 个 Token。这带来的好处是计算量和 KV Cache 暴跌,直接把复杂度从平方级拉回了线性级。
单纯这样做模型肯定会傻掉,连句子开头的语境都记不住。所以他们在每 5 层 SWA 之后,穿插 1 层全局注意力(Global Attention)。这一层是用来”看全貌”的,负责把长距离的关键信息抓取出来。得益于 Transformer 本身的残差连接结构,第 6 层抓取的全局信息会被扔进残差流这个”传送带”,第 7 层的 SWA 虽然眼睛只能看局部,但它背后的传送带里已经装好了全局上下文,依然能顺畅推理。
这里有个坑。强制模型只看 128 个窗口,很容易让注意力机制在处理开头 token 时数值崩溃。他们引入了一个可学习的 Attention Sink Bias,也就是给注意力汇聚点加个偏置。这个小技巧让模型在 256k 的超长上下文里,检索准确率依然能维持在接近 100%,这在工程上是非常实用的 tradeoff。
MOPD:用分身解决”跷跷板效应”
在后训练阶段,我们经常遇到一个头疼的问题:想让模型代码能力变强,数学能力往往就会掉,这就是所谓的”跷跷板效应”。传统的做法是混合数据一锅炖,但很难调平。
MiMo 搞了一个 MOPD(Multi-Teacher On-Policy Distillation)范式。他们不直接练一个全能模型,而是先练几个”偏科”的专家。把基座模型复制几份,一份狂练数学变成数学专家,一份狂练代码变成代码专家。这些专家是在特定领域刷到了巅峰状态的。
最后合体的时候,不是简单的参数融合,而是让原来的学生模型进行在线强化学习(On-Policy)。学生在做题时,旁边的数学老师会提供 Token 级别的密集奖励,告诉学生每一步该走;同时环境会提供最终结果的奖励。学生模型通过模仿这些偏科老师的 Logits,能同时学会多个老师的巅峰能力。这种”影分身修炼法”比单纯的数据混合要稳得多,而且因为是在线蒸馏,避免了离线数据分布偏移的问题。
推理加速的”买一送三”
论文里提到了 MTP(Multi-Token Prediction),这个模块不仅用来提升预训练的表征质量,更是推理加速的神器。
原理很简单,主模型算完一个 Token 后,屁股后面挂着的轻量级 MTP 模块会瞬间猜出后面 3 个 Token。主模型不需要重新串行计算,而是把这 4 个 Token(1 个算的 + 3 个猜的)一次性并行验证。只要猜对了,推理速度直接翻倍。
数据很漂亮,配合 3 层 MTP,平均能达到 3.6 的接受长度,解码速度提升 2.6 倍。对于强化学习中的 Rollout 阶段,这能大幅减少 GPU 的空转时间,提升训练吞吐。
训练稳定性的工程细节
在 MoE 模型的 RL 训练中,有一个很容易被忽视的深坑:Rollout Routing Replay (R3)。
我们在做推理(Rollout)时通常为了速度用 FP8,而训练反向传播时为了精度用 BF16。加上并行计算的不确定性,这就导致了一个严重 Bug:推理时 Router 选了专家 A 和 B,但在训练回传梯度时,Router 可能因为数值微小的差异改选了专家 C 和 D。这就导致梯度传错人了,模型越练越崩。
他们的解法是在 Rollout 阶段把”用了哪个专家”死死记录下来,训练时强制复用这份路由记录。虽然增加了显存开销,但对于 MoE 的 RL 训练稳定性来说,这是必须付出的代价。同时他们还监控了一个 num-zeros 指标(零梯度参数数量),用来预警专家的负载均衡情况,这都是实战踩坑踩出来的经验。
待补充:具体的 GitHub 权重下载链接和部署指南需要等待官方仓库更新。目前的测试数据建议参考论文中的 Figure 6 和 Table 9。