Prhub

#24234 [docker] Fix silently-masked cubin download failure; skip prebuilt cubins on aarch64

原始 PR 作者 mispa-ms 合并时间 2026-05-05 00:08 文件变更 1 提交数 2 评论 3 代码增减 +18 / -9

执行摘要

修复 Docker 构建中 cubin 下载失败被静默掩盖的问题

自 PR#22160(2025-04-09)后,aarch64 的 Docker 构建 nightly 版本一直静默失败,表现为 docker build 的中途阶段(RUN 命令)报告 DONE 0(看似成功),但在后续 COPY 阶段因缺少文件而报错。根本原因是 bash 脚本中 || true 的优先级导致整个下载重试链被屏蔽,且 aarch64 上没有可用的预编译 cubin 变体。

值得快速合并,尤其是对于有 aarch64 Docker 构建需求的团队。PR 本身聚焦、改动清晰,且经过验证。

讨论亮点

无 review 讨论线程。

实现拆解

  1. Scoping || true to the cleanup find only:将 find ... -exec rm -rf {} + 2>/dev/null || true 包裹在子 shell 中(通过括号),使 || true 仅作用于清理命令,不再吞噬整个 && 链的失败。
  2. Adding aarch64 detection and skip:在 cubin 下载循环前检测 $(uname -m),若为 aarch64 则直接设置 success=1 并跳过下载,并打印明确日志说明原因。
  3. Defensive mkdir -p:显式创建 /root/.cache/huggingface/root/.cache/sglang 目录,避免因过早跳过下载而导致后续 COPY 失败。
  4. Replacing [ -f ... ] && mv ... || true with conditional:将之前的隐含失败屏蔽写法改为 if [ -f ... ]; then mv ...; fi,使真实的 mv 错误能够暴露。
文件 模块 状态 重要度
docker/Dockerfile 部署脚本 modified 4.69

关键源码片段

docker/Dockerfile infrastructure

所有变更均在此文件中,修复了 bash 脚本中 `|| true` 导致的静默失败,添加了 aarch64 检测和跳过预编译 cubin 下载的逻辑,并进行了防御性目录创建。

# docker/Dockerfile (partial: framework_final stage)
RUN --mount=type=cache,target=/root/.cache/pip \
    cd /sgl-workspace/sglang \
    && python3 -m pip install --no-deps -e "python[${BUILD_TYPE}]" \
    && kernels lock python \
    && ( success=0; \
         # aarch64: kernels-community/sgl-flash-attn3 不发布 arm 变体;
         # 运行时通过 JIT 编译内核。
         # 一旦上游发布 arm cubin,应移除此分支。
         if [ "$(uname -m)" = "aarch64" ]; then \
           echo "Skipping kernels-community/sgl-flash-attn3 cubin download on aarch64 (no variants published upstream); kernels will be JIT-compiled at runtime"; \
           success=1; \
         else \
           for i in 1 2 3; do \
             echo "Attempt $i/3: downloading sgl-kernel cubins..." && \
             kernels download python && \
             success=1 && break; \
             echo "sgl-kernel cubin download failed, retrying in 30s..." && sleep 30; \
           done; \
         fi; \
         [ "$success" = "1" ] ) \
    && mkdir -p /root/.cache/huggingface /root/.cache/sglang \
    && ( if [ -f python/kernels.lock ]; then mv python/kernels.lock /root/.cache/sglang/; fi ) \
    && ( find /usr/local/lib/python3.12/dist-packages -type d -name "__pycache__" -exec rm -rf {} + 2>/dev/null || true )

评论区精华

没有提炼出高价值讨论线程

当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。

风险与影响

风险较低,主要影响 aarch64 Docker 构建:

  • 跳过 cubin 下载后,运行时将通过 JIT 编译内核,可能导致首次推理延迟增加(但当前已有静默失败路径也是 JIT)。
  • mkdir -p 的添加是防御性的,不会影响 x86_64 构建。
  • x86_64 构建行为完全不变。

影响范围仅限于 Docker 构建流程:

  • 修复了 aarch64(如 Grace Blackwell)Docker 构建的静默失败问题。
  • x86_64 构建不受影响。
  • 用户无感知。

关联 Issue

#22160 [Docker] Optimize Dockerfile for BuildKit layer caching

完整报告

参与讨论