Prhub

#39712 [CI/Build] Enable FP8 on NVIDIA Thor

原始 PR 作者 DarkLight1337 合并时间 2026-04-30 00:48 文件变更 4 提交数 4 评论 5 代码增减 +13 / -38

执行摘要

启用 NVIDIA Thor SM110 的 FP8 支持

在此之前,FP8 内核仅支持 SM100f/SM100a,在 NVIDIA Thor (SM110) 上加载 FP8 模型时会在启动阶段因架构检查失败而崩溃。此 PR 的目标是让 FP8 内核兼容 SM110,从而支持在 Thor 上运行 FP8 推理。

此 PR 值得快速合并,因为它解决了阻塞 Thor 用户的关键启动问题。设计上采用范围检查而非逐个架构添加的做法,降低了后续新架构的维护成本。建议尽快跟进 Python 端 capability 检查的更新(相关文件:vllm/v1/attention/backends/mla/cutlass_mla.py)。

讨论亮点
  1. Python 端兼容性问题:gemini-code-assist[bot] 指出,vllm/v1/attention/backends/mla/cutlass_mla.py 中的 capability 检查仍需单独更新以包含 major version 11(当前只支持 10),否则 MLA 后端在 Thor 上不会被正确选择。此问题未被本次 PR 解决。
  2. 结构体命名讨论:DarkLight1337 最初犹豫是否保留 enable_sm100f_only,在 Isotr0py 提示错误消息也应更新后,最终决定采用范围检查并统一命名为 enable_sm100_to_sm120,同时删除了 enable_sm90_onlyenable_sm100a_only 等死代码。
  3. 错误消息调整:Isotr0py 指出 enable_sm100f_only 的错误消息仍为 'sm100f',应在更新架构范围后同步更正。最终所有相关消息被更新为 'sm[100, 120)'、'sm120a'、'sm120f'。

实现拆解

实现分为 4 步:

  1. 重构架构选择器common.hpp):新增 enable_sm100_to_sm120 模板,使用范围检查 __CUDA_ARCH__ >= 1000 && < 1200 替代原有的精确匹配结构体 enable_sm100f_onlyenable_sm100a_only,同时删除不再需要的 enable_sm90_only
  2. 更新 FP8 GEMM 内核包装器:在 scaled_mm.cuhscaled_mm_blockwise_sm100_fp8_dispatch.cuhscaled_mm_sm100_fp8_dispatch.cuh 三个文件中,将内核类型定义中的 enable_sm100f_only 替换为 enable_sm100_to_sm120
  3. 更新错误信息:同步修改 enable_sm120_onlyenable_sm120_family 的错误提示字符串,使其与架构命名一致(如 'sm120a'、'sm120f')。
  4. 代码清理:移除已无引用的 enable_sm90_onlyenable_sm100a_only 结构体定义。
    本次变更不涉及测试或配置改动。
文件 模块 状态 重要度
csrc/cutlass_extensions/common.hpp 架构选择器 modified 6.7
csrc/libtorch_stable/quantization/w8a8/cutlass/c3x/scaled_mm.cuh FP8 GEMM modified 2.54
csrc/libtorch_stable/quantization/w8a8/cutlass/c3x/scaled_mm_blockwise_sm100_fp8_dispatch.cuh FP8 GEMM modified 2.54
csrc/libtorch_stable/quantization/w8a8/cutlass/c3x/scaled_mm_sm100_fp8_dispatch.cuh FP8 GEMM modified 2.54

关键源码片段

csrc/cutlass_extensions/common.hpp core-logic

核心变更文件:新增 `enable_sm100_to_sm120` 架构选择器,删除 `enable_sm90_only`、`enable_sm100a_only` 死代码,更新错误消息。这是整个 PR 的基石。

template <typename Kernel>
struct enable_sm100_to_sm120 : Kernel {
  template <typename... Args>
  CUTLASS_DEVICE void operator()(Args&&... args) {
#if defined __CUDA_ARCH__
  #if (__CUDA_ARCH__ >= 1000 && __CUDA_ARCH__ < 1200)
    Kernel::operator()(std::forward<Args>(args)...);
  #else
    // Unsupported architecture: trigger trap
    asm("trap;");
  #endif
#endif
  }
};

评论区精华

Python 端 capability 检查未同步 正确性

gemini-code-assist[bot] 指出 vllm/v1/attention/backends/mla/cutlass_mla.py 中的 supports_compute_capability 方法仍需更新以支持 major=11,否则 MLA 后端在 Thor 上不会被选择。

结论:未解决,作者表示后续可以单独处理。 · unresolved

错误消息应更新 style

Isotr0py 指出 enable_sm100f_only 的错误消息仍为 'sm100f',在架构范围变更后应同步修改。

结论:已解决,作者更新了所有相关错误消息。 · 已解决

结构体命名与架构范围选择 设计

DarkLight1337 讨论用范围检查还是逐个架构添加,最终决定采用 enable_sm100_to_sm120 并删除死代码。

结论:已解决,采用了范围检查。 · 已解决

风险与影响

  • Python 前端未同步:MLA Transformer engine 的 capability 检查未更新,可能导致 Thor 上无法启用 MLA 后端(但常规 FP8 推理不依赖该后端,影响有限)。
  • 范围扩大可能引入回归enable_sm100_to_sm120 覆盖了整个 SM10x~SM11x 范围,而此前只有 SM100f/100a 被验证过,若某些中间架构(如 SM110 以外的)上的 CUDA 内核行为有差异,可能引发异常。不过这些内核原为 SM100f 设计,在 SM110 上本身已通过用户验证。
  • 缺少回归测试:未添加针对 SM110 的 CI 测试覆盖,未来若有人修改这些内核可能不会察觉 Thor 上的问题。
  • 用户影响:FP8 模型现在可以在 NVIDIA Thor 上正常加载和运行,消除了启动阶段的错误,提升了 Thor 用户的可用性。
  • 系统影响:无性能回退;代码整体减少 25 行(+13/-38),架构选择器更简洁。
  • 团队影响:后续维护人员需注意架构选择器命名约定;Python 端兼容性需单独修复。
Python 前端 capability 未同步更新 架构范围扩大潜在回归风险 缺少 CI 测试覆盖

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论