Prhub

#45723 [MoE] Plumb gemm1_alpha/beta/clamp_limit into TRT-LLM FP8 MoE

原始 PR 作者 zyongye 合并时间 2026-07-02 05:34 文件变更 4 提交数 2 评论 1 代码增减 +52 / -3

执行摘要

修复 TRT-LLM FP8 MoE 缺失 OAI SwiGLU 参数导致 MXFP8 模型错误

PR body 指出,FlashInfer FP8 block-scale MoE kernels 接受三个可选的 per-expert SwiGLU 参数 gemm1_alpha、gemm1_beta、gemm1_clamp_limit 以实现 OAI SwiGLU 变体。但 FP8 TRT-LLM experts 没有传递这些参数,导致 MXFP8 模型使用 clamped/OAI SwiGLU(如 MiniMax-M3 )无法正确运行。此 PR 填补了这一缺失,与已有的 MXFP4 experts 行为对齐。

值得精读,尤其是 trtllm_fp8_moe.py 中参数构建和 kernel 调用传递模式,展示了如何在量化后端中安全地“plumb”新参数以支持更复杂激活函数。设计决策(仅支持 uninterleaved 布局、使用 None 默认值保持向后兼容)可作为类似参数传递的参考。

讨论亮点

此 PR 未收到 reviewers 实质性讨论。仅有一条 mergify 的自动 pre-commit 失败通知,已被提交者处理。

实现拆解

  1. vllm/model_executor/layers/fused_moe/experts/trtllm_fp8_moe.pyTrtLlmFp8ExpertsBase.__init__ 中,从 quant_config 读取 gemm1_alphagemm1_betagemm1_clamp_limit(若不为 None),为每个 expert 构建 float32 tensor 并存储为属性。
  2. 扩展同一文件的 _supports_activation 以支持 SWIGLUOAI_UNINTERLEAVE,表明此后端支持非交错布局的 OAI SwiGLU。
  3. apply(monolithic)和 _apply_block_scale(modular)的 kernel 调用参数列表中新增 gemm1_alpha=self.gemm1_alphagemm1_beta=self.gemm1_betagemm1_clamp_limit=self.gemm1_clamp_limit 三个参数。
  4. 在量化配置层分别修改 online/mxfp8.pycompressed_tensors_moe_w8a8_mxfp8.pyget_fused_moe_quant_config,使用 getattr(layer, "swiglu_alpha", None)getattr(layer, "swiglu_beta", None) 转发到 make_fp8_moe_quant_config。之前只有 swiglu_limit 被转发,alpha/beta 被忽略。
  5. flashinfer_utils.pyactivation_to_flashinfer_type 映射表中添加 MoEActivation.SWIGLUOAI_UNINTERLEAVE: ActivationType.Swiglu(OAI 行为通过 gemm1_* 参数实现)。
文件 模块 状态 重要度
vllm/model_executor/layers/fused_moe/experts/trtllm_fp8_moe.py MoE 专家 modified 6.94
vllm/model_executor/layers/quantization/compressed_tensors/compressed_tensors_moe/compressed_tensors_moe_w8a8_mxfp8.py 量化配置 modified 5.1
vllm/model_executor/layers/quantization/online/mxfp8.py 量化配置 modified 5.1
vllm/model_executor/layers/quantization/utils/flashinfer_utils.py 工具集 modified 4.7

关键符号

TrtLlmFp8ExpertsBase.__init__ TrtLlmFp8ExpertsBase._supports_activation TrtLlmFp8ExpertsModular.apply TrtLlmFp8ExpertsModular._apply_block_scale CompressedTensorsMoeW8A8Mxfp8Method.get_fused_moe_quant_config OnlineMxfp8Method.get_fused_moe_quant_config activation_to_flashinfer_type

关键源码片段

vllm/model_executor/layers/fused_moe/experts/trtllm_fp8_moe.py data-contract

核心变更文件:包含 per-expert 参数构造、激活支持扩展、kernel 调用参数传递。

# TrtLlmFp8ExpertsBase.__init__ 中新增的 per-expert 参数构建逻辑
# 从 quant_config 获取 gemm1_alpha/beta/clamp_limit,为每个 expert 生成 float32 tensor
if quant_config.gemm1_alpha is not None:
    self.gemm1_alpha = torch.tensor(
        [quant_config.gemm1_alpha] * self.local_num_experts,
        dtype=torch.float32,
        device=torch.accelerator.current_device_index(),
    )
else:
    self.gemm1_alpha = Noneif quant_config.gemm1_beta is not None:
    self.gemm1_beta = torch.tensor(
        [quant_config.gemm1_beta] * self.local_num_experts,
        dtype=torch.float32,
        device=torch.accelerator.current_device_index(),
    )
else:
    self.gemm1_beta = Noneif quant_config.gemm1_clamp_limit is not None:
    self.gemm1_clamp_limit = torch.tensor(
        [quant_config.gemm1_clamp_limit] * self.local_num_experts,
        dtype=torch.float32,
        device=torch.accelerator.current_device_index(),
    )
else:
    self.gemm1_clamp_limit = None# _supports_activation 扩展,支持 SwiGLU-OAI (uninterleaved)
@staticmethod
def _supports_activation(activation: MoEActivation) -> bool:
    return activation in [
        MoEActivation.SILU,
        MoEActivation.SWIGLUOAI_UNINTERLEAVE,
        MoEActivation.RELU2_NO_MUL,
    ]# 在 apply 和 _apply_block_scale 的 kernel 调用中传递参数(modular 版本示例)
flashinfer.fused_moe.trtllm_fp8_block_scale_routed_moe(
    ...
    gemm1_alpha=self.gemm1_alpha,
    gemm1_beta=self.gemm1_beta,
    gemm1_clamp_limit=self.gemm1_clamp_limit,
    ...
)

评论区精华

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

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

风险与影响

低风险。三个新参数仅在 quant_config.gemm1_alpha 等不为 None 时生效,否则保持 None,对现有配置无影响。纯 FP8 路径(非 MXFP8)不涉及这些参数。Compressed_tensors 和 online 路径中使用 getattr 安全降级。潜在风险是新激活要求权重为 uninterleaved 布局,若模型导出使用 interleaved 布局会错误(作者明确未支持 interleaved 版本)。

主要影响使用 TRT-LLM FP8 MoE 后端的 MXFP8 模型用户,特别是需要 OAI SwiGLU 变体(如 MiniMax-M3 )的推理,恢复正确性。对于其他配置无影响。代码库增加了对 SWIGLUOAI_UNINTERLEAVE 的支持,但此激活尚未在其他后端实现,因此影响范围受限。

仅 MXFP8 路径受影响 无参时不生效 纯 FP8 路径无影响 SWIGLUOAI_UNINTERLEAVE 需 non-interleaved 布局

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论