Prhub

#32036 [AMD] Minimax-M3 : unblock mxfp8 block convert on gfx950

原始 PR 作者 yctseng0211 合并时间 2026-07-30 17:43 文件变更 1 提交数 2 评论 4 代码增减 +7 / -1

执行摘要

为 gfx950 添加 MXFP8 转 block-fp8 的 opt-in 开关

在 gfx950 上,MXFP8 权重的 native MX dot_scaled 路径性能较差;将其转换为 block-fp8 后,可复用 gfx942 上的成熟内核,实现 15-20% 的端到端吞吐提升,且精度无损(GSM8K 0.9719 vs 0.9689)。

该 PR 是一个典型的 opt-in 性能优化变更,设计清晰、风险可控。建议合并后关注后续 cookbook 文档更新和 gfx950 原生 MXFP8 kernel 的进展。

讨论亮点

审核人 HaiShaw 提出两条后续建议,未产生争议:

  1. GFX950 MXFP8 kernel (DSL) 2. Update cookbook with recipe when this PR is merged.
    作者确认 opt-in 设计安全、CI 通过后合并。

实现拆解

  1. 新增环境变量逻辑:在文件 python/sglang/srt/layers/quantization/fp8.py 中,修改模块级布尔变量 _mxfp8_to_block_fp8_required 的定义,从只读 mxfp8_block_convert_required() 改为 mxfp8_block_convert_required() or get_bool_env_var("SGLANG_FORCE_MXFP8_BLOCK_CONVERT")
  2. 复用现有路径:该变量控制后续权重量化初始化中是否触发 convert_mxfp8_to_block 转换,以及是否使用 aiter 的 block-scale GEMM 和 fused MoE 内核。不引入新 kernel,完全复用 gfx942 的代码路径。
  3. 默认行为不变:环境变量未设置时,get_bool_env_var 返回 False_mxfp8_to_block_fp8_required 仅取决于原有的 mxfp8_block_convert_required()(gfx942 返回 True,gfx950 返回 False),因此 gfx950 默认继续使用 native MX 路径。
  4. 测试与文档:PR 未新增单元测试或文档,但提供了详细的端到端 benchmark 和精度对比表。review 中建议后续补充 cookbook 文档。
文件 模块 状态 重要度
python/sglang/srt/layers/quantization/fp8.py 量化层 modified 5.27

关键源码片段

python/sglang/srt/layers/quantization/fp8.py core-logic

核心变更文件,新增环境变量开关以控制 MXFP8 到 block-fp8 的转换行为。

# python/sglang/srt/layers/quantization/fp8.py
# gfx942 (MI300) has no MX matmul HW; MXFP8 checkpoints are converted to
# block-fp8 [128,128] at load and run through the native block-fp8 kernels.
# SGLANG_FORCE_MXFP8_BLOCK_CONVERT=1 opts into that same block-fp8 path on
# gfx950 (MI35x): it routes the fp8 GEMMs / fused MoE through the mature aiter
# block-scale kernels instead of the native MX dot_scaled path (measured +20%
# throughput at equal accuracy on MiniMax-M3, GSM8K 0.9719 vs 0.9689).
_mxfp8_to_block_fp8_required = mxfp8_block_convert_required() or get_bool_env_var(
    "SGLANG_FORCE_MXFP8_BLOCK_CONVERT"
)

评论区精华

没有提炼出高价值讨论线程

当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。

风险与影响

风险极低:变更仅 7 行代码,属于模块级配置开关扩展,不修改任何运行时逻辑路径。环境变量未设置时行为与之前完全一致(byte-identical)。依赖现有 aiter 内核,无新增依赖。

影响范围小,仅影响 gfx950 (MI35x) 上使用 MXFP8 量化(如 MiniMax-M3)的用户。需要手动设置环境变量才能激活新路径。CUDA 和 gfx942 路径完全不受影响。

缺少测试覆盖

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论