Prhub

#56545 [Build][NVIDIA] Update public Rubin dependencies and MSA compatibility

原始 PR 作者 wangshangsam 合并时间 2026-09-16 07:29 文件变更 3 提交数 6 评论 11 代码增减 +18 / -8

执行摘要

Rubin 依赖升级至公开版,修复 MSA 与 Quack 兼容性

Rubin 平台(SM100 系列)的构建此前依赖预发布包与临时 pin,requirements/rubin-prerelease.txt 文件头的 TODO 明确记录了长期目标:Rubin API 进入常规 PyTorch wheel 后(vllm-project/vllm#49735)删除该文件。PR body 的 Purpose 说明本次要做两件事:'Update public Rubin dependencies and the MSA revision for Quack/CuTe DSL compatibility'——把所有 Rubin 依赖切换到公开发布版,同时推进 MSA revision 以纳入 MSA#12 的兼容修复。此外还处理了三个工程细节:--pre 选项会被 uv 忽略(属于无效配置);Torch nightly 必须与对应架构的 torchvision wheel 配对;Quack 需要与既有 Rubin 排除项一起从标准 CUDA wheel 元数据中剥离,避免双处 pin 冲突。

该 PR 属于构建链维护而非算法演进,不必逐行精读,但建议工程负责人与做新硬件平台支持的同学阅读其 PR body——它演示了一套完整的硬件 bring-up 验证模板:依赖解析(uv pip check)+ 镜像构建 + 双模型 TP4 端到端 smoke + 数值内核对照 + 已知失败如实披露。值得借鉴的设计决策包括:按平台架构分 pin 以匹配 torchvision wheel 约束、用 Dockerfile 剥离 + 专用 requirements 文件双保险避免 pin 冲突、固定外部内核仓库 revision 保证可复现。x86_64 侧缺失运行时验证与 nixl_ep 不可用属于已知风险,后续 Rubin 常规化(#49735)时应补上。

讨论亮点

本 PR 没有 review 级的技术争论(review comments 为 0),值得记录的讨论点集中在协作流程:

  • fork 自动 review 被禁用:claude[bot] 提示该 PR 来自 fork,automated review 被禁用,需要维护者显式调用 @claude review 才会执行一次性 review;最终未触发,改由维护者直接批准。
  • CI 多次重试收尾:作者在两次 merge main 后分别触发 Buildkite CI #88914 与 #88942;#88942 首轮 5 个失败 job,经两次 /ci retry(5→2→1)收敛为全绿。
  • 批准结论:tlrmchlsmth 以 APPROVED 状态通过,未附任何修改意见。

实现拆解

本 PR 的变更入口是 requirements/rubin-prerelease.txt,三个文件的修改可拆为四步:

  1. 依赖 pin 全面更新(requirements/rubin-prerelease.txt):删除 --pre 与旧 PyTorch nightly 索引行(uv 忽略 --pre,属于无效配置);补充 FlashInfer 官方 extra-index-url——cu134 专用与通用两个索引,因为 flashinfer-jit-cache、flashinfer-cubin 这类 wheel 只发布在 FlashInfer 索引上。Torch nightly 从统一的 2.15.0.dev20260903+cu134 改为按 platform_machine 分开 pin(x86_64 用 0909、aarch64 用 0908),以匹配各平台 torchvision wheel 的依赖约束;torchaudio 跟进 0911 的 ABI3 版本。FlashInfer Python 绑定从 0.6.18 升到 0.6.18.post1,并新增 Quack 0.6.5、CUDA Python 13.4.1、CUDA bindings 13.4.1、NIXL 1.4.1 等公开发布版 pin;nvidia-cutlass-dsl[cu13]==4.8.0.dev0 维持不变。

  2. Dockerfile 剥离列表扩展(docker/Dockerfile):sed 匹配正则从 flashinfer-python|nvidia-cutlass-dsl\[cu13\] 扩展为包含 quack-kernels。这样在 INSTALL_RUBIN_PRERELEASE=true 时,标准 requirements/cuda.txt 中这三个包会被剔除,统一改由 rubin-prerelease.txt 精确控制,避免不同文件对同一包出现两个 pin。

  3. MSA 外部内核版本前进(cmake/external_projects/fmha_sm100.cmake):SM100 FMHA 的 FetchContent_Declare 中 GIT_TAG 从 087c161814d4d9c735b46c21212a09e5f8eb92fa 前进到 f355c37eb4e1413f21ee2ad8bbad25079e6bef9d,纳入 MSA 仓库 PR #12(Quack 0.6.5 / CuTe DSL 4.8 兼容修复),这是本次构建兼容性修复的实质内容。

  4. 验证与收尾:作者在 aarch64 CUDA 13.4 容器内完成镜像构建,并用 Qwen3.6-35B-A3B-FP8 与 MiniMax-M3-NVFP4(TP4)做端到端 smoke:两组均 20/20 exact-answer、GSM8K 15/16;CI 经数次 retry 后全绿,随后由维护者批准合并。

文件 模块 状态 重要度
requirements/rubin-prerelease.txt 依赖配置 modified 3.4
docker/Dockerfile 构建镜像 modified 2.78
cmake/external_projects/fmha_sm100.cmake 外部依赖 modified 2.54

关键源码片段

cmake/external_projects/fmha_sm100.cmake build-config

MSA 外部内核仓库的 revision 前进,纳入 MSA#12 的 Quack 0.6.5 / CuTe DSL 4.8 兼容修复,是本次兼容性修复的实质内容。

# SM100 FMHA 内核来源于 vllm-project/MSA 仓库。固定 revision 保证可复现
# 构建;本次前进到 f355c37e 以纳入 MSA#12,修复与 Quack 0.6.5 /
# CuTe DSL 4.8 的兼容问题。
FetchContent_Declare(
  fmha_sm100
  GIT_REPOSITORY https://github.com/vllm-project/MSA.git
  GIT_TAG f355c37eb4e1413f21ee2ad8bbad25079e6bef9d
  GIT_PROGRESS TRUE
  CONFIGURE_COMMAND ""
  BUILD_COMMAND ""
)

评论区精华

CI 触发与失败重试 other

PR 在两次 merge main 后分别触发 Buildkite CI #88914 与 #88942;#88942 首轮 5 个 job 失败,作者连续两次执行 `/ci retry`,失败数从 5 收敛到 2 再到 1,最终全绿。

结论:CI 最终通过,未遗留失败项;维护者 tlrmchlsmth 随后批准合并。 · 已解决

fork PR 的自动 review 策略 other

claude[bot] 提示该 PR 来自 fork,自动化 review 被禁用,需要维护者显式调用 `@claude review` 才会执行一次性 review。

结论:未触发额外的 bot review,改由维护者 tlrmchlsmth 直接批准。 · 已解决

风险与影响

  1. 跨架构行为分叉:rubin-prerelease.txt 按 platform_machine 把 Torch nightly 分成 0909(x86_64)与 0908(aarch64)两个版本,两平台算子行为与缓存格式可能不一致;且 GPU 运行时验证只在 aarch64 完成,x86_64 仅做过依赖解析与 wheel 元数据检查。
  2. 可选组件不可用:NIXL 1.4.1 没有为 Torch 2.15 提供 nixl_ep 扩展,该可选导入会失败,TP4 部署并不代表 EP 支持已建立;MiniMax 日志反复出现 multicast / CUDA_ERROR_NOT_PERMITTED workspace 警告和 FlashInfer all-reduce norm fusion 初始化错误,相关集合通信优化处于不可用状态。
  3. 上游打包问题:aarch64 上 uv pip check 会拒绝 cuSPARSELt 0.8.1 wheel 的 manylinux2014_sbsa 平台标签(其库本身是 AArch64 ELF),会卡住严格的静态检查管线。
  4. 外部源码 pin 的维护债:fmha_sm100.cmake 指向 MSA 仓库固定 revision,后续 Quack / CUTLASS DSL 升级若不同步推进 MSA,会出现构建期不兼容。
  5. 索引可用性依赖:flashinfer-jit-cache==0.6.18.post1+cu134 这类带本地版本标识的 pin 依赖 FlashInfer 官方索引持续可用,离线或受限网络环境无法解析。

影响面集中在 INSTALL_RUBIN_PRERELEASE=true 的 Rubin 镜像构建路径,标准 CUDA 构建不受影响(Dockerfile 的剥离逻辑仅在 Rubin 分支执行)。对用户而言,Rubin 构建从预发布依赖切换为公开发布版,可复现性提升,MSA 与 Quack 0.6.5 / CuTe DSL 4.8 的兼容问题得到修复;对团队而言,本 PR 是 Rubin 平台 bring-up(#49735)链路中的依赖收敛节点,承接 NIXL 1.4.1(#54355)与 CUTLASS DSL 4.7+(#54927)的后续演进,也为 #56489 的批量依赖更新划清了 Rubin-specific 边界。由于没有生产代码逻辑变更,模型行为与线上 serving 不受影响。

跨架构 Torch nightly 配对差异 可选 nixl_ep 扩展缺失 cuSPARSELt wheel 平台标签不兼容 外部 MSA 仓库 pin 依赖 GPU 验证仅覆盖 aarch64 FlashInfer collective 优化未确认可用

关联 Issue

#54355 [NIXL] Bump NIXL version to 1.4.1
#54927 [CI] Bump CUTLASS DSL to 4.7
#56489 Bump the minor-update group across 1 directory with 182 updates

完整报告

参与讨论