执行摘要
- 一句话:统一ROCm DeepEP API并更新Docker构建
- 推荐动作:该PR值得精读,尤其是关注如何通过移除平台分支实现API统一,以及Docker构建的最佳实践(如条件安装rdma-core)。对于ROCm平台开发者有重要参考价值。
功能与动机
PR描述指出目的是“Enablement of all the DeepEP API parameters”,使ROCm DeepEP API与vLLM匹配,支持低延迟等参数,并更新依赖版本。
实现拆解
实现按以下步骤:
- 移除平台条件分支:在
deepep_ll.py中删除了current_platform.is_rocm()分支,使ROCm和NVIDIA使用相同的low_latency_dispatch调用,统一传入了round_scale、use_ue8m0、use_nvfp4等参数。
- 统一通信管理器参数:在
all2all.py中移除current_platform.is_rocm()条件,为DeepEPHTAll2AllManager和DeepEPLLAll2AllManager的_make_all2all_kwargs方法直接添加explicitly_destroy=True、allow_nvlink_for_low_latency_mode=True等参数,消除ROCm与NVIDIA差异。
- 更新Docker构建:升级ROCSHMEM和DeepEP仓库commit;改用
all_backends脚本构建ROCSHMEM;为DeepEP构建添加--rocm-explicit-ctxflag;根据DEEPEP_NIC变量(cx7或io)条件安装rdma-core v62以支持最新ROCSHMEM。
关键文件:
vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ll.py(模块 MoE调度;类别 source;类型 data-contract;符号 prepare_async): 核心MoE dispatch逻辑,移除平台条件分支,统一参数传递。
vllm/distributed/device_communicators/all2all.py(模块 通信层;类别 source;类型 dependency-wiring;符号 DeepEPHTAll2AllManager._make_all2all_kwargs, DeepEPLLAll2AllManager._make_all2all_kwargs): DeepEP通信管理器,移除ROCm条件,统一参数构造。
docker/Dockerfile.rocm(模块 部署脚本;类别 infra;类型 infrastructure): 更新ROCSHMEM和DeepEP版本,调整构建方式,安装rdma-core。
关键符号:prepare_async, _make_all2all_kwargs, get_handle
关键源码片段
vllm/model_executor/layers/fused_moe/prepare_finalize/deepep_ll.py
核心MoE dispatch逻辑,移除平台条件分支,统一参数传递。
# 变更后统一调用(ROCm 与 NVIDIA 相同路径)
expert_x, expert_num_tokens, handle, _, hook = self.buffer.low_latency_dispatch(
a1, dispatch_topk_ids, self.max_tokens_per_rank, num_experts,
use_fp8=self.use_fp8_dispatch,
round_scale=self.use_ue8m0_dispatch,
use_ue8m0=self.use_ue8m0_dispatch,
**(dict(use_nvfp4=True) if use_nvfp4 else dict()),
**(dict(x_global_scale=qc_a1_gscale_or_scale) if qc_a1_gscale_or_scale is not None and nvfp4_dispatch else dict()),
async_finish=False,
return_recv_hook=True,
)
docker/Dockerfile.rocm
更新ROCSHMEM和DeepEP版本,调整构建方式,安装rdma-core。
# 更新 commit ID
ARG ROCSHMEM_BRANCH=f0acb0c6
ARG DEEPEP_BRANCH=a9ea9774
# 使用推荐构建脚本(替换显式 cmake)
RUN INSTALL_PREFIX=${ROCSHMEM_DIR} ../scripts/build_configs/all_backends -DUSE_EXTERNAL_MPI=OFF
# 为 DeepEP 构建添加 --rocm-explicit-ctx
RUN python3 setup.py --variant rocm --rocm-explicit-ctx --nic ${DEEPEP_NIC} bdist_wheel
# 条件安装 rdma-core(仅 cx7/io)
RUN if [ '${DEEPEP_NIC}' = 'cx7' ] || [ '${DEEPEP_NIC}' = 'io' ]; then git clone --branch v62.0 --depth 1 https://github.com/linux-rdma/rdma-core.git /tmp/rdma-core && cd /tmp/rdma-core && mkdir -p build && cd build && cmake -GNinja -DCMAKE_INSTALL_PREFIX=/usr -DNO_MAN_PAGES=1 .. && ninja && ninja install && ldconfig && rm -rf /tmp/rdma-core; fi
评论区精华
Review中主要讨论包括:
风险与影响
- 风险:主要风险包括:
- Docker构建一致性:rdma-core仅在test stage安装,若后续将DeepEP用于其他stage可能缺少依赖。目前作者确认仅在test stage使用。
- 统一调用路径:移除平台分支后,ROCm使用完整的参数集(如
use_nvfp4),需要底层DeepEP库支持。若ROCm DeepEP版本不匹配,可能引发运行时错误。已验证GSM8K精度一致。
- 构建脚本替换:从显式cmake/make切换到
all_backends脚本,若脚本行为有差异可能影响ROCSHMEM安装。作者表示是官方推荐方法。
- 影响:影响范围:
- 用户:使用ROCm和DeepEP的用户现在可以无缝使用低延迟和高速率模式,无需手动设置环境变量。也支持了新NIC类型(Thor2)。
- 系统:统一平台分支减少了未来维护成本,但需要确保ROCm后端持续同步更新。
- 团队:简化了ROCm和NVIDIA之间的代码分歧,有利于后续DeepEP相关开发。
- 风险标记:Docker构建阶段依赖, 统一平台分支潜在回归
关联脉络
参与讨论