Prhub

#37787 [Bugfix][ROCm][MoE] Fix mxfp4 oracle regressions from #37128

原始 PR 作者 AndreasKaratzas 合并时间 2026-03-25 08:17 文件变更 11 提交数 15 评论 40 代码增减 +69 / -15

执行摘要

修复 ROCm 平台上 MoE mxfp4 量化由 PR #37128 引入的回归问题,恢复 gpt-oss 功能。

PR body 中指出:“Fixes several issues introduced by #37128 that broke gpt-oss on ROCm。” 具体包括:gfx950 gate 丢失导致 CK 在 gfx942 上崩溃;对齐检查丢失导致模型如 gpt-oss-20b 出现 reshape 错误;hidden_pad 和 intermediate_pad 字段遗漏影响 rocm_aiter_ops.fused_moe() 调用。目的是恢复 CI 并通过测试。

建议工程师精读此 PR,重点关注 tensor 类型兼容性的设计决策(如使用 .shape 替代 .size())和 backend 选择逻辑(如 gfx950 gate 和对齐检查)。对于 ROCm 团队,需注意 padding 处理的临时性,并监控相关后续 PR。

讨论亮点

review 中的核心讨论包括:

  • 矛盾点:gemini-code-assist[bot] 指出 PR 描述称“启用 mxfp4 LoRA on ROCm”,但代码仍抛出 NotImplementedError。经讨论,错误消息被改为平台无关,但 LoRA 功能未启用。
  • tensor API 变更:jeejeelee 询问 .size().shape 的变更原因,AndreasKaratzas 解释因 #37128 引入了 triton_kernels.tensor.Tensor 类型,缺少 .size() 方法,需用 .shape 保持兼容。
  • padding 处理:Rohan138 建议修改 padding 计算和将 gfx950 检查移到 _supports_quant_scheme,以避免 is_supported_config 在 padding 前被调用。AndreasKaratzas 采纳并调整。
  • 长期解决方案:BowenBao 建议等待 PR #34285 以更清洁地解决 padding 问题,但作者因 CI 压力推进本 PR。

实现拆解

实现方案分为几个关键部分:

  1. 恢复 gfx950 gate:在 rocm_aiter_fused_moe.py_supports_quant_scheme 中添加 on_gfx950() 检查,限制 CK backend 仅用于 gfx950 设备。
  2. 恢复对齐检查:在 oracle/mxfp4.pyAiterExperts 中添加 is_supported_config 方法,检查 CK_MXFP4_MOE_DIM_ALIGNMENT,使不满足对齐的模型回退到 Triton。
  3. 添加 padding 字段:在 FusedMoEQuantConfig 中新增 hidden_padintermediate_pad 字段,并在 mxfp4.pyrocm_aiter_fused_moe.py 中传递,以匹配 CK kernel 要求。
  4. 修复 tensor API 兼容性:将多个文件中的 .size().dim() 改为 .shapelen(.shape),以兼容 triton_kernels.tensor.Tensor 类型(由 #37128 引入)。
  5. 其他调整:更新错误消息为平台无关、修复 CI 测试跳过逻辑。
文件 模块 状态 重要度
vllm/model_executor/layers/fused_moe/oracle/mxfp4.py MoE 量化层 modified 8.0
vllm/model_executor/layers/fused_moe/rocm_aiter_fused_moe.py MoE ROCm 后端 modified 7.0
vllm/lora/layers/fused_moe.py LoRA 层 modified 6.0
vllm/model_executor/layers/quantization/mxfp4.py mxfp4 量化 modified 6.0

关键符号

select_mxfp4_moe_backend rocm_aiter_fused_experts _get_lora_moe_configs make_mxfp4_moe_quant_config _supports_quant_scheme

分析完成后,这里会展示 LLM 生成的相对完整源码片段和详细注释。

评论区精华

PR 描述与代码矛盾 正确性

gemini-code-assist[bot] 指出 PR 描述称启用 LoRA,但代码仍抛出 NotImplementedError。

结论:错误消息被改为平台无关,但 LoRA 功能未实际启用。 · 已解决

tensor API 兼容性变更 设计

jeejeelee 提问 .size() 到 .shape 的变更原因,AndreasKaratzas 解释因 triton_kernels.tensor.Tensor 类型缺少 .size() 方法。

结论:变更为使用 .shape 以支持多种 tensor 类型,保持代码兼容性。 · 已解决

padding 处理和 backend 检查优化 设计

Rohan138 建议修改 padding 计算和将 gfx950 检查移到 _supports_quant_scheme,以避免 is_supported_config 在 padding 前调用。

结论:AndreasKaratzas 采纳建议,调整代码以更合理地集成检查。 · 已解决

风险与影响

技术风险包括:

  • padding 逻辑为临时方案:当前 padding 处理基于硬编码值,可能不完整,依赖后续 PR #34285 进行重构,存在未来维护风险。
  • LoRA 功能受限:mxfp4 LoRA 在 ROCm 上仍未支持,错误消息更新但内核问题未解决,可能影响用户使用。
  • tensor API 变更影响面:将 .size() 改为 .shape 可能影响其他代码路径,但已在多个文件中统一修复,回归风险较低。
  • backend 选择逻辑复杂:新增的 gfx950 检查和对齐逻辑增加了选择器复杂度,可能引入新的边界情况错误。

影响分析:

  • 对用户:恢复 gpt-oss 模型在 ROCm 平台上的运行,特别是使用 mxfp4 量化的 MoE 模型,用户可正常进行推理和测试。
  • 对系统:修复 CI 回归,确保 test_gpt_oss_speculative_reasoning_leakage 等测试通过,提升系统稳定性。
  • 对团队:需关注 padding hack 的临时性,后续需跟进 PR #34285 以避免技术债务;同时,tensor API 变更提示了抽象层设计的重要性。
padding 逻辑为临时方案 LoRA 功能未完全恢复 tensor API 变更影响面

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论