Prhub

#46735 [CI] Fix failing CUDA graph capture in Triton MOE

原始 PR 作者 fxmarty-amd 合并时间 2026-06-26 22:21 文件变更 2 提交数 1 评论 5 代码增减 +6 / -1

执行摘要

修复 CUDA graph capture 在 Triton MoE 的失败

PR #46254 将 self.a1_scale or self.a1_gscale 作为 moe_kernel_quantize_input 的参数,导致 CUDA graph capture 失败,报错 torch.AcceleratorError: HIP error: operation not permitted when stream is capturing。此问题导致测试 test_gpt_oss_attention_quantization 在 MI300 上失败,包括 CI 构建。

该 PR 是重要的 bugfix,值得快速合并。它展示了 CUDA graph capture 对条件表达式的限制,以及如何通过属性重构优雅解决。

讨论亮点

讨论主要围绕 PR #46254 的回归如何未被 CI 捕获。

  • mawong-amd 指出 PR #46254 未标记为 ROCm,且量化模型测试仅在 AMD CI 运行,而非 vLLM CI 的 AMD 镜像,因此 CI 未检测到。
  • fxmarty-amd 指出 PR #46142 的 CI 实际上有失败记录,但 GitHub UI 未显示。
  • mawong-amd 确认修复方案比 PR #46254 的原始变更侵入性更小,范围更清晰。

实现拆解

  1. nvfp4_emulation_moe.py 中添加 a1_scale 属性:为 Nvfp4QuantizationEmulationTritonExperts 类新增 a1_scale 属性,直接返回 self.a1_gscale。该属性是 TritonExperts 基类期望的接口,但之前 Nvfp4QuantizationEmulationTritonExperts 未定义此属性。
  2. triton_moe.py 中简化 a1_scale 的引用:将 self.a1_scale or self.a1_gscale 改为 self.a1_scale。由于 a1_scale 属性现在在所有子类中均可用,无需条件回退。此修改消除了 CUDA graph capture 不支持的 runtime 条件表达式。
文件 模块 状态 重要度
vllm/model_executor/layers/fused_moe/experts/nvfp4_emulation_moe.py 量化后端 modified 5.97
vllm/model_executor/layers/fused_moe/experts/triton_moe.py 计算内核 modified 4.93

关键符号

a1_scale

关键源码片段

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

新增 `a1_scale` 属性,返回 `a1_gscale`,这是修复的核心提供方。

# vllm/model_executor/layers/fused_moe/experts/nvfp4_emulation_moe.py
# 新增属性 a1_scale,返回全局激活缩放因子 a1_gscale
@property
def a1_scale(self) -> torch.Tensor:
    # 该属性被 triton_moe.py 中的 apply 方法调用,
    # 作为 moe_kernel_quantize_input 的激活缩放参数。
    return self.a1_gscale
vllm/model_executor/layers/fused_moe/experts/triton_moe.py data-contract

简化 `apply` 方法中 `a1_scale` 的引用,消除导致 graph capture 失败的条件表达式。

# vllm/model_executor/layers/fused_moe/experts/triton_moe.py 第 246-248 行
# 变更:移除 'or self.a1_gscale',因为所有子类都已支持 a1_scale 属性
hidden_states, a1q_scale = moe_kernel_quantize_input(
    hidden_states,
    self.a1_scale, # 原来为 self.a1_scale or self.a1_gscale
    self.quant_dtype,
    self.per_act_token_quant,
    self.block_shape,
    quantization_emulation=self.quantization_emulation,
)

评论区精华

PR #46254 的回归未被 CI 捕获 question

mawong-amd 解释 PR #46254 未标记为 ROCm,且量化模型测试仅在 AMD CI 运行,而非 vLLM CI 的 AMD 镜像,因此 CI 未检测到。fxmarty-amd 指出 PR #46142 的 CI 实际上有失败记录,但 GitHub UI 未显示。

结论:CI 流程改进:确保影响 ROCm 的 PR 触发相应的 AMD CI 测试。 · 已解决

风险与影响

变更范围小(2 个文件,7 行改动),风险低。回归风险在于:如果未来有其他子类未提供 a1_scale 属性,triton_moe.py 中的简化调用会引发 AttributeError。但当前所有 TritonExperts 子类都已具备 a1_scale 或通过此 PR 新增。

影响范围为所有使用 NVFP4 量化 MoE 且启用 CUDA graph capture 的模型,特别是 AMD MI300 上的模型。修复后,相关测试和推理应能正常运行。不涉及用户功能变更。

核心路径变更 回归风险已确认

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论