Prhub

#46184 [ROCm][Perf] Use flydsl moe with Minimax-M3 mxfp8 weights on gfx950 and implemented moe-backend selection

原始 PR 作者 hongxiayang 合并时间 2026-06-27 18:22 文件变更 5 提交数 15 评论 27 代码增减 +374 / -4

执行摘要

为 gfx950 集成 AITER FlyDSL MXFP8 MoE 并实现后端选择

利用 AITER FlyDSL 在 gfx950 上对 MXFP8 推理的性能优势(吞吐提升 8-20%),同时确保回退路径可用。PR body 引用性能数据,并提到通过 --moe-backend aiter 显式启用,而非环境变量。

值得精读。展示了一个体系结构感知的 kernel 集成案例:如何通过 is_supported_config 实现自动设备/包检测、如何将自定义 kernel 优雅嵌入现有 MoE 后端选择框架、以及如何处理回退路径。对关注 ROCm 性能和 MoE kernel 集成的工程师有较大参考价值。

讨论亮点
  • 后端选择方式:BowenBao 建议将 AITER_MXFP8 加入 _SUPPORTED_BACKENDS 实现自动选择,并移除环境变量 VLLM_ROCM_USE_AITER_MXFP8_MOE,作者采纳。
  • is_supported_config 设计:BowenBao 建议在 is_supported_config 中先检测 flydsl 包是否安装,再调用父类方法,以区分“设备不支持”和“包缺失”,作者实现。
  • 避免独立 flydsl 后端:tjtanaa 指出不应定义独立的 flydsl 后端,而应作为 AITER 后端的一部分,最终统一为 AITER_MXFP8
  • swiglu_limit 兼容性:tjtanaa 发现旧版 aiter (v0.1.13.post1) 不支持 swiglu_limit 参数,会破坏现有代码。作者提到依赖的 aiter 升级 PR (#46692) 已合并,阻塞解决。
  • 权重标记位置:fxmarty-amd 质疑在 apply 中直接设置 w1.is_shuffled = True 是否合适,tjtanaa 解释当前框架限制,并计划后续改进。

实现拆解

  1. 新增 AiterMxfp8Experts 专家类 (aiter_mxfp8_moe.py):实现 MXFP8 量化参数属性、设备检查、并行配置支持和 is_supported_config,其 apply 方法通过 rocm_aiter_ops 的 fused_moe 路由。
  2. 集成到后端选择框架 (oracle/mxfp8.py, oracle/fp8.py):将 AITER_MXFP8 加入 _SUPPORTED_BACKENDS 实现自动选择,添加 _BACKEND_NAME_MAP 映射 "aiter" 和 "triton",修改 _mxfp8_backend_to_kernel_cls 解析对应专家类,修改 _select_rocm_mxfp8_backend 返回 Fp8MoeBackend.TRITON_MXFP8 而非旧枚举。
  3. 添加权重预混洗函数 (_aiter_ops.py):新增 shuffle_mxfp8_moe_weights 静态方法,通过 aiter 的 shuffle_weight/shuffle_scale 将门控/上投影权重交错排列,供 convert_to_fp8_moe_kernel_formatAITER_MXFP8 分支调用。
  4. 添加后端选择单元测试 (test_mxfp8_aiter_backend_selection.py):通过 mock 平台和 flydsl 包可用性,验证 FlyDSL 在后端注册、TP/EP 支持、is_supported_config 正确性、显式 --moe-backend aiter 选择行为。
  5. 全流程适配:在 fused_moe 调用中透传 swiglu_limit 参数,确保 FlyDSL 路径与现有 aiter fused_moe 自定义 op 兼容。
文件 模块 状态 重要度
vllm/model_executor/layers/fused_moe/experts/aiter_mxfp8_moe.py MoE 专家层 added 9.16
tests/kernels/moe/test_mxfp8_aiter_backend_selection.py 测试 added 7.84
vllm/model_executor/layers/fused_moe/oracle/mxfp8.py MoE 调度 modified 7.01
vllm/_aiter_ops.py ROCm 操作 modified 6.95
vllm/model_executor/layers/fused_moe/oracle/fp8.py MoE 调度 modified 6.12

关键符号

is_aiter_mxfp8_moe_available AiterMxfp8Experts.apply shuffle_mxfp8_moe_weights AiterMxfp8Experts.is_supported_config

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

评论区精华

后端自动选择方式 设计

BowenBao 建议将 `AITER_MXFP8` 加入 `_SUPPORTED_BACKENDS` 并移除环境变量 `VLLM_ROCM_USE_AITER_MXFP8_MOE`。

结论:作者接受建议,移除了环境变量,改为通过 `is_supported_config` 自动选择。 · 已解决

is_supported_config 的包缺失报告 设计

BowenBao 建议在 `is_supported_config` 中先检测 flydsl 包是否安装,再调用父类方法,以区分“设备不支持”和“包缺失”。

结论:作者实现,将包检测逻辑独立,提供更清晰的错误原因。 · 已解决

避免独立 flydsl 后端 设计

tjtanaa 指出不应定义独立的 `flydsl` 后端,而应作为 AITER 后端的一部分,避免与 AITER 内部的 FlyDSL 调度混淆。

结论:最终统一为 `AITER_MXFP8`,`--moe-backend aiter` 即可选择。 · 已解决

swiglu_limit 兼容性 正确性

tjtanaa 发现旧版 aiter (v0.1.13.post1) 不支持 `swiglu_limit` 参数,会破坏现有代码。

结论:作者提到依赖的 aiter 升级 PR (#46692) 已合并,阻塞解决。PR 合并前需等待 aiter 新版。 · 已解决

权重标记修改位置 正确性

fxmarty-amd 质疑在 `apply` 中直接设置 `w1.is_shuffled = True` 是否合适,是否应放在权重转换函数中。

结论:tjtanaa 解释当前框架中 `apply` 是唯一知道权重已经被混洗的地方,现有转换函数在 `nn.Parameter` 创建后会丢失标记,因此暂保持现状,计划后续改进。 · acknowledged

风险与影响

  • aiter 版本依赖AiterMxfp8Experts 需要 aiter 包含 flydsl 支持(ROCm/aiter#3811),旧版本会回退到 Triton 路径,但若回退逻辑有漏洞可能导致错误选择——通过 is_aiter_mxfp8_moe_available 中的 minimax_m3_mxfp8_tuned_fmoe.csv 探测作为看门狗,每次检查失败均返回 False(安全闭包)
  • 权重标记修改:在 apply 中直接修改 w1.is_shuffled = True 可能与其他模块(如 CUDAGraph)交互,若权重被共享或缓存可能导致状态污染——目前仅在 FlyDSL 路径使用。
  • gfx950 专用:该实现仅在 ROCm gfx950 (MX 支持) 上有效,其他平台(包括 NVIDIA)不受影响。
  • 用户:仅影响 ROCm gfx950 上使用 MXFP8 MoE 的模型(如 Minimax-M3),吞吐提升 8-20%,TPOT 降低 8-18%,GSM8K 精度中性。用户可通过 --moe-backend aiter 显式启用,或留空自动选择。
  • 系统:无全局影响,所有变更在 MOE 层隔离。
  • 团队:为后续 AMD 专用 kernel 集成提供了可复用的后端选择模式(is_supported_config + _SUPPORTED_BACKENDS),降低新 kernel 的接入成本。
aiter 版本依赖 权重标记修改 gfx950 专用

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论