Prhub

#46339 [Bugfix] Re-enable FP8 MoE on NVIDIA Thor

原始 PR 作者 DarkLight1337 合并时间 2026-06-24 22:35 文件变更 2 提交数 3 评论 10 代码增减 +3 / -3

执行摘要

修复 FP8 MoE 在 NVIDIA Thor 上的回归

PR #45277 中的更改导致 Qwen/Qwen3.5-35B-A3B-FP8 在 NVIDIA Thor (SM101 for CUDA 12, SM110 for CUDA 13) 上推理失败。需要部分回退以恢复 FP8 MoE 功能,并保持与现有架构的兼容。

该 PR 是必要的回归修复,变更简洁、风险低。建议阅读以了解 FP8 MoE kernel 的架构兼容性管理方式,特别是设备能力检查与 CMake 架构列表的同步机制。

讨论亮点

审核中主要讨论点是架构命名的清晰性。Harry-Chen 建议添加如 ENABLE_CUTLASS_MOE_SM110 的宏,或重命名现有宏以明确支持 SM100 和 SM110。DarkLight1337 认为保持现状更简洁,避免代码重复,最终达成共识暂不重命名。讨论在友好的氛围中结束,审核者 Isotr0py 已批准合并。

实现拆解

  1. 放宽设备能力检查:在 csrc/libtorch_stable/quantization/w8a8/cutlass/scaled_mm_entry.cu 中,将 cutlass_group_gemm_supported 函数内的 CUDA 设备能力上限从 110 修改为 120,使 SM101 和 SM110 设备能够通过检查并启用 FP8 MoE。
  2. 更新 CMake 架构列表:在 CMakeLists.txt 中,针对 CUDA 13.0+ 编译器,将 SCALED_MM_ARCHS 添加 11.0f;针对更低版本编译器,添加 10.1a,确保 Thor 架构被正确编译。
  3. 无测试配套修改:该 PR 未包含测试变更,仅做最小修复以快速合并和 cherry-pick。
文件 模块 状态 重要度
csrc/libtorch_stable/quantization/w8a8/cutlass/scaled_mm_entry.cu CUDA 内核 modified 4.03
CMakeLists.txt 构建系统 modified 3.2

关键符号

cutlass_group_gemm_supported

关键源码片段

csrc/libtorch_stable/quantization/w8a8/cutlass/scaled_mm_entry.cu core-logic

核心修复文件,修改了控制 FP8 MoE 启用的设备能力检查条件,是 bug 的直接原因。

// 文件 : csrc/libtorch_stable/quantization/w8a8/cutlass/scaled_mm_entry.cu
// 函数 : cutlass_group_gemm_supported
// 判断是否支持 CUTLASS Grouped GEMM(用于 MoE)
bool cutlass_group_gemm_supported(int64_t cuda_device_capability) {
#if defined CUDA_VERSION
#if defined ENABLE_CUTLASS_MOE_SM100 && ENABLE_CUTLASS_MOE_SM100
  // 原本的上限是 110,排除 SM110 (Thor)
  // 改为 < 120,使 SM101 和 SM110 都能通过检查
  if (cuda_device_capability >= 100 && cuda_device_capability < 120) {
    return CUDA_VERSION >= 12080; // CUDA 12.8+ 才支持
  }
#endif
#endif
  return false;
}
CMakeLists.txt configuration

更新了 SM 架构编译列表,确保 Thor 相关 CUDA 架构被正确包含。

# 文件 : CMakeLists.txt
# 构建配置:根据 CUDA 版本选择 SM 架构
if(${CMAKE_CUDA_COMPILER_VERSION} VERSION_GREATER_EQUAL 13.0)
  # CUDA 13: Thor 架构为 11.0f
  cuda_archs_loose_intersection(SCALED_MM_ARCHS "10.0f;11.0f" "${CUDA_ARCHS}")
else()
  # CUDA 12: Thor 架构为 10.1a
  cuda_archs_loose_intersection(SCALED_MM_ARCHS "10.0a;10.1a;10.3a" "${CUDA_ARCHS}")
endif()

评论区精华

架构命名和宏清晰性 设计

Harry-Chen 建议添加类似 `ENABLE_CUTLASS_MOE_SM110` 的宏,或重命名现有宏以明确支持 SM100 和 SM110。DarkLight1337 认为保持现状更简洁,避免代码重复。

结论:暂不重命名,维持现状。 · 已解决

风险与影响

风险较低。修改范围极小(2 个文件,各 2-3 行),且 SM100/110 设备能力上限放宽到 120 不会影响现有 SM100 设备的兼容性。但未对 SM110 进行独立性测试,可能存在未知的 kernel 兼容性问题。此外,CPUID 上限 120 可能覆盖未来架构,需谨慎。

直接影响是恢复了 NVIDIA Thor(SM101/SM110)上 FP8 MoE 模型(如 Qwen3.5-35B-A3B-FP8)的推理能力。影响范围限于使用这些特定 GPU 和 FP8 MoE 的用户。由于是回归修复,对现有其他用户无影响。

核心路径变更 缺少测试覆盖

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论