专家并行负载均衡器 (EPLB)#
概述#
在LLM(大语言模型)服务中,对MoE(混合专家)模型进行专家均衡对于实现最佳性能至关重要。推理过程中动态变更专家会因全局停顿操作而对TTFT(首Token延迟)和TPOT(每输出Token延迟)产生负面影响。我们的解决方案旨在最小化该操作带来的负面影响。
EPLB效果#
降低延迟:通过将工作负载均匀分布到各专家,动态均衡专家负载以最小化TTFT和TPOT。
自适应扩展:在保持稳定性能的同时,自动适应工作负载波动。
支持场景#
模型#
vLLM-Ascend 支持所有 MoE 模型。但我们仅在 deepseek-v3.1/r1 模型上验证了性能。
[!IMPORTANT] Ascend 950 产品不支持将 EPLB 与量化类型 "W4A8MXFP4"、"W4A16"、"W4A16MXFP4" 一起使用。
MOE量化类型#
量化类型 |
支持的硬件 |
|---|---|
W8A8 / W8A8-Dynamic |
A2, A3 |
W4A8(启用融合MC2) |
A2, A3 |
MXFP4 |
Ascend 950系列产品 |
MXFP8 |
Ascend 950系列产品 |
使用建议#
在以下场景中不建议使用EPLB,因为负载均衡的收益可能无法抵消其运行时开销:
P节点工作负载,输入序列长度小于
1024个Token。D节点工作负载,每个Die的专家数
<= 8(950DT上<= 16),或每个Die的负载低于128个Token。
[!WARNING] 满足上述条件可能导致性能下降。当每个Die约有8个专家时,EPLB的收益可能与开销相当。请对实际工作负载进行基准测试,并在确认有性能提升后再启用EPLB。
如何使用EPLB#
EPLB有三种使用模式:
模式 |
|
环境变量 |
|---|---|---|
动态EPLB |
|
|
录制(生成专家映射) |
|
|
静态EPLB(加载预录制的映射) |
|
无需设置 |
[!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 |
用于收集专家热度的请求阶段。可选值: |
|
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参数选择动态专家重分配期间使用的均衡算法:
值 |
策略 |
描述 |
|---|---|---|
|
随机 |
在rank之间随机交换专家。仅适用于基本测试。 |
|
DefaultEplb |
开源EPLB算法。为最热的专家添加冗余,通过带局部约束交换的均衡分配进行打包。 |
|
SwiftBalanceEplb |
针对低带宽环境优化。支持节点内和节点间专家冗余,联合优化专家放置。(推荐) |
|
FlashLB |
统计方法,使用专家负载的滑动窗口均值/方差/协方差。使用FlashTree分层搜索进行最优副本分配,并使用 |
选择性专家热度收集#
eplb_heat_collection_stage选项适用于prefill-decode聚合场景。Prefill请求通常在一次迭代中处理大量Token,而decode请求通常处理较少Token。因此,两个阶段的专家工作负载分布可能不同。从两个阶段收集热度可能会掩盖您想要优化延迟的那个阶段的不均衡情况。
[!重要] 选择性热收集当前由Ascend模型运行器V1实现。包括此选项在内的动态EPLB尚不被Ascend模型运行器V2支持。
使用eplb_heat_collection_stage选择其专家热度贡献给EPLB的阶段:
值 |
行为 |
典型用途 |
|---|---|---|
|
从prefill和decode迭代中收集专家热度。 |
通用工作负载;此为默认值。 |
|
仅从分类为prefill的迭代中收集专家热度。 |
优化prefill工作负载平衡和TTFT。 |
|
仅从分类为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热度,设置:
{
"eplb_config": {
"dynamic_eplb": true,
"eplb_heat_collection_stage": "decode"
}
}
[!注意] 阶段选择适用于动态EPLB热收集。在内部,vLLM-Ascend通过比较每次前向迭代的填充调度token数量与decode迭代的最大预期token数量来对其进行分类。高于阈值的迭代被视为prefill;低于或等于阈值的迭代被视为decode。因此,分类是按每次前向迭代而非按单个请求进行的。
当迭代与所选阶段不匹配时,其专家负载不会被累积,也不会推进热收集间隔。一旦热收集完成,平衡计算和逐层专家权重更新将正常继续。
静态EPLB#
[!警告] 静态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"}
}'
关键注意事项#
参数调优:
expert_heat_collection_interval:对于稳定工作负载使用较高值(例如600+);对于波动流量使用较低值(例如50-100)。
algorithm_execution_interval:应≥ 50以避免启动期间过早平衡。
num_redundant_experts:(num_experts + num_redundant_experts) 必须能被专家并行大小整除。
硬件要求:
确保所有NPU具有相同的内存容量和计算能力。
网络带宽必须支持专家重新分配流量(建议≥ 10 Gbps)。
容器需要挂载shm
监控与验证:
跟踪指标:在日志中搜索 [Expert Hotness]。我们将计算每个层在不同 rank 上的负载峰值均值比,然后找出它们的平均值和最大值。Current 表示实际的峰值均值比,update 表示算法调整后的预估峰值均值比。
使用vLLM监控器在运行时检测不平衡。
在加载前始终验证专家映射JSON结构(使用jq或类似工具验证)。