Prhub

#27387 build(sgl-kernel): support configurable mirrors for restricted networks

原始 PR 作者 acelyc111 合并时间 2026-06-08 23:52 文件变更 5 提交数 9 评论 8 代码增减 +82 / -27

执行摘要

sgl-kernel 构建支持可配置镜像源,适配受限网络

根据 PR body:Make sgl-kernel Docker builds work in restricted-network or mirrored environments (internal artifactory, region-blocked GitHub, etc.) by making every external source a configurable mirror.

此 PR 是 sgl-kernel 构建基础设施的关键改进,尤其适合有内部镜像需求的企业用户。建议重点阅读 Dockerfile 中的 yum 镜像替换模式以及 CMakeLists.txt 中从 GIT_REPOSITORY 迁移到 URL 的写法,这些模式可复用于其他构建项目。

讨论亮点

review 中主要讨论了三个问题:

  1. URL 规范化:gemini-code-assist 和 Copilot 建议在 build.sh 和 CMakeLists.txt 中对 GITHUB_ARTIFACTORY 进行协议剥离和尾部斜杠处理,避免用户误传 https:// 导致 URL 重复。作者 @acelyc111 回应“not needed, users know how to fix it from error msg.”,拒绝添加校验逻辑。
  2. flashmla 未使用镜像:Copilot 指出 cmake/flashmla.cmake 仍使用 GIT_REPOSITORY 而非镜像机制。作者在后续提交中修改为 URL 方式,并单独处理了子模块 cutlass 的下载。
  3. 缺少 URL_HASH:Copilot 建议为所有 FetchContent URL 添加 URL_HASH 以保证供应链完整性。最终代码中已全部添加 SHA256 哈希。

实现拆解

  1. 注入构建参数(sgl-kernel/build.sh):新增 GITHUB_ARTIFACTORY、PYTORCH_INDEX_BASE、PIP_DEFAULT_INDEX、YUM_MIRROR 四个环境变量的读取和回显,通过 docker build --build-arg 传递给 Docker 构建。在 docker run 阶段,将 GITHUB_ARTIFACTORY 作为环境变量注入容器,供 CMake 构建时使用。
  2. Dockerfile 层处理:在 deps 阶段使用 ARG 声明新变量,新增 YUM_MIRROR 的处理逻辑——当变量非空时替换 yum 源为镜像;安装 libzstd-devel 和 xxhash-devel 以避免 ccache 的 CMake 模块因硬编码 FetchContent 失败;将 PyTorch 安装索引从 PYTORCH_MIRROR 改为 PYTORCH_INDEX_BASE(完整的 URL),并在 build 阶段重新声明 GITHUB_ARTIFACTORY 以便 CMake 的 FetchContent 正确使用镜像。
  3. CMakeLists.txt 依赖获取改造:6 个 FetchContent 声明(cutlass、fmt、triton、flashinfer、sgl-attn、mscclpp)从 GIT_REPOSITORY + GIT_TAG 模式改为 URL + URL_HASH 模式,URL 使用 https://${GITHUB_ARTIFACTORY}/... 形式。对 mscclpp 额外 patch 其 CMakeLists.txt 中硬编码的 nlohmann/json 获取,也通过 GITHUB_ARTIFACTORY 镜像。
  4. flashmla 子模块处理(sgl-kernel/cmake/flashmla.cmake):flashmla 的 archive 不包含子模块 cutlass,因此单独通过 FetchContent 将特定版本的 cutlass 放入 flashmla 的 csrc/cutlass 目录。
  5. Makefile 协同(sgl-kernel/Makefile):增加对 GITHUB_ARTIFACTORY 的传递逻辑,若该变量非空则追加到 CMAKE_ARGS 中,使得本地构建(非 Docker)也能使用镜像。
文件 模块 状态 重要度
sgl-kernel/Dockerfile Docker 构建 modified 5.3
sgl-kernel/CMakeLists.txt CMake 配置 modified 4.67
sgl-kernel/build.sh 构建脚本 modified 4.14
sgl-kernel/Makefile Make 配置 modified 4.05
sgl-kernel/cmake/flashmla.cmake flashmla 构建 modified 3.96

关键源码片段

sgl-kernel/CMakeLists.txt configuration

核心构建配置文件:将六个第三方依赖的获取方式从 git clone 改为 URL 下载,并添加 URL_HASH;新定义 GITHUB_ARTIFACTORY 变量;对 mscclpp 进行源码 patch 以镜像其内部依赖。

