vLLM 弹性专家并行

vLLM 弹性专家并行

vLLM 已引入弹性专家并行(Elastic EP),使得 Mixture-of-Experts (MoE) 部署能够在运行时上下调工作节点数量。这消除了为调整服务容量而进行完整服务器重启的需求,在需求波动期间减少了流量下降和运营开销。

MoE 部署的运行时扩展

弹性 EP 使 vLLM 能够在运行时重新配置数据并行(DP)工作节点的数量。由于专家并行(EP)组大小是 DP 和张量并行(TP)的乘积,改变 DP 大小实际上会缩放 EP 组,并在新的工作节点集合之间重新分配专家。

操作员可以通过单个 API 调用触发调整:

curl -X POST http://localhost:8000/scale_elastic_ep \
  -H "Content-Type: application/json" \
  -d '{"new_data_parallel_size": 8}'

技术实现与状态管理

在运行时扩展 DP 需要更新几个关键运行时状态以避免失效。vLLM 将扩展过程视为具有显式同步点的协调状态机:

  • 分布式通信组: EP、DP 和世界组必须更新以反映新的 rank 集合。
  • 专家分配: 专家到特定 rank 的映射根据 EP 大小重新计算。
  • 模型权重: 新 rank 必须接收必要的权重,现有 rank 可能需要更新专家权重。
  • 编译状态: CUDA graphs 和 torch.compile 状态被重置并重新预热以匹配新的拓扑。

扩容工作流程

当从 DP=N 扩展到 DP=M(其中 M > N)时,vLLM 遵循六个阶段的过程:

  1. 触发和请求处理: 过程从 /scale_elastic_ep 开始。如果启用了 VLLM_ELASTIC_EP_DRAIN_REQUESTS=1,vLLM 会在继续之前等待飞行中的工作完成(默认超时 120 秒)。
  2. 新引擎核初始化: 使用 Ray DP 后端,vLLM 启动额外的 DP 工作节点。这些 rank 使用占位权重初始化模型,并等待重新配置信号。
  3. 待机通信组: 现有 rank 使用 StatelessGroupCoordinator 创建待机组。这使得在旧配置继续执行前向传递的同时,可以准备新配置。
  4. 专家映射和权重传输: 非专家权重(注意力层、归一化、嵌入)通过高速互连(NVLink 或 RDMA)从现有 rank 广播到新 rank。专家权重被推迟到 EPLB 重新洗牌阶段。
  5. 切换: vLLM 释放 CUDA graphs,将待机组提升为活动状态,销毁旧组,并重新预热模型以使编译路径与新设置对齐。
  6. EPLB 重新洗牌: 专家并行负载均衡(EPLB)在所有 M 个 rank 之间重新分配专家,并执行必要的专家权重移动。

缩容工作流程

DP=M 缩容到 DP=N 遵循类似的模式,但 EPLB 重新洗牌首先发生。这确保了待删除的 rank 所拥有的专家在这些 rank 被终止之前迁移到幸存的 N 个 rank。

通过两阶段屏障进行同步

为了防止由异步 DP 引擎核心导致的死锁,vLLM 采用两阶段屏障。第一个屏障使用超时;如果失败,rank 推断某些同伴仍在执行前向步骤,并返回引擎循环进行一次迭代。一旦所有 rank 对齐,第二个无超时屏障允许它们一起进入重新配置阶段。

对容错能力的影响

弹性 EP 是 vLLM 容错策略的基础组件。通过提供运行时重新配置路径,vLLM 可以在不进行完全重启的情况下从 rank 故障中恢复:

  1. 检测: 通过健康检查或后端信号识别故障。
  2. 缩容: 移除失败的 rank 并重新分配其专家。
  3. 扩容: 在可用时添加替换容量。

NIXL EP 被突出显示为此流程中特别相关的通信后端,因为它可以检测、报告并从 EP 侧故障中恢复,并通过 connect_ranks()disconnect_ranks() API 增量添加或删除 rank。

当前局限性和未来工作

虽然弹性 EP 提供了核心重新配置路径,但当前支持仅限于 Ray DP 部署,其中 tensor_parallel_size=1,一个 API 服务器,且无 DBO。未来的开发方向包括:

  • 支持 tensor_parallel_size > 1 以及更丰富的并行配置。
  • 与更多服务功能集成,包括 DBO 和 MoE draft/drafter 模型。
  • 通过改进重叠和降低预热成本来减少重新配置窗口。
  • 与自动扩缩策略连接(例如,Dynamo, llm-d)。
  • 支持 Ray 之外的其他 DP 后端。

Sources