分布式训练为什么一上 Expert Choice MoE 就开始热点失衡:从 Capacity Factor 到 Token Drop 的工程实战
很多团队把Expert Choice MoE接进分布式训练,期待的是更高吞吐,先冒出来的是 step time 忽快忽慢、部分专家爆满、另一些专家空转。⚠️ 这类抖动表面像通信偶发,实质上是路由热点、容量上限和 token 丢弃同时失衡。
更麻烦的是,这个问题很容易被误判成“卡间网络不稳定”。🧭all-to-all会放大尾延迟,但真正把训练拖进波峰波谷的,往往是 router 在长尾样本面前把太多 token 压进少数专家,再用capacity factor和token drop兜底。🔍 兜底策略一粗糙,训练曲线就会比 dense 模型更难看。
为什么 Expert Choice MoE 比普通稀疏训练更容易形成热点
Expert Choice的关键差异,不只是“哪个 token 去哪个专家”,而是“哪些专家主动接走了哪一批 token”。📌 这种双向选择在多机多卡环境里会叠加跨 rank 分发和反向回流。只要少数专家持续更受欢迎,后面的 dispatch queue、激活缓冲和通信桶都会被连带挤爆。🧱
很多团队的第一反应是继续加大专家数,或者把capacity factor从1.0推到1.5以上。🚨 问题在于,这两个动作都只能放宽缓冲,不能主动打散热点;前者会让冷专家更多,后者会让 padding 和跨卡搬运继续膨胀。若token drop关得太死,尾部 rank 会长期等最慢专家;若丢弃过猛,router 又会挤热门。🧪
| 路由策略 | 热门专家峰值负载 | token drop 率 | step time 抖动 | 训练稳定性 |
|---|---|---|---|---|
capacity factor = 1.0 | 高 | 8.7% | 22% | 易震荡 |
capacity factor = 1.25 | 中 | 2.1% | 9% | 最均衡 |
capacity factor = 1.5 | 中高 | 0.6% | 17% | 通信变重 |
[外链图片转存中…(img-BI8q61FS-1778430069677)]
一组 64 卡回放把瓶颈定位到 Capacity Factor 与 Token Drop 的耦合
在一组64张A800、128个专家、每个 token 选择top-2 expert的回放里,团队把变量收敛到三项:capacity factor、load balance loss权重和token drop阈值。📊 基线组只追求不丢 token,平均吞吐不差,但p95 step time连续抖动;第二组把容量从1.0提到1.25,同时让 router 温度略降,热门专家峰值立刻回落;第三组继续拉高容量,通信耗时又抬头。✅
defroute_batch(router_logits,capacity_factor,world_size):topk=router_logits.topk(k=2,dim=-1).indices tokens=router_logits.size(0)*topk.size(1)expert_cap=math.ceil(tokens/world_size*capacity_factor)assigned,dropped=dispatch_with_capacity(topk,expert_cap)hotspot_ratio=assigned.max().item()/max(assigned.float().mean().item(),1.0)return{"expert_cap":expert_cap,"drop_rate":dropped/tokens,"hotspot_ratio":hotspot_ratio,}moe_router:top_k:2capacity_factor:1.25load_balance_loss:0.03token_drop_policy:reroute_then_droprouter_temperature:0.85dispatch_bucket_tokens:4096overlap_all_to_all:true真正拉开差距的,不是容量本身,而是容量和路由温度是否一起调。🛠️ 当capacity factor = 1.0时,热门专家经常先满仓再丢 token;当它提高到1.25且 router 不再过度尖锐时,热点比值和反向等待一起下降。反过来,容量再往上推,虽然丢弃率更低,却把更多无效搬运塞进了all-to-all。📉 对训练系统而言,少量可控丢弃比大面积通信拥堵更便宜。
真正该补的是路由约束协议,而不是继续堆专家数
更稳的做法,是把专家热点当成一级训练指标,而不是训练后再看日志补救。🔒 系统需要同时记录热门专家峰值、冷专家空转率、token drop原因和跨 rank 重排时延,再决定是收紧 router 温度、调小 batch 形状,还是重切 dispatch bucket。🧩 否则团队很容易把“通信慢”当成主因。
笔者认为,Expert Choice MoE真正有价值的前提,不是专家越多越好,而是路由反馈能否快过负载失衡。🧠 只要热点监控、容量预算和 drop 策略没有闭环,MoE 就会把 dense 模型隐藏掉的长尾问题放大。对多数生产团队来说,先把capacity factor、router 温度和 dispatch 粒度调进同一套控制面,比盲目追求更大的专家池更现实。📍
[外链图片转存中…(img-y7BOJOfS-1778430069679)]
接下来3到6个月,MoE 训练框架会继续补齐分层路由、自适应容量和 grouped token exchange,但谁先把热点比值、尾延迟和丢弃策略做成统一面板,谁就更容易把稀疏训练跑稳。⭐ 反过来,只要系统还把token drop当成偶发异常,把capacity factor当成越大越安全的旋钮,热点失衡就会持续吞掉收益。💬 你们现在的 MoE 训练链路,能回答“为什么总是这个专家最慢”吗?