# GitHub Artifactory: default to github.com, can be overridden via -DGITHUB_ARTIFACTORY=...
set(GITHUB_ARTIFACTORY "github.com" CACHE STRING "GitHub mirror URL")# Example: cutlass now uses URL instead of GIT_REPOSITORY, with SHA256 hash
FetchContent_Declare(
  repo-cutlass
  URL https://${GITHUB_ARTIFACTORY}/NVIDIA/cutlass/archive/57e3cfb47a2d9e0d46eb6335c3dc411498efa198.tar.gz
  URL_HASH SHA256=09237099a70f80bff1dc8bb80c843a674bb4fdcb46e43cc6993e711c5ca89bb5
)
FetchContent_Populate(repo-cutlass)# Similarly for fmt, triton, flashinfer, sgl-attn, mscclpp...# mscclpp's own CMakeLists.txt hardcodes a github.com FetchContent for nlohmann/json.
# Patch it to route through GITHUB_ARTIFACTORY
file(READ "${repo-mscclpp_SOURCE_DIR}/CMakeLists.txt" _mscclpp_cmakelists)
string(REGEX REPLACE
  "https://github.com/nlohmann/json"
  "https://${GITHUB_ARTIFACTORY}/nlohmann/json"
  _mscclpp_cmakelists "${_mscclpp_cmakelists}")
file(WRITE "${repo-mscclpp_SOURCE_DIR}/CMakeLists.txt" "${_mscclpp_cmakelists}")
sgl-kernel/cmake/flashmla.cmake core-logic

flashmla 特殊处理:因 GitHub archive 不包含子模块,单独使用 FetchContent 将 cutlass 放入预期路径,确保 flashmla 编译不依赖 git submodule update。

# flashmla: the archive from GitHub does not include git submodules.
# We need to manually fetch the pinned cutlass version into the csrc/cutlass directory.
FetchContent_Declare(
  repo-flashmla-cutlass
  URL https://${GITHUB_ARTIFACTORY}/NVIDIA/cutlass/archive/147f5673d0c1c3dcf66f78d677fd647e4a020219.tar.gz
  URL_HASH SHA256=9f6c53320a85b4a570975e557918cde65168cd311f081920446c238437347dc6
  SOURCE_DIR ${repo-flashmla_SOURCE_DIR}/csrc/cutlass
)
FetchContent_Populate(repo-flashmla-cutlass)

评论区精华

GITHUB_ARTIFACTORY 是否需要输入校验 设计

gemini-code-assist 和 Copilot 建议在 build.sh 和 CMakeLists.txt 中对 GITHUB_ARTIFACTORY 进行协议剥离和尾部斜杠处理,以避免用户误传 https:// 导致 URL 畸形。

结论:作者 @acelyc111 回应“not needed, users know how to fix it”,拒绝添加校验。PR 合并时未增加校验逻辑。 · unresolved

flashmla 未使用镜像机制 正确性

Copilot 指出 cmake/flashmla.cmake 仍使用 GIT_REPOSITORY 而不是统一的 GITHUB_ARTIFACTORY 镜像方案,在 GitHub 被屏蔽时构建会失败。

结论:作者在后续提交(1fc5bd0)中修改 flashmla 为 URL 方式,并单独处理子模块 cutlass,问题已解决。 · 已解决

FetchContent 缺少 URL_HASH 安全性 安全

Copilot 建议为所有 FetchContent URL 添加 URL_HASH 以确保供应链完整性和构建可重复性。

结论:作者在最终代码中为每个 FetchContent 添加了 SHA256 哈希,问题已解决。 · 已解决

风险与影响

  1. URL 格式风险(sgl-kernel/build.sh、sgl-kernel/CMakeLists.txt):GITHUB_ARTIFACTORY 无输入校验,若用户误传 https:// 或尾部斜杠,将产生畸形 URL(如 https://https://mirror/),导致构建失败。尽管作者认为用户可自行纠错,但仍是潜在的可用性问题。
  2. 子模块版本同步风险(sgl-kernel/cmake/flashmla.cmake):flashmla 所需的 cutlass 版本通过固定 SHA 单独 fetch,若 flashmla 上游更新 submodule pin,该固定 SHA 可能失效或导致编译不兼容,需人工维护对齐。
  3. 镜像兼容性风险(sgl-kernel/Dockerfile):YUM_MIRROR 通过 sed 替换 baseurl,若镜像站点结构不同(如缺少某些 repo),yum 安装可能失败。
  4. 额外的系统依赖(sgl-kernel/Dockerfile):新增 libzstd-devel 和 xxhash-devel 仅在基于 AlmaLinux 的 manylinux 镜像中可用,若 BASE_IMG 切换为其他发行版,这些包名可能不存在。

用户侧:可在受限网络环境中通过设置环境变量(如 GITHUB_ARTIFACTORY=my.mirror)一键完成 sgl-kernel 构建,无需手动修改 Dockerfile 或替换下载源。系统侧:构建层缓存策略保持不变,但新增的 yum 镜像替换步骤会随 YUM_MIRROR 的值变化而失效缓存。团队侧:需维护多个镜像变体的兼容性测试,尤其是 flashmla 子模块与主库的版本对齐。

GITHUB_ARTIFACTORY 缺少输入校验 flashmla 子模块版本对齐风险 yum 镜像替换兼容性风险 新增系统依赖仅适配 AlmaLinux

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论