SGLang 在 DeepEP/EPLB 之上加了两个 dispatch-time MoE 负载均衡特性:Waterfill 把 dense shared expert 当作可分派的 slot,按各 rank 当前负载"填谷"到轻负载 rank(V3/R1 +1.48%~+4.66%,V4 Flash 最佳 +4.92%);LPLB 用每层 min–max 线性规划在 redundant 副本间重分流量(+0.84%~+7.34%,无 redundant 时为负)。两者都不改 logical top-k,保持语义。
Q1 — 痛点:大 MoE(DeepSeek-V3/R1、V4)靠 Expert Parallelism 把 experts 分散到多 GPU 上服务,但 router 产生的 expert traffic 天然不均衡:一个 batch 里某些 expert 拿到远多于其它 expert 的 token,EP group 就被最忙的 rank 拖住(compute 和 communication 都受影响)。静态放置(EPLB)只优化长期分布,无法消除单 batch 的残余不均衡。缺的是一个运行时环节,在不改模型语义的前提下决定"哪个物理 replica / 哪个物理 rank"处理请求。
Q2 — 方法:两个作用于不同 dispatch 选择的运行时特性。
dynamic(均匀随机选副本)策略的 drop-in 替换。核心技术壁垒:LPLB 把"per-batch 最优副本分流"做成了可以放进推理关键路径的东西。关键不在于"用 LP 求 min–max"这个想法本身,而在于让它零广播、低开销地在 DP-attention(同 step 各 rank 跑 prefill/decode/idle 不同模式)下运行——所有 rank 参与一次 all-reduce 拿到相同全局分布后各自独立解同一个 LP 得到同解(省掉结果广播),LP 由基于 cuSOLVERDx/cuBLASDx 的融合 IPM kernel 在 GPU 上求解、startup 预编译免 JIT,整条 per-batch 路径压成三次 CUDA kernel launch。
Q3 — 结果:两 Hopper 节点 16 GPU。Waterfill 在所有配置一致提升(V3/R1 +1.48%~+4.66%;V4 Flash +3.28%~+4.92%);LPLB 仅在存在 redundant replica(red16/red32)时提升(最高 GSM8K red32 +7.34%),red0 时因无副本可平衡而净为负(−0.95%~−1.61%,纯 all-reduce/solve 开销)。两者都验证不损精度。
两条路径都只改"物理落点",不改 router 的 logical top-k 选择——这是保持语义的结构性原因。
按 token 的 shared-expert slot 分配流程:
$$H = \left\lceil \frac{\sum_r L_r + N}{R} \right\rceil$$
$$S_r = \max(H - L_r, 0)$$
"填谷"直觉:把等量的水(shared 工作)倒进高低不平的容器(各 rank 负载),先填满最低处。候选集默认通信保守——只用 token 已为 routed experts 访问过的 rank(source rank 兜底),避免新增 all-to-all 目的地;all-rank 模式给更大自由度但可能增加每 token 一个新 dispatch 目的地。
决策变量:各 replicated expert 的 per-copy 负载 $x_i$、各 rank 的 slack、标量峰值 $M$。single-copy expert 不是变量(只贡献固定项),故 LP 规模只随 redundant expert 数 和 rank 数 增长,不随全 expert 数。
目标——最小化峰值:
$$\min\ M$$
每 rank 一条负载约束(redundant 副本 load + single-copy 固定 load + 到峰值的非负 slack = $M$),逼 $M \ge$ 每 rank 真实 load:
$$\sum_{i \in \text{redundant}(r)} x_i + C_r + s_r = M,\quad s_r \ge 0$$
每个 replicated logical expert 一条守恒约束(副本 load 之和 = 观测总 load,保证只重分配、不增删 token):
$$x_1 + x_2 + \dots + x_n = L$$
约束矩阵拆两半:离线结构块(copy→logical 映射、per-rank 副本归属、slack/$-M$ 列)只依赖 expert-to-GPU 放置,startup 与每次 EPLB rebalance 后预算一次;在线部分每 batch 只换 RHS(观测到的 redundant load + per-rank single-copy load)。Big-M 辅助列保证求解可行、被重罚趋零。
无形式化作者证明 — 仅实证(blog 未给收敛/最优性定理,仅给出 LP 的构造正确性论证 + 吞吐实测)。下面重建 notation 与方程物理意义,并给出可核验的一致性检查。
符号表
| 符号 | 含义 |
|---|---|
| $L_r$ | rank $r$ 的 routed 负载分数(Waterfill) |
| $N$ | 待放置的 shared-expert slot 总数 |
| $R$ | EP group 大小(本文 = 16) |
| $H$ | Waterfill 目标 waterline |
| $S_r$ | rank $r$ 的 slack(低于 waterline 的空间) |
| $M$ | 所有 rank 的最大负载(LPLB 目标标量) |
| $x_i$ | replicated expert 第 $i$ 个副本承担的负载(LPLB 决策变量) |
| $C_r$ | rank $r$ 的 single-copy 固定负载(LPLB 输入常量) |
| $s_r$ | rank $r$ 到峰值的 slack(LPLB,非负) |
| $L$ | 某 replicated logical expert 的观测总负载 |
方程物理意义
一致性检查(6 项)
dynamic 依赖的精度保证同源。✓通用设置:两 Hopper GPU 节点、16 GPU;DeepSeek-V3 FP8 作 V3/R1-style workload;TP16 / DP16 / EP16 / DP attention / DeepEP normal mode。run dsv3_ep16_three_dataset_lplb_matrix_20260605_101821,SGLang commit a462e0f864103785fd3e64327104103f1356f220;benchmark shape batch_size=1000, concurrency=256, request_rate=inf, max_tokens=1。每次比较都在同一 placement 配置内;LPLB 只有在 EPLB placement 启用时才有意义。
| Dataset | Baseline setting | Baseline | Waterfill | Waterfill gain | LPLB | LPLB gain |
|---|---|---|---|---|---|---|
| MMLU | No EPLB | 28,968 | 29,697 | +2.52% | - | - |
| MMLU | Static EPLB, red0 | 30,392 | 31,424 | +3.40% | 29,938 | -1.50% |
| MMLU | Static EPLB, red16 | 30,638 | 31,483 | +2.76% | 31,104 | +1.52% |
| MMLU | Static EPLB, red32 | 30,714 | 31,169 | +1.48% | 31,547 | +2.72% |
| GPQA | No EPLB | 23,201 | 24,283 | +4.66% | - | - |
| GPQA | Static EPLB, red0 | 26,322 | 26,970 | +2.46% | 25,899 | -1.61% |
| GPQA | Static EPLB, red16 | 26,124 | 26,683 | +2.14% | 26,350 | +0.86% |
| GPQA | Static EPLB, red32 | 25,975 | 26,655 | +2.62% | 26,193 | +0.84% |
| GSM8K | No EPLB | 29,649 | 30,892 | +4.19% | - | - |
| GSM8K | Static EPLB, red0 | 33,058 | 34,529 | +4.45% | 32,744 | -0.95% |
| GSM8K | Static EPLB, red16 | 34,026 | 35,226 | +3.53% | 35,474 | +4.26% |
| GSM8K | Static EPLB, red32 | 33,988 | 35,070 | +3.19% | 36,482 | +7.34% |
(单位均为 tok/s)读法要点:
V4 用 HashTopK 路由路径,Waterfill 需在 HashTopK 输出路径也 append/remap shared-expert slot(#25391 扩展)。V4 Flash FP8、两 Hopper 节点、14,042-prompt MMLU pool、batch=512, concurrency=128, max_tokens=1、2 warmup + 4 measured round、trimmed mean。
| Configuration | Baseline | Waterfill | Gain |
|---|---|---|---|
| No EPLB | 45,951 | 47,876 | +4.19% |
| Static EPLB, red0 | 49,253 | 51,677 | +4.92% |
| Static EPLB, red16 | 50,006 | 51,655 | +3.30% |
| Static EPLB, red32 | 50,167 | 51,813 | +3.28% |
(单位 tok/s)因 batch/concurrency 更小,这组应读作 V4 专属验证,而非与 §5.1 直接横向对比。
LPLB 收益 ∝ live batch 偏离 EPLB 标定分布的程度,呈"中间最大":
| 流量特征 | LPLB 收益 | 原因 |
|---|---|---|
| 均衡且 batch 巨大(大规模高多样性) | 低 | 残余不均衡本就少 |
| 近乎不变且窄(少量几乎相同问题) | 低 | 静态 EPLB 已捕获,均分近最优 |
| 中等规模、适度相关主题 | 最强 | 每 batch 以离线未预料的方式不均衡,但仍结构化,最优 per-batch 拆分显著降峰 |
| # | 论点 | 依据(篇内) |
|---|---|---|
| 1 | EP 让大 MoE 可服务,但 router 产生不均衡 traffic,EP group 被最忙 rank 拖住 | Introduction / Background:routed 稀疏、shared 稠密、redundant 多副本三类 load pattern |
| 2 | 静态放置(EPLB)无法消除单 batch 残余不均衡 → 需 dispatch-time LB | Background:静态 placement 优化长期分布,实际 batch 仍集中 |
| 3 | shared expert 若永远本地算,重负载 rank 无法卸载 → Waterfill 按 waterline 填谷到轻 rank | Waterfill 节:$H$/$S_r$ 机制 + 通信保守候选集 |
| 4 | Waterfill 要低开销,需让 shared dispatch 对 DeepEP 可见 → shared expert fusion 前置机制 | #20089 fusion(固定分配)→ #19290 换 load-aware |
| 5 | EPLB 对 redundant 副本的均分仅在分布匹配时最优,实际常漂移 → LPLB 每 batch 解 min–max LP | LPLB 节:$\min M$ + 守恒约束 |
| 6 | LP 要进关键路径,需零广播 + 低开销 → all-rank all-reduce 后各自解同一 LP + on-GPU IPM kernel + 3 次 launch | From Global Counts / From LP Solution 节 |
| 7 | 两法都不改 logical top-k 且副本权重相同 → 保持语义 | Accuracy Validation 节 |
| 8 | 实测:Waterfill 全正、LPLB 随 redundant 数增益、red0 净负 → 与机制预期自洽 | Evaluation 两表 |
SGLang 上游 PR(blog 致谢与正文明确列出):
HashTopK 输出路径 append/remap shared-expert slot。--ep-dispatch-algorithm lp,把 LP 解归一化为 log2phy_prob 概率分布,per-token 从中采样物理副本。启用方式(正文给出的代表性命令行):
--moe-a2a-backend deepep --deepep-mode normal --enable-dp-attention --enable-deepep-waterfill(--enable-deepep-waterfill 同时打开 shared expert fusion + Waterfill 路径);--init-expert-location 可选加载 expert 分布统计。--ep-dispatch-algorithm lp + --ep-num-redundant-experts 16(无 redundant 则无可平衡,对应 red0 无增益)+ --init-expert-location(加载含 redundant slot 的 physical-to-logical map,replica 数须与 --ep-num-redundant-experts 一致)。核心技术壁垒(展开):把 per-batch 最优 min–max 分流做成关键路径可承受的组件。三个使其可行的设计缺一不可——(a) DP-attention 下同 step 各 rank 跑 prefill/decode/idle,无单 rank 见全局分布,靠"所有 rank(含 idle 贡献 0)一次 all-reduce"补齐全局计数;(b) 各 rank 用相同输入独立解同一个 LP 得同解,从而省掉结果广播;(c) LP 由 cuSOLVERDx/cuBLASDx 融合 IPM kernel 在 GPU 上求解、startup 按层矩阵形状预编译免首请求 JIT,整条 build-RHS→solve→extract-split 路径压成三次写预分配 buffer 的 CUDA kernel launch,把 launch 开销与 host sync 移出关键路径。
关键实现细节(易漏):
all-rank 模式换来更大平衡自由度但可能新增每 token 一个 dispatch 目的地。dynamic(均匀随机选副本)的 drop-in 替换:保持同样的概率化 per-token dispatch 形态,仅把均匀抽样换成该 batch 的 load-optimal 分布 log2phy_prob。blog 未开源本文所述 SGLang 集成的独立代码文件行号,实现以上述 PR 编号为准;DeepSeek 侧灵感来源为 deepseek-ai/LPLB。