【Transformer 与注意力机制】44|MoE:稀疏激活的万亿模型路径
内容提要
MoE通过稀疏激活解耦参数量与计算量,但代价转移至路由稳定性、通信和推理效率。训练中需应对过载丢token、专家塌缩和路由抖动,All-to-All通信是主要成本。推理时小batch降低专家利用率。MoE并非免费容量,其优势在预训练FLOPs上成立,但微调和通信场景需权衡。
延伸解读
MoE的“免费容量”有前提
MoE常被宣传为“免费容量”,但本文指出这一说法仅在预训练FLOPs维度上成立。Artetxe等人的对照实验显示,MoE在计算效率上优于dense模型,但微调阶段优势减弱,且不同任务表现差异大。此外,All-to-All通信和推理时的低专家利用率会抵消理论收益。因此,选型时需结合具体任务和硬件预算,不能抽象地问“MoE好不好”。
训练中的三大症状与对策
MoE训练中常见过载丢token、专家塌缩和路由抖动。过载时超出容量的token被丢弃,影响特定batch;专家塌缩需用辅助损失或噪声抑制;路由抖动可通过Expert Choice或router z-loss缓解。这些对策各有代价,如辅助损失系数需权衡,Expert Choice改变路由语义。监控drop率和负载均衡指标比只看平均loss更重要。
推理效率的隐藏瓶颈
MoE推理时,小batch导致每个专家接收的token数少,矩阵乘法利用率下降,从算力受限变为带宽受限。DeepSpeed-MoE指出,同等质量的MoE模型比dense大数倍,需要数倍聚合内存带宽而非算力。MegaBlocks也指出padding浪费算力。因此,MoE的训练收益与推理收益不对称,低并发场景下理论优势难以兑现。
Q&A
MoE 如何实现参数量与计算量的解耦?
MoE 将 FFN 替换为多个专家,每个 token 只路由到其中 k 个专家。总参数量为 N_total = N_attn+embed + E * N_expert,而激活参数量为 N_act ≈ N_attn+embed + k * N_expert。每 token 的 FLOPs 近似为 2 * N_act,与专家总数 E 无关。因此,增加专家数 E 可以扩大模型容量,而调整 k 可以控制计算成本,两者相互独立。
为什么 MoE 通常只替换 FFN 而不替换 attention?
因为 FFN 对每个 token 独立计算,输出只依赖当前 token,因此可以方便地路由到不同专家;而 attention 的输出依赖序列中其他 token 的 K/V,路由决策与 token 间的连接图绑定,实现复杂且会削弱独立路由的优势。此外,FFN 参数量更大,替换收益更直接。
MoE 训练中常见的三种症状是什么?分别如何解决?
三种症状是:过载丢 token(超出容量上限的 token 被丢弃)、专家塌缩(少数专家吸收几乎所有流量,其他专家梯度消失)、路由抖动(相近输入在不同训练步被路由到不同专家)。解决方法包括:设置 capacity factor 限制容量,使用辅助损失(aux loss)促进负载均衡,以及采用专家选择路由(Expert Choice)或 router z-loss 来稳定路由。
MoE 中的 All-to-All 通信为什么是成本中心?
在专家并行训练中,token 需要被发送到其路由到的专家所在设备,计算后再返回,这涉及两次 All-to-All 通信(dispatch 和 combine)。通信量近似与 tokens × k × d_model 成正比,且通信模式是数据依赖的,难以静态调度和重叠。如果集群互联带宽不足,理论上的 FLOPs 优势会被通信等待时间抵消。
MoE 是免费容量吗?在什么条件下成立?
MoE 的“免费容量”论据在预训练 loss 和 FLOPs 维度上有证据支持,例如在相同 FLOPs 预算下 MoE 能达到更大 dense 模型的质量。但该优势在微调阶段和不同任务上表现不一,且通信成本可能吃掉理论收益。因此,并非在所有场景下都免费,需要权衡。
MoE 在推理时为什么专家利用率会变差?
推理时,尤其是小 batch 或低并发场景,每个专家平均收到的 token 数可能很少,导致矩阵乘法无法充分利用硬件,从算力受限变为带宽或调度开销受限。此外,MoE 模型比同等质量的 dense 模型大数倍,需要更高的内存带宽和并行度,但算力需求并未相应增加,导致利用率下降。