Prhub

#51003 [Bugfix][Build] Fix DeepGEMM CUDA 12.9 FP8 header visibility

原始 PR 作者 khluu 合并时间 2026-08-04 18:06 文件变更 2 提交数 1 评论 0 代码增减 +2 / -2

执行摘要

修复 DeepGEMM CUDA 12.9 编译缺头文件,升级 pin 到 e21c821f

修复 CUDA 12.9 release 构建失败:DeepGEMM 固定 commit f5a76426 中的 mqa_logits.cuh 直接使用了 __nv_fp8_e4m3 类型,但未包含声明该类型的 CUDA 头文件,host 编译报错 '__nv_fp8_e4m3' was not declared in this scope。PR body 明确说明要“preserving the exact DeepGEMM f5a76426 code baseline”,仅补充缺失的 include。

值得快速了解但不建议深入精读。核心价值在于:一是展示了一个最小化修复的范例(保持基线、只补缺失声明);二是提醒维护者 DeepGEMM 这类外部 kernel 依赖在两个文件中同步 pin 的机制。若关心构建系统或 CUDA 12.9 支持,可关注后续 PR#50796 的更大范围升级。

讨论亮点

无实质人工 review 评论。仅 claude[bot] 自动提示本仓库配置了手动 code review,可评论 @claude review 触发。PR body 中作者主动做了 duplicate-work check,说明 PR#50796 虽然也改动同一对 pin 文件,但目的是替换为更大范围的 SM120+SITU 合并(5f33a180),与本 PR 的 CUDA 12.9 头文件修复不冲突。

实现拆解

  1. 定位根因:DeepGEMM 固定 commit f5a76426 的 deep_gemm/layout/mqa_logits.cuh 第 16 行直接使用 __nv_fp8_e4m3,但未包含 ,CUDA 12.9 host 编译器因声明缺失而报错。
  2. 提交上游修复:在 DeepGEMM 仓库创建 codex/f5a-cuda-fp8-include 分支,基于 f5a76426 增加且仅增加一行 #include <cuda_fp8.h>,形成新 commit e21c821f。
  3. 同步 vLLM 两处 pin:将 tools/install_deepgemm.sh 的 DEEPGEMM_GIT_REF 与 cmake/external_projects/deepgemm.cmake 的 _DEEPGEMM_UPSTREAM_TAG 从 f5a76426fa084087169693fd0cd815223576d6e9 改为 e21c821f39a2056d68067a466c64ddc942200106;两处注释均要求保持同步。
  4. 验证:release-v2 build 4684 使用该 commit 后,两个 wheel(x86_64/aarch64)与四个镜像(含 Ubuntu 24.04)的 CUDA 12.9 目标全部通过,唯一失败的 macOS arm64 CPU wheel 与本变更无关。
文件 模块 状态 重要度
tools/install_deepgemm.sh 安装脚本 modified 3.11
cmake/external_projects/deepgemm.cmake 构建配置 modified 2.94

关键源码片段

tools/install_deepgemm.sh configuration

DeepGEMM 安装脚本,pin 从 f5a76426 升级到 e21c821f,与 cmake 文件保持同步,是 CUDA 12.9 修复生效的一半。

# tools/install_deepgemm.sh(片段)
# 本脚本通过 pip 安装 DeepGEMM,GIT_REF 必须与 cmake/external_projects/deepgemm.cmake 中的 _DEEPGEMM_UPSTREAM_TAG 保持一致。
DEEPGEMM_GIT_REPO="https://github.com/vllm-project/DeepGEMM.git"
# NOTE: 当前指向兼容 sm120 的 nv-dev 分支;本次 pin 到 e21c821f,
# 它只在 f5a76426 基础上新增一行 `#include <cuda_fp8.h>`,
# 用于修复 CUDA 12.9 host 编译期 __nv_fp8_e4m3 未声明的问题。
DEEPGEMM_GIT_REF="e21c821f39a2056d68067a466c64ddc942200106"
WHEEL_DIR=""
cmake/external_projects/deepgemm.cmake configuration

CMake FetchContent 的 DeepGEMM 版本 pin,与 install 脚本同步更新,是源码编译路径下修复的另一半。

# cmake/external_projects/deepgemm.cmake(片段)
# FetchContent 拉取 DeepGEMM 源码编译;这里与 tools/install_deepgemm.sh 的 DEEPGEMM_GIT_REF 必须保持同步。
set(_DEEPGEMM_UPSTREAM_REPO "https://github.com/vllm-project/DeepGEMM.git")
# TODO: 切换 nv_dev 分支以支持 situ;当前 pin 的 e21c821f 是 f5a76426 的
# 唯一子提交,只新增了缺失的 CUDA FP8 头文件声明,避免 CUDA 12.9 下
# mqa_logits.cuh 中 __nv_fp8_e4m3 未声明导致的编译失败。
set(_DEEPGEMM_UPSTREAM_TAG "e21c821f39a2056d68067a466c64ddc942200106")
set(_deepgemm_fc_root "${FETCHCONTENT_BASE_DIR}")

评论区精华

与 PR#50796 的重复工作排查 question

PR body 主动说明已检查无其他 PR 引用 e21c821f 或 mqa_logits.cuh;PR#50796 同样修改这两个 pin 文件,但目标是把 f5a76426 升级到更大的 SM120+SITU 合并提交 5f33a180,以恢复 SM120 的 scale-factor layout 支持,属于不同失败场景的修复。

结论:作者判定两 PR 不重复,各自针对不同失败;本 PR 刻意保持 f5a76426 内容不变,只增加缺失头文件声明。 · 已解决

风险与影响

  1. 兼容性风险:新 pin e21c821f 是 f5a76426 的唯一子提交,仅增加一行 include,理论上是纯增量;但仍需确认所有支持 CUDA 版本(12.6/12.8)与 SM 架构编译不受影响,PR body 仅提供 CUDA 12.9 的验证数据。
  2. 同步风险:tools/install_deepgemm.sh 与 cmake/external_projects/deepgemm.cmake 两处 pin 必须保持一致,任何一处遗漏都会导致不同构建路径引用不同 DeepGEMM 版本。
  3. 回归风险:DeepGEMM 是核心 kernel 依赖,若上游后续改动该分支,可能引入行为变化;但本 PR 基线内容未变,模型输出不受影响。

影响范围集中在构建系统:修复 CUDA 12.9 下 x86_64/aarch64 wheel 与 release 镜像的编译失败,直接影响 release 发布流水线。对运行时无影响,不改变模型输出与 serving 行为,用户无需感知。对团队而言,解锁了 CUDA 12.9 的发布阻塞,并明确了 DeepGEMM 依赖 pin 的同步维护要求。

构建系统变更 依赖 pin 双文件同步

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论