11.10 MoE 路由与专家矩阵
本节位置:模块 11 · 大模型专题 | 前置:3.3、11.2 | 预计:30 分钟
一句话:MoE 用一个小路由器为每个 token 选择少数几个「专家」FFN,让总参数量很大、但每个 token 只算一小部分。
0. 场景引入
晚上 9 点,一台 8 卡的推理服务器在跑一个总参数 47B、每 token 激活 13B 的 MoE 模型:8 个专家,每个 token 选 2 个。一批请求进来,batch 是 32 条、每条 2048 token,共 65 536 个 token。
8 张卡各放一个专家,47B 的 fp16 权重约 94 GB,平均每卡 11.75 GB;显存并不紧张,真正紧张的是负载不均带来的尾部延迟,以及专家之间 all-to-all 的通信开销。
按完全均匀的路由,每个专家应该分到 个 token。但路由从来不均匀:某个专家可能分到 2 万个,另一个只分到 9 千个。如果按 16384 的平均容量开缓冲,多出来的 3 千多个 token 要么被丢弃、走残差,要么把整层拖慢——用户看到的是长回答写到一半突然跑题。
为了不丢 token,可以把容量因子从 1.0 调到 1.25,代价是每个专家的缓冲区按 1.25 倍开,补齐的空位也要参与 all-to-all,通信量跟着涨,P99 延迟也跟着涨。运维必须决定:保延迟还是保质量?这道题的答案不在模型结构里,而在路由分布的尾部有多长。
MoE 的数学核心就是这个「不均」:路由器怎么打分、容量怎么定、负载均衡损失怎么把分布推回均匀。
读完本节,你能回答的三个问题是:
- 路由器如何用 和 top-k 把 token 分配给专家?
- 容量因子 与负载均衡损失各自解决什么问题,公式怎么算?
- Top-1 和 Top-2 在负载、质量、通信上差在哪?
1. 直觉
MoE 像一家有 8 个专科医生的医院:
- 门口的分诊台(router)看一眼病人(token),决定去哪个科;
- 病人只去 1–2 个科室,不需要所有医生都看;
- 每个科室有自己的设备(专家参数)。
💡 一句话直觉:MoE = 一个小的「分诊矩阵」+ 多个专家 FFN;每个 token 只走 top-k 条路径。
类比边界:专家并不真的「专精」某个语义;路由是学出来的,可能出现负载不均、专家冗余。
1.1 它在现实世界里对应什么:分诊台与号源上限
工程对应:MoE 就是医院分诊台—— 是分诊规则,专家是科室,容量因子是每个科室当天的号源上限;病人只去 1–2 个科室,不需要所有医生都看一遍。
量级算式:、 时,路由矩阵只有 个参数,而单个专家 FFN 两层约 个参数。路由器只占单个专家的 ,却决定了这 1.34 亿参数里哪一部分被激活。
这个类比在哪里失效:医院的科室有明确的医学分工,MoE 的专家是随机初始化、靠梯度学出来的,没有机制保证「数学专家」只处理数学;同一个专家可能同时接住标点、数字和代码,所以不能拿专家编号去解释模型行为。
2. 定义
2.1 路由器
对 token 表示 :
是专家数。对 做 softmax 得门控分数,取 top-k:
2.2 专家输出
每个专家是一个 FFN :
未被选中的专家不参与计算。
2.3 容量因子与丢弃
为保证并行效率,每个专家最多处理 个 token:
超出容量的 token 可能被丢弃(或走残差),这是 MoE 训练不稳定的来源之一。
2.4 负载均衡损失
其中 是分到专家 的 token 比例, 是路由器给专家 的平均概率。它鼓励两者都接近 ;这个辅助损失由 Shazeer 等 提出。
3. 为什么这样定义
为什么不直接用一个大 FFN? 参数量与计算量绑定。MoE 解耦二者:总参数随 增长,单 token 计算只随 增长。
为什么用 top-k 而不是软加权所有专家? 软加权仍要算所有专家,失去稀疏性。top-k 是「条件计算」:只算被选中的。Switch Transformer 更极端,直接取 ,仍然能扩展到万亿参数。
为什么需要负载均衡? 若路由器把所有 token 都送给同一个专家,其它专家得不到训练,有效容量退化为 1 个专家;并行设备也会闲置。
3.1 反事实:所有 token 挤向同一个专家
设一批 个 token,、、容量因子 1.0:
若路由器把 1024 个 token 全送给专家 1 和专家 2(比如 这两列的范数略大),每个专家实际收到 1024 个,只能留下 256 个:75% 的 token 被丢弃。被丢弃的 token 若走残差,这一层的 FFN 对它们等于恒等映射,模型退化成「只有 attention 在干活」。
退到 top-1 更极端:,1024 个 token 全挤向专家 1 时只留 128 个,87.5% 被丢弃,另外 7 个专家连一个 token 都见不到。
更糟的是梯度。专家 3–8 一个 token 也没接到,梯度为 0,参数永远停在初始化——你付了 8 份显存,只得到 2 份有效容量,另外 6 份是死参数。
负载均衡损失正是为这个场景设计的:
均匀时 ,;坍缩到单个专家时 ,。只挤到 2 个专家时 ,仍是均匀值的 4 倍。损失从 1 涨到 4 或 8,梯度会把路由往均匀推——这就是为什么它几乎总是一个必须开的辅助项。
3.2 反事实:把 top-2 换成 top-1
同样的 1024 个 token、、容量因子 1.25:
| 对比项 | Top-1 | Top-2 |
|---|---|---|
| 每 token 专家计算 | ||
| 均匀时每专家分到 | ||
| 容量 (cf=1.25) | ||
| all-to-all 消息 | 1 份 | 2 份 |
| 输出 | 单个专家 | 两个专家加权 |
按 §5.2 的 :top-1 每 token 激活 ,top-2 是 ,计算翻倍;总参数仍是 ,显存不变。
质量上的差别不在「谁更准」,而在路由选错时有没有补救:top-1 只信一个专家,选错就全错;top-2 用 做加权平均,等于给路由加了一层平滑。Switch Transformer 说明 也能扩展到万亿参数,但它同样依赖辅助负载均衡损失和容量设置——省下的那一半计算不是免费的。
4. 性质与推导
4.1 参数量与计算量
设每个专家 FFN 有 参数:
- 总参数:;
- 单 token 激活参数:。
对 :总参数 8 份,计算 2 份。
4.2 路由的梯度
top-k 的选择不可微,但被选中专家的门控权重 可微。梯度通过 回传到路由器;未被选中的专家在该 token 上没有梯度。
4.3 路由坍缩
若某些专家初始优势略大,会获得更多 token → 更多梯度 → 更强,形成正反馈。负载均衡损失、噪声、容量因子都是缓解手段。
4.4 专家并行
不同专家放在不同 GPU 上;token 需要被发送到对应设备(all-to-all 通信)。这套专家并行方案在 GShard 中被系统化,通信开销可能成为瓶颈,尤其在 batch 小、专家多时。
4.5 与集成的区别
MoE 不是「多个模型投票」:每个 token 只走一条稀疏路径,不同 token 可以用不同专家;集成则对所有输入都用所有模型。
5. 例子
5.1 手算:top-2 路由
设 ,路由器输出 ,。
top-2 是专家 1(2.0)和专家 3(1.0)。只对这两个做 softmax:
输出 。
5.2 手算:参数与计算
,每个专家 FFN 为 ,参数约 。 :总专家参数 ;top-2 每 token 激活 。 对比稠密 FFN 每层 :总参数 8 倍,计算 2 倍。
5.3 场景:Mixtral 8×7B
总参数约 47B(8 个专家 × 约 5.6B + 共享部分),每 token 激活约 13B(2 个专家),见 Mixtral。 所以它的推理计算量接近 13B 稠密模型,但知识容量接近 47B。显存仍需装下全部 47B 参数。
5.4 场景闭环:一次 32×2048 的批推理
输入:32 条请求 × 2048 token 个 token;,,,32 层;专家 FFN 为 ,单专家 ,总参数 47B、激活 13B;8 张卡做专家并行,单卡 HBM 带宽按 4.8 TB/s 估。
计算:
- 激活 FLOPs:每 token 约 ,全批 FLOP PFLOP。
- 权重读取:47B 参数 fp16 共 94 GB,专家并行后每卡约 GB;单卡 4.8 TB/s 读一遍约 2.4 ms。这个 batch 有 6.5 万 token,权重只读一次,均摊到每 token 可以忽略——prefill 是算力受限,不是带宽受限。
- 计算时间:均匀时每卡分到 PFLOP,按单卡有效 400 TFLOP/s 估算约 s。
- all-to-all:每个 token 的 hidden 是 KB,发往 个专家再收回,消息量约 GB;按有效 900 GB/s 算约 2.3 ms,但 8 卡全互联的实际对分带宽更低,通常要按 2–3 倍估。
- 容量:均匀时每专家 个 token;容量因子 1.25 时 。
输出决策:常规路径 capacity factor 取 1.25;一旦检测到专家溢出,切成 dropless(不丢 token,按实际最大负载补齐),代价是这一步的显存和通信按峰值走。同时把预计最热的 1–2 个专家复制到两张卡上,让单卡负载从 2 倍回落到约 1 倍,代价是多一份显存和一次额外的 all-to-all。
成本:若某个专家分到 2 倍平均负载(32768 个 token),它的卡要算 PFLOP,时间从 0.53 s 变成 1.06 s;同一批请求的墙钟时间被这一张卡拖到 2 倍,P99 跟着翻倍。
失败条件与兜底:
- 容量因子太小:丢弃率上升,长回答逻辑断裂;兜底是 dropless,并把溢出 token 送给第二优专家。
- 容量因子太大:缓冲显存和补齐通信上涨,小 batch 时通信占比更高;兜底是按 batch 动态调 。
- 专家并行切分与流量不匹配:all-to-all 成为瓶颈,加卡反而更慢;兜底是把热专家复制、冷专家合并。
- 负载均衡损失权重过大:路由被迫均匀,专家失去分工,质量下降;兜底是调小 ,或改用只约束 的方案。
6. 常见误区
-
误区:MoE 是多个模型的集成。 纠正:每个 token 只走 top-k 个专家,是条件计算;集成对所有输入用所有模型。
-
误区:MoE 推理只需要激活参数那么多显存。 纠正:所有专家参数都要加载到显存(或按需换入),显存按总参数算;计算按激活参数算。
-
误区:专家越多越好。 纠正:专家多会增加通信、路由难度、负载不均;需要与训练数据/并行规模匹配。
-
误区:路由器学到的是人类可解释的「主题分工」。 纠正:路由模式可能与语义相关,但不保证可解释;不同层、不同 token 的分工可能很细碎。
7. 概念网络
- 前置:11.2 线性层 —— 专家就是 FFN。
- 前置:3.3 矩阵乘法 —— 路由打分。
- 关联:10.5 稀疏矩阵 —— 稀疏激活。
- 关联:11.7 KV Cache —— MoE 不改变 attention 缓存,但改变权重访存。
8. 通往大模型:工程权衡
| 维度 | 稠密 | MoE |
|---|---|---|
| 总参数 | ||
| 单 token 计算 | ||
| 显存 | ||
| 通信 | 低 | all-to-all |
| 训练稳定性 | 较稳 | 路由坍缩/容量丢弃 |
可检验结论:MoE 的「省算力」只体现在计算量,不体现在显存;总参数仍要存储。若 ,计算约为稠密的 (仅专家部分),但显存是 8 倍。
8.1 算错时用户看到什么
- 容量因子太小:超出容量的 token 被丢掉,长回答在中后段突然逻辑断裂、复读,用户感觉「模型变笨了」。
- 路由坍缩:绝大多数 token 走 1–2 个专家,显存照付 8 份、有效容量只剩 1–2 份;表现为「什么都懂一点、什么都不精」。
- 负载均衡损失权重过大:路由被强行拉平,专家失去分工,质量整体下降;这时继续加专家也不再涨点。
- 专家并行切错:all-to-all 成为瓶颈,batch 一小延迟就爆炸;用户看到的是首字延迟忽高忽低。
- 容量与显存估算漏项:OOM 或频繁换入换出,表现为服务超时。
这些都是定性症状,阈值随模型、流量和并行拓扑变化;上线前要在自己的请求分布上压测,不能照搬别人的配置。
9. 练习
- 概念:MoE 如何解耦「参数量」与「计算量」?
- 计算:,,每个专家 ,求总专家参数与单 token 激活参数。
- 计算:路由输出 ,top-2 的 gate 是多少?这说明什么?
- 场景:为什么 MoE 训练需要负载均衡损失?如果不加会怎样?
- 开放:MoE 的专家应该按「层」放还是按「token」放?各有什么通信代价?
参考答案
- 总参数随专家数 增长,单 token 计算只随 top-k 增长; 时实现「大容量、小计算」。
- 总参数 ;激活 。
- 每个 ;路由器无法区分,均匀分配,说明路由没有学到有效分工(或输入无信息)。
- 防止路由坍缩到少数专家,导致其它专家欠训练、并行设备闲置、有效容量下降。
- 专家按层放(expert parallelism)需要 all-to-all 发送 token;按 token 放则每张卡处理不同 token、需复制专家或频繁换入,通信/存储代价不同。
10. 一页速记
- MoE:路由器 top-k 选择专家 FFN,输出门控加权和。
- 总参数 ,单 token 计算 。
- 负载均衡损失防止路由坍缩。
- 显存按总参数算,计算按激活参数算。
- 专家并行有 all-to-all 通信成本。
- 物理意义 / 现实对应:MoE 是「按需叫专家」的分诊系统—— 是分诊规则, 是号源上限,负载均衡损失是防止某个科室被挤爆的调度约束。
11. 参考文献与致谢
这一页的知识不是凭空来的。下面列出本页直接借用的原始工作与权威整理;正文中的人名、定理名已链接到对应条目。链接优先指向 DOI、arXiv 或可长期访问的原文存档。
- Shazeer 等(2017):Outrageously Large Neural Networks: The Sparsely-Gated Mixture-of-Experts Layer。稀疏门控 MoE 的原始论文:top-k 门控 与容量约束、负载均衡都从这里开始,本页第 2 节是它的简化版。arXiv:1701.06538
- Fedus 等(2021):Switch Transformers: Scaling to Trillion Parameter Models with Simple and Efficient Sparsity。把路由推到 top-1 并用辅助负载均衡损失稳定万亿参数训练,说明 也能扩展,是本页 top-k 讨论的极端对照。arXiv:2101.03961
- Lepikhin 等(2020):GShard: Scaling Giant Models with Conditional Computation and Automatic Sharding。top-2 门控、容量因子与专家并行的工程实现,本页 §4.4 的 all-to-all 通信和 §2.3 的容量丢弃都来自这套方案。arXiv:2006.16668
- Jiang 等(2024):Mixtral of Experts。8 个专家、每 token 选 2 个的稀疏 MoE 模型,总参数约 47B、激活约 13B,本页 §0 与 §5.3 的数字就是它。arXiv:2401.04088
下一篇 → 11.11 logits、softmax、温度与采样
随堂测 · 3 题
源文件:11-大模型专题/10-MoE路由.md