执行摘要
该 PR 修复了在 ROCm 平台上,使用未量化 MoE 模型和 AITER 专家后端时,MORI 专家并行(EP)静默失效的 bug,通过调整调度逻辑确保 token 正确分发到远程 GPU,避免约 87.5% 专家贡献丢失,显著提升模型输出质量。
功能与动机
为什么做:在 ROCm 环境中,当启用 MORI EP(--all2all-backend mori)配合未量化(BF16)MoE 模型和 AITER 后端时,原有代码导致 UnquantizedFusedMoEMethod.maybe_make_prepare_finalize() 返回 None,静默跳过 MORI dispatch/combine。这使得每个 GPU 仅运行本地专家,丢失大部分专家贡献,模型输出严重退化(如 gsm8k 基准测试准确性下降)。PR body 明确描述:“The model appears to work but produces degraded output.”
实现拆解
关键改动文件:
unquantized_fused_moe_method.py:移除 AITER 后端的特殊返回 None 逻辑,确保 maybe_make_prepare_finalize() 调用父类方法生成 MoriPrepareAndFinalize;在 select_gemm_impl() 中添加 AiterExperts 支持,代码示例:
python
return super().maybe_make_prepare_finalize(routing_tables) # 移除 opt-out
elif self.unquantized_backend == UnquantizedMoeBackend.AITER:
return AiterExperts(moe_config=self.moe, quant_config=self.moe_quant_config) # 新增支持
all2all_utils.py:区分量化与未量化调度,当未量化时设置 quant_dtype=moe.in_dtype、scale_dim=0 和 scale_type_size=0,避免因 quant_config.quant_dtype 为 None 导致的崩溃。
layer.py:初始添加验证守卫,但在 review 后移除,因修复核心在其他文件。
评论区精华
主要讨论点:
- scale_type_size 清晰度优化:gemini-code-assist[bot] 指出:“当
scale_dim 为 0 时,设置 scale_type_size 为 torch.float32.itemsize 不一致... clearer to explicitly set scale_type_size to 0”。作者基于 MORI 测试更新,提升代码可读性。
- 守卫设计简化:tjtanaa 提问:“Do you think there is a better way rather than keep on listing each and every flag?” 作者回应移除了守卫,强调它“incomplete and unrelated to the actual fix”,展示聚焦核心问题的设计决策。
风险与影响
技术风险:
关联脉络
与历史 PR 的关系:本 PR 是 #37418 的 companion,后者修复 FP8 dispatch 路径,两者共同完善 MoE 专家并行调度。从近期历史 PR 分析看,vllm-project/vllm 仓库频繁涉及 ROCm 优化(如 PR #38450 修复交叉注意力调度)和 MoE 改进(如 PR #38329 修复 TRT-LLM 内核),显示对异构硬件和专家模型支持的持续投入。本 PR 填补了未量化场景下的关键漏洞,是 ROCm + MoE 功能演进中的重要一环。
参与讨论