MoE Expert Parallelism 实战:稀疏大模型推理的通信与负载均衡治理
背景:MoE 模型的“省算力”不等于“好部署”
近两年,大模型推理服务大量采用 Mixture of Experts(MoE) 架构。其核心吸引力很直接:模型总参数可以非常大,但每个 token 只激活少量专家,因此在相近计算量下可以获得更强的表达能力。
这个判断只说对了一半。
从模型结构角度看,MoE 的确通过稀疏激活把“模型容量”与“单 token 计算量”部分解耦。但到了生产推理环节,瓶颈会从“矩阵乘够不够快”转移到以下几个维度:
- 专家权重如何分布到多张 GPU
- Token 如何被路由到对应专家
- 不同 GPU 之间的 dispatch / combine 通信如何隐藏
- 热门专家是否导致局部 GPU 过载
- TP、DP、EP、PP、CP 等并行策略如何组合
- KV Cache 是否被复制或分区
- 低并发与高并发是否应使用同一套并行布局
因此,MoE 推理不是简单地将 Dense 模型的 Tensor Parallelism 复制过来。真正需要治理的是 Expert Parallelism、通信、负载均衡、显存布局和调度策略。
本文将聚焦一个工程关键点:Expert Parallelism 如何影响生产推理服务,以及上线前如何判断它是否真正适合你的业务负载。
核心原理:MoE 推理底层发生了什么
1. MoE 层不是普通 FFN
在标准 Transformer 中,每层通常包含 Attention 与 FFN。Dense 模型的 FFN 对所有 token 使用同一套权重。
MoE 模型把 FFN 替换为多个专家(Expert)。每个 token 先经过 router 或 gate,选择 top-k 个专家,随后将 token 的 hidden states 发送给这些专家进行计算,最终将专家输出合并回原始 token 顺序。
抽象流程如下:
input token hidden states
→ router / gate
→ select top-k experts
→ dispatch tokens to selected experts
→ expert FFN compute
→ combine expert outputs
→ continue next layer
关键点在于:不同 token 会去不同专家。这意味着推理不再是整齐的批量矩阵乘,而是出现动态路由、动态分组和跨设备通信。
2. Tensor Parallelism 与 Expert Parallelism 的本质差异
在 Dense 模型中,Tensor Parallelism(TP) 是常见做法:将同一层权重切分到多张 GPU,每张 GPU 计算一部分,通过 AllReduce 等通信合并结果。
MoE 也可以使用 TP,但这并不总是最优选择。因为 MoE 的专家天然就是多个独立的 FFN——若每个专家都被切片到所有 GPU,通信和权重访问将变得复杂。
Expert Parallelism(EP) 的思路截然不同:
- 不把每个专家切成多份
- 而是将完整专家分布到不同 GPU
- Token 根据 router 结果被发送到拥有对应专家的 GPU
- 专家计算完成后,结果被发回或合并
EP 主要解决两个问题:
| 问题 | EP 的解决方式 |
|---|---|
| 显存瓶颈 | 每张 GPU 只需保存部分专家,而非全部 |
| 显存带宽 | 专家权重读取可分散到多张 GPU 的显存带宽上 |
但同时,EP 引入新的代价:token dispatch 和 combine 的跨 GPU 通信。
3. All-to-All 是 EP 的关键成本
MoE 的 EP 通常需要类似 All-to-All 的通信模式:每张 GPU 都可能把一部分 token 发给其他 GPU 上的专家,也可能接收来自其他 GPU 的 token。
与 Dense TP 中常见的 AllReduce 不同:
| 通信类型 | 模式 | 典型场景 |
|---|---|---|
| AllReduce | 所有设备参与同一张量的规约 | Dense TP |
| All-to-All | 每个设备将不同数据发给不同设备 | MoE EP |
在单机 NVLink、xGMI 或高速互联下,All-to-All 可能被隐藏或摊薄;但跨节点时,它往往会成为决定尾延迟的关键因素。这也是为什么许多 MoE 部署建议先在单节点验证,再扩展到多节点——跨节点 EP 必须将网络拓扑、专家放置、批大小和路由分布一并设计。
工程落地:如何选择 TP、DP、EP 与 Hybrid 策略
1. 先判断模型结构
部署 MoE 前,建议先回答以下结构问题:
- 总专家数是多少?
- 每层激活 top-1 还是 top-2?
- 每个专家是否能完整放入单张 GPU?
- Attention 部分是否需要 TP、DP Attention 或 Context Parallelism?
- KV Cache 是否会在不同并行策略下复制?
- Router 是否容易出现热门专家?
如果单个专家本身太大,纯 EP 可能不够,需要 Expert Tensor Parallelism(ETP) 或 TP+EP 混合方案。若专家数量多但单个专家较小,EP 的收益通常更明显。
2. 低并发与高并发的策略可能不同
一个常见误区是:只要是 MoE,就默认开启 EP。
实际上:
- 低并发:单请求延迟更敏感,TP 可能更快——多张 GPU 协同处理同一请求,可降低单请求路径上的计算时间
- 高并发:EP 或 DP+EP 往往更有优势——多个请求可在专家维度和请求维度上被更充分地分散
选择并行策略时,不应只看模型参数量,还需综合考虑:
| 维度 | 关键指标 |
|---|---|
| 流量 | QPS、并发请求数 |
| 负载特征 | prompt 长度分布、output 长度分布 |
| SLA | P50 / P95 / P99 延迟要求 |
| 硬件 | 单机还是多机、GPU 互联带宽 |
| 模型 | 专家激活密度、专家数量与大小 |
3. 高吞吐场景优先关注 DP+EP
对于高并发 API 服务,Data Parallelism + Expert Parallelism 通常值得优先测试:
- DP 负责请求级并行,不同 DP rank 处理不同请求
- EP 负责专家层的分布式执行
其优势在于可同时利用请求并行与专家并行。但代价同样不可忽略:
- Attention 部分与 MoE FFN 部分的并行边界更复杂
- KV Cache 的分区或复制方式会影响显存
- All-to-All 通信会随 token 分布变化
- 负载不均衡时,慢的专家 GPU 会拖慢整层
4. 跨节点部署要优先治理通信拓扑
MoE 跨节点部署时,不应仅按“GPU 数量够不够”来规划。更重要的是:
- 热门专家是否被放在同一节点
- Token dispatch 是否频繁跨节点
- 是否有专家副本缓解热点
- 是否需要 topology-aware load balancing
- 是否能把 Attention 和 FFN 分离部署
- 是否可通过 micro-batch 或 pipeline 隐藏通信
当跨节点网络成为瓶颈时,加 GPU 不一定会提升吞吐,甚至会恶化尾延迟。
常见误区
误区一:MoE 只激活少量参数,所以一定更便宜
MoE 的 active parameters 少,不代表服务成本必然低。推理成本至少包括:
- 专家权重显存占用
- Attention 和 KV Cache 成本
- Token dispatch / combine 通信
- 专家负载不均导致的等待
- Batch padding 或 token dropping 策略
- 跨节点网络成本
- 动态调度带来的系统复杂度
若请求短、并发低、网络慢,MoE 可能并不比同等服务质量的 Dense 模型更划算。
误区二:打开 EP 就等于完成 MoE 优化
EP 只是专家分布策略,不是完整优化方案。真正的 MoE serving 优化还包括:
- Fused MoE kernel
- Dispatch / combine 通信优化
- Expert load balancing
- Expert replication(专家副本)
- Batch 与 micro-batch 策略
- KV Cache 管理
- Speculative routing 或预调度
- Topology-aware expert placement
如果仅开启一个 --enable-expert-parallel 参数而不监控专家热度和通信指标,线上极易出现“平均指标正常,P99 很差”的问题。
误区三:平均吞吐可以代表线上体验
MoE 的问题常出现在尾部。例如:
- 某些专家被大量 token 命中,对应 GPU 队列变长
- 某一层 All-to-All 通信跨节点比例突然升高,导致 ITL 抖动
平均 throughput 可能仍然不错,但用户感知到的是 token 间隔忽快忽慢。
因此,MoE 上线时必须同时观察:
| 指标类别 | 具体指标 |
|---|---|
| 用户面延迟 | TTFT、ITL、P95 / P99 latency |
| MoE 层耗时 | 每层 dispatch 时间、combine 时间 |
| 专家负载 | 每个专家 token count、token 分布偏斜度 |
| GPU 资源 | 显存带宽、SM 利用率、通信时间 |
| 网络 | 跨节点流量比例 |
上线检查清单
1. 模型与并行策略检查
- 明确 MoE 层数量、专家数量、top-k、expert hidden size
- 确认单个专家是否能完整放入单卡
- 对比 TP、EP、TP+EP、DP+EP、Hybrid ETP 的启动参数和显存占用
- 检查 Attention 部分是否需要 DP Attention、TP 或 CP
- 验证 KV Cache 在不同策略下是复制还是分区
2. 通信与拓扑检查
- 单节点先压测,再扩展到多节点
- 分别记录 AllReduce、All-to-All、dispatch、combine 耗时
- 检查跨节点 token dispatch 比例
- 避免热门专家集中在慢链路之后
- 对多节点场景评估 expert replication 或 topology-aware placement
3. 负载与业务检查
- 使用真实 prompt / output 长度分布,而非固定长度 benchmark
- 分低并发、中并发、高并发三组压测
- 同时压测短问答、长上下文、多轮对话、批量生成
- 记录 P50 / P95 / P99,而非仅记录平均值
- 观察专家 token 分布是否长期偏斜
4. 降级与回滚检查
- 保留 Dense 模型或较小 MoE 模型的降级入口
- 保留 TP-only 或单节点部署的回滚方案
- 对 EP 通信异常、GPU 掉卡、专家加载失败设计快速摘除策略
- 对超长 prompt、极端 batch、热点业务租户做限流
- 在监控面板中单独展示 MoE 层耗时和专家热度
一个实用的决策框架
可用以下伪代码逻辑快速判断是否优先测试 EP:
if 模型不是 MoE:
不需要 EP
elif 单个专家无法放入单卡:
优先测试 TP + EP 或 Hybrid ETP
elif 并发较高 and GPU 互联较好:
优先测试 DP + EP
elif 并发较低 and 关注单请求延迟:
对比 TP 与 TP + EP,不要默认 EP 最优
elif 跨节点通信占比高:
先做 topology-aware placement / expert replication / micro-batch 调度
else:
以真实业务流量压测后决策
这个框架的目的不是给出唯一答案,而是避免将 MoE 部署简化为“开不开 EP”的单选题。
结论
MoE 推理的核心矛盾不是“稀疏模型是否先进”,而是稀疏激活带来的动态路由是否能被系统稳定承接。
Expert Parallelism 能把专家权重分散到多张 GPU,缓解显存和显存带宽压力;但它也把系统瓶颈推向 All-to-All 通信、专家负载均衡和拓扑调度。对生产服务来说,EP 不是一个孤立开关,而是一套包含并行策略、通信优化、专家放置、监控指标和回滚策略的完整工程方案。
MoE 的部署收益来自稀疏计算,但线上稳定性取决于通信与负载均衡。
参考资料
- vLLM Documentation — Expert Parallel Deployment
- TensorRT-LLM Documentation — Parallel Strategy / Expert Parallelism
- DeepSpeed — Getting Started with DeepSpeed-MoE for Inferencing Large-Scale MoE Models
- DeepSpeed Documentation — Mixture of Experts API
- SGLang Documentation — Expert Parallelism
- MegaBlocks: Efficient Sparse Training with Mixture-of-Experts
- MegaScale-Infer: Serving Mixture-of-Experts at Scale with Disaggregated Expert Parallelism
- Moebius: Serving Mixture-of-Expert Models with Seamless Runtime Parallelism Switch
- AMD ROCm Blog — The vLLM MoE Playbook