专家并行负载均衡器 (EPLB)¶
概述¶
在 LLM(大语言模型)服务中,对 MoE(混合专家)模型进行专家均衡对于实现最佳性能至关重要。在推理过程中动态调整专家会因 stop-the-world(全局停顿)操作而对 TTFT(首 Token 时间)和 TPOT(每 Token 输出时间)产生负面影响。我们的解决方案旨在最大程度地减少该操作带来的负面影响。
vLLM Ascend 提供两种 EPLB 集成路径:
- Model Runner V2(MRv2) 使用上游 vLLM EPLB 控制器、配置、默认策略、负载窗口、异步 worker 和重排生命周期。Ascend 增加了 Gloo CPU 暂存和
load_collection_phase扩展。 - Model Runner V1(MRv1) 保留旧版 vLLM Ascend 的动态、记录和静态 EPLB 模式。
这两条路径使用不同的开关和配置模式。请勿将 MRv1 环境变量或旧版字段与 MRv2 EPLB 配置混合使用。
EPLB 效果¶
- 降低延迟:通过在专家之间均匀分配工作负载来动态平衡专家负载,从而最小化 TTFT 和 TPOT。
- 自适应扩展:自动适应工作负载波动,同时保持稳定的性能。
支持场景¶
模型¶
EPLB 仅适用于支持专家并行且其 MoE 量化方法暴露完整专家权重移动布局的 MoE 模型。支持情况还取决于所选的模型运行器和硬件代次。
旧版 MRv1 的性能主要已在 DeepSeek-V3.1/R1 上得到验证。最初的 MRv2 模型级验证使用 Qwen3-30B-A3B W8A8 搭配异步 EPLB。在生产部署之前,请使用目标模型、拓扑和流量验证准确性和性能。
Important
950PR&950DT Products 不支持将 EPLB 与量化类型 "W4A8MXFP4"、"W4A16MXFP4" 配合使用。 A2 不支持冗余专家。
Model Runner V2 权重格式¶
下表描述了 MRv2 EPLB 代码路径。W8A8 已在代码树中包含模型级 NPU 回归测试。其他已启用的格式在生产使用前需要在目标硬件上进行模型级验证。
| 权重格式 | MRv2 EPLB | 说明 |
|---|---|---|
| BF16 / FP16 | 已启用 | 使用未量化的专家权重和偏置。 |
| W8A8 / W8A8 Dynamic | 已启用 | 使用常驻的逐专家权重和缩放张量。 |
| W4A8 | 已启用 | 使用常驻的逐专家权重、缩放和缩放偏置张量。 |
| W4A4 MXFP | 已启用 | 950PR&950DT Products;保留原生 ND 专家张量。 |
| W8A8 MXFP | 已启用 | 950PR&950DT Products;保留原生 ND 专家张量。 |
| W4A16 | 已拒绝 | 专家权重布局尚未完成独立的 EPLB 验证。 |
| W4A16 MXFP | 已拒绝 | 专家权重布局尚未完成独立的 EPLB 验证。 |
| W4A8 MXFP | 已拒绝 | 专家权重布局尚未完成独立的 EPLB 验证。 |
Model Runner V1 量化与硬件¶
| 量化类型 | 支持的硬件 |
|---|---|
| W8A8 / W8A8-Dynamic | A2、A3 |
| W4A8(启用 fused MC2) | A2、A3 |
| MXFP4 | 950PR&950DT Products |
| MXFP8 | 950PR&950DT Products |
使用建议¶
在以下场景中不建议使用 EPLB,因为负载均衡的收益可能无法抵消其运行时开销:
- P node 工作负载的输入序列短于
1024个 token。 - D node 工作负载中每个 die 的专家数
> 8(在 950DT Products 上为> 16),或每个 die 的负载低于128个 token。
Warning
满足上述条件可能导致性能下降。 当每个 die 约有 8 个专家时,EPLB 的收益可能与其开销相当。请对实际工作负载进行基准测试,并在确认有性能提升后再启用 EPLB。
如何使用 EPLB¶
Model Runner V2:异步 EPLB¶
当模型或环境未默认选择 MRv2 时,请显式选择 MRv2。启用专家并行和上游 EPLB。Ascend 使用上游默认策略,自动选择 Gloo 通信器,并且仅支持异步迁移。
export VLLM_USE_V2_MODEL_RUNNER=1
unset DYNAMIC_EPLB
unset EXPERT_MAP_RECORD
vllm serve Qwen/Qwen3-30B-A3B \
--tensor-parallel-size 16 \
--enable-expert-parallel \
--enable-eplb \
--eplb-config.window_size 50 \
--eplb-config.step_interval 50 \
--eplb-config.num_redundant_experts 16 \
--eplb-config.use_async true \
--eplb-config.log_balancedness true \
--eplb-config.log_balancedness_interval 1 \
--additional-config '{"eplb_config":{"load_collection_phase":"all"}}'
MRv2 使用上游 EPLBConfig 字段:
| 参数 | 默认值 | 说明 |
|---|---|---|
window_size |
1000 |
用于专家负载记录的最近步数。 |
step_interval |
3000 |
专家重排之间的间隔。 |
num_redundant_experts |
0 |
冗余物理专家数量。 |
use_async |
true |
Ascend MRv2 始终异步运行。false 会被规范化为 true 并给出警告。 |
policy |
default |
上游 EPLB 放置策略。 |
log_balancedness |
false |
记录专家均衡度指标。 |
log_balancedness_interval |
1 |
均衡度日志条目之间的间隔。 |
communicator |
None |
留空以自动选择 Gloo,或设置为 torch_gloo。 |
这些字段也可以通过 --eplb-config 以 JSON 形式一起传递。在 MRv2 中,它们不能放在 --additional-config 中。
MRv2 负载收集阶段¶
load_collection_phase 是 additional_config.eplb_config 下唯一的 MRv2 EPLB 字段。它控制哪些批次阶段对上游负载窗口有贡献;它不会对不匹配的批次禁用路由或 MoE 计算。
| 值 | 行为 | 典型用途 |
|---|---|---|
all |
从每个批次收集负载。这是默认值。 | 通用和混合工作负载。 |
| 值 | 行为 | 典型用途 |
|---|---|---|
prefill |
仅从包含至少一个 prefill 请求的批次中收集。 | 优化 prefill 平衡和 TTFT。 |
decode |
仅从包含 decode 请求且不含 prefill 请求的批次中收集。 | 优化 decode 平衡和 TPOT。 |
分类每个批次执行一次。包含任何 prefill 请求的批次整体被分类为 prefill;否则为 decode。与 load_collection_phase 不匹配的批次在记录当前步骤时贡献零负载;它不会抑制共享 EPLB 窗口推进。这使负载窗口槽位、调度和通信在数据并行 rank 之间保持一致。
例如,仅收集 prefill 负载:
vllm serve Qwen/Qwen3-30B-A3B \
--enable-expert-parallel \
--enable-eplb \
--eplb-config.use_async true \
--additional-config '{"eplb_config":{"load_collection_phase":"prefill"}}'
Important
MRv2 仅支持异步 EPLB,并将 use_async=false 规范化为异步 Gloo 移动。它拒绝旧版 dynamic_eplb、记录/静态映射字段、DYNAMIC_EPLB 和 EXPERT_MAP_RECORD,以及 Gloo 以外的通信器。在生产使用前,请独立验证目标模型、拓扑、图模式和流量。
Model Runner V1:旧版 EPLB¶
旧版 MRv1 EPLB 有三种使用模式:
| 模式 | eplb_config 中的配置 |
环境变量 |
|---|---|---|
| 动态 EPLB | dynamic_eplb: true |
DYNAMIC_EPLB=true |
| 记录(生成专家映射) | expert_map_record_path |
DYNAMIC_EPLB=true 或 EXPERT_MAP_RECORD=true |
| 静态 EPLB(加载预记录映射) | expert_map_path |
无需设置 |
Important
对于动态 EPLB 和记录模式,环境变量充当安全保护:仅在配置中设置 dynamic_eplb: true 是不够的——断言要求 DYNAMIC_EPLB=true 或 EXPERT_MAP_RECORD=true。静态 EPLB(通过 expert_map_path 加载预记录映射)不需要环境变量。
动态 EPLB¶
需要添加环境变量 export DYNAMIC_EPLB="true" 以启用 vLLM-Ascend EPLB。使用自动调优参数启用动态平衡。根据工作负载模式调整 expert_heat_collection_interval 和 algorithm_execution_interval。在当前版本中,我们建议使用以下策略:SwiftBalanceEplb(2)。
| 参数 | 描述 | 默认值 |
|---|---|---|
| dynamic_eplb | 启用动态 EPLB。 | False |
| expert_heat_collection_interval | 收集专家热度的间隔。 | 600 |
| algorithm_execution_interval | 执行平衡算法的间隔。 | 50 |
| eplb_policy_type | EPLB 策略类型。 | 2 |
| num_redundant_experts | 冗余专家数量。 | 0 |
| eplb_heat_collection_stage | 用于收集专家热度的请求阶段。可用值:all、prefill 和 decode。 |
all |
graph TB
A[start] --> B(collect_heat)
B --> C(execute_algorithm)
C --> D(update_layer one by one)
D --> B
D --> F[termination upon service termination]
# D node or colocation
vllm serve Qwen/Qwen3-235B-A22 \
--tensor-parallel-size 16 \
--enable-expert-parallel \
--additional-config '{ "eplb_config": {
"dynamic_eplb": true,
"expert_heat_collection_interval": 600,
"algorithm_execution_interval": 50,
"eplb_policy_type": 2,
"num_redundant_experts": 16
}}'
# P node
vllm serve Qwen/Qwen3-235B-A22 \
--tensor-parallel-size 16 \
--enable-expert-parallel \
--additional-config '{ "eplb_config": {
"dynamic_eplb": true,
"expert_heat_collection_interval": 50,
"algorithm_execution_interval": 5,
"eplb_policy_type": 2,
"num_redundant_experts": 16
}}'
EPLB 策略类型¶
eplb_policy_type 参数选择动态专家重分配期间使用的平衡算法:
| 值 | 策略 | 描述 |
|---|---|---|
0 |
Random | 在 rank 之间随机交换专家。仅适用于基本测试。 |
1 |
DefaultEplb | 开源 EPLB 算法。为最热的专家添加冗余专家,并通过带本地约束交换的平衡分配进行打包。 |
2 |
SwiftBalanceEplb | 针对低带宽环境优化。支持节点内和节点间专家冗余,以及专家放置的联合优化。(推荐) |
3 |
FlashLB | 使用专家负载的滑动窗口均值/方差/协方差的统计方法。使用 FlashTree 分层搜索进行最优副本分配,并使用 minimize_redeploy 进行增量调整。最适合高频负载波动。 |
选择性专家热度收集¶
eplb_heat_collection_stage 选项适用于 prefill-decode 聚合场景。Prefill 请求通常在一次迭代中处理许多 token,而 decode 请求通常处理较少 token。因此,两个阶段之间的专家工作负载分布可能不同。从两个阶段收集热度可能会掩盖你希望优化的延迟阶段的失衡。
[!IMPORTANT] 本节描述仅适用于 MRv1 的
eplb_heat_collection_stage字段。 MRv2 使用如上所述的load_collection_phase;这两个字段具有 不同的批次分类语义,且不可互换。
使用 eplb_heat_collection_stage 选择其专家热度贡献给 EPLB 的阶段:
| 值 | 行为 | 典型用途 |
|---|---|---|
all |
从 prefill 和 decode 迭代中收集专家热度。 | 通用工作负载;这是默认值。 |
prefill |
仅从分类为 prefill 的迭代中收集专家热度。 | 优化 prefill 工作负载平衡和 TTFT。 |
decode |
仅从分类为 decode 的迭代中收集专家热度。 | 优化 decode 工作负载平衡和 TPOT。 |
根据实际工作负载选择阶段。以下值可作为初始调优指导:
- 对于典型输入序列长度大于
1024个 token 的工作负载,先从prefill开始。 - 对于典型输入序列长度小于
1024个 token 但并发数大于1024的工作负载,尝试decode或all。 - 对于其他或混合工作负载,在选择设置之前,针对目标 TTFT 或 TPOT 对
all、prefill和decode进行基准测试。
这些阈值是经验性的起点,而非严格要求。生产流量分布、并发、模型配置和硬件拓扑都可能影响最优阶段。
例如,要仅收集 prefill 热度:
export DYNAMIC_EPLB="true"
vllm serve Qwen/Qwen3-235B-A22 \
--tensor-parallel-size 16 \
--enable-expert-parallel \
--additional-config '{ "eplb_config": {
"dynamic_eplb": true,
"expert_heat_collection_interval": 600,
"algorithm_execution_interval": 50,
"eplb_policy_type": 2,
"num_redundant_experts": 16,
"eplb_heat_collection_stage": "prefill"
}}'
要仅收集 decode 热度,请设置:
[!NOTE] 阶段选择适用于动态 EPLB 热度收集。在内部,vLLM-Ascend 通过将其填充后的已调度 token 数与 decode 迭代的最大预期 token 数进行比较,对每个前向迭代进行分类。高于阈值的迭代被视为 prefill;等于或低于阈值的迭代被视为 decode。因此,分类是按前向迭代执行的,而不是按单个请求执行的。
当某个迭代与所选阶段不匹配时,其专家负载不会被累积,也不会推进热度收集间隔。热度收集完成后,均衡计算和逐层专家权重更新将正常继续。
静态 EPLB¶
[!WARNING] 静态 EPLB 计划在 v0.25.1 中移除。
初始设置(记录专家映射)¶
需要添加环境变量 export EXPERT_MAP_RECORD="true" 以记录专家映射。使用 expert_map_record_path 生成初始专家分布映射。这将为后续部署创建基线配置。
vllm serve Qwen/Qwen3-235B-A22 \
--tensor-parallel-size 16 \
--enable-expert-parallel \
--additional-config '{ "eplb_config": {
"expert_map_record_path": "/path/to/eplb.json",
"num_redundant_experts": 16,
"expert_heat_collection_interval": 400,
"algorithm_execution_interval": 30
}}'
后续部署(使用已记录的映射)¶
加载预先记录的专家映射以获得一致的性能。这可避免在运行时重新计算分布。
vllm serve Qwen/Qwen3-235B-A22 \
--tensor-parallel-size 16 \
--enable-expert-parallel \
--additional-config '{
"eplb_config": {"expert_map_path": "/path/to/eplb.json"}
}'
关键注意事项¶
- 参数调优:
- 对于 MRv2,针对目标工作负载调整
window_size和step_interval。对于 MRv1,调整expert_heat_collection_interval和algorithm_execution_interval。 -
num_redundant_experts必须使(num_experts + num_redundant_experts)能被专家并行大小整除。 -
硬件要求:
- 确保所有 NPU 具有相同的内存容量和计算能力。
- 网络带宽必须支持专家重分配流量(建议 ≥ 10 Gbps)。
-
容器需要挂载 shm
-
监控与验证:
- 跟踪指标:在日志中搜索 [Expert Hotness]。我们将计算不同 rank 下每一层负载的峰值与平均值之比,然后求取它们的均值和最大值。Current 表示实际的峰值与平均值之比,update 表示算法调整后的估计峰值与平均值之比。
- 使用 vLLM monitor 在运行时检测不均衡。
- 加载前始终验证专家映射 JSON 结构(使用 jq 或类似工具进行验证)。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 vl/vllm-ascend