Prhub

#35756 [Docker] Defer CUDA 13 NCCL override until after dependency resolution

原始 PR 作者 Fridge003 合并时间 2026-08-21 05:48 文件变更 1 提交数 1 评论 0 代码增减 +12 / -9

执行摘要

调整 Docker 构建顺序,修复 CUDA 13 NCCL 冲突导致构建失败

CUDA 13 开发镜像构建在安装开发包和 runai-model-streamer 时失败(参考 CI 链接)。原因是 PyTorch 2.13 要求 nvidia-nccl-cu13==2.29.7,但 Dockerfile 先前在生成 constraints.txt 之前强制安装了 2.30.7,导致约束与 Torch 元数据冲突,pip 解析后续包时大量回溯,最终出现看似无关的 Matplotlib 构建失败。

该 PR 属于典型的构建依赖顺序修复,逻辑清晰,值得快速精读以理解 Dockerfile 中依赖安装顺序的重要性。无需深入审查风险,但可作为 Docker 多阶段构建和依赖约束处理的参考资料。

讨论亮点

本 PR 无 review 评论与讨论,因此没有可提炼的讨论内容。

实现拆解

  1. 移除早期 NCCL 覆盖:在 docker/Dockerfile 的 CUDA 13 分支中,删除了在安装开发依赖后就执行 pip install --force-reinstall --no-deps nvidia-nccl-cu13==${SGL_NCCL_VERSION} 的步骤,避免在生成 constraints.txt 前引入过高版本。
  2. 延迟覆盖至依赖解析后:在安装 runai-model-streamer 等受约束依赖之后,新增一个独立的 RUN 步骤,仅在 CUDA 13 下执行 NCCL 2.30.7 的覆盖安装,从而满足 DeepEP 运行时需求,同时不影响之前的依赖解析。
  3. ARG 作用域修正:将 ARG SGL_NCCL_VERSION 从文件前部移到实际使用它的 stage 中(runtime stage),避免与其他 stage 的 ARG 冲突,并保留了对 NCCL_VERSION 环境变量的规避注释。
  4. 保持 CUDA 12 行为不变:未改动 CUDA 12 相关的清理逻辑。
  5. 验证:未添加自动化测试(仅 Dockerfile 顺序调整),但现有 Docker 元数据单元测试 7 个通过,pre-commit 检查通过,完整 CUDA 13 构建依赖 CI 验证。
文件 模块 状态 重要度
docker/Dockerfile 部署脚本 modified 4.21

关键源码片段

docker/Dockerfile infrastructure

核心修改文件,调整了 NCCL 覆盖时机和 ARG 作用域,直接修复 CUDA 13 构建失败。

# 延迟 NCCL 覆盖到依赖解析之后,避免与 PyTorch 的 NCCL 约束冲突
# PyTorch 2.13 要求 nvidia-nccl-cu13==2.29.7,而 DeepEP 运行时需要 2.30.7
# 因此在生成 constraints.txt 并安装受约束依赖时保留 2.29.7,
# 待依赖解析完成后,再强制覆盖为 2.30.7。
RUN --mount=type=cache,target=/root/.cache/pip \
    if [ "${CUDA_VERSION%%.*}" = "13" ]; then \
        python3 -m pip install --force-reinstall --no-deps \
            "nvidia-nccl-cu13==${SGL_NCCL_VERSION}"; \
    fi# 使用独立的 SGL_NCCL_VERSION ARG,避免与基础镜像中的 ENV NCCL_VERSION 冲突
# nvidia/cuda 基础镜像已设置 NCCL_VERSION(Debian apt 格式,如 2.28.3-1),
# 若同名 ARG 会在 RUN 中遮蔽,导致 pip 解析到无效的 PyPI 版本。
ARG SGL_NCCL_VERSION

评论区精华

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

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

风险与影响

本次改动仅调整 Docker 构建步骤顺序,不涉及运行时逻辑,风险较低。主要风险点在于:

  • runai-model-streamer 等包在安装时意外依赖了 NCCL 2.30.7,可能导致安装失败(但原先也是先装后覆盖,行为一致)。
  • 新覆盖步骤在依赖解析后执行,若后续新增依赖对 NCCL 版本有要求,可能再次引入版本冲突。
  • 由于未在本地运行完整 CUDA 13 构建,实际构建成功与否依赖 CI 验证,存在一定不确定性。

影响范围仅限于 CUDA 13 开发镜像的构建过程,使用 CUDA 12 的构建流程完全不受影响。该修复解决了开发镜像构建失败的问题,对使用 CUDA 13 的开发者恢复构建能力有直接帮助;对生产运行时无影响,因为运行时 NCCL 版本仍为 2.30.7。

构建顺序变更 依赖版本冲突 未本地验证

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论