Prhub

#21778 Cache nvidia wheels locally to skip repeated 830 MB downloads in CI

原始 PR 作者 hnyls2002 合并时间 2026-04-01 07:06 文件变更 2 提交数 14 评论 1 代码增减 +36 / -6

执行摘要

通过本地缓存 Nvidia wheels,避免 CI 中每次运行重复下载 830 MB 文件,显著缩短安装时间。

PR body 指出:'pypi.nvidia.com returns Cache-Control: no-store, causing pip to re-download cudnn (~707 MB) and nvshmem (~125 MB) on every CI run.' 这导致 CI 运行效率低下,浪费时间和带宽,目标是通过本地缓存避免重复下载。

对于 CI 维护者和工程师,此 PR 值得关注,展示了如何通过本地缓存和完整性验证优化大型依赖下载。建议学习其设计模式,并考虑推广到其他类似 CI 场景以提升效率。

讨论亮点

review 评论为空,但 commit 历史显示作者迭代了多个方案:初始使用 pip 约束,后改为本地缓存,最终采用 curl 下载和完整性检查。这表明了在 CI 环境中解决缓存问题的设计演进,例如从 'pip download' 回退到 'curl' 以绕过 no-store 限制。

实现拆解

实现分为两部分:1) 新增脚本 'scripts/ci/cuda/cache_nvidia_wheels.sh',使用 curl 将 Nvidia wheels 下载到持久化目录 '/root/.cache/nvidia-wheels/',通过 'unzip -t' 验证文件完整性,并预安装以确保 pip 识别为已满足依赖;2) 修改 'scripts/ci/cuda/ci_install_dependency.sh',提取 Nvidia 包版本为变量(NVIDIA_CUDNN_VERSION 和 NVIDIA_NVSHMEM_VERSION)以避免硬编码,并在安装主包前 source 缓存脚本。

文件 模块 状态 重要度
scripts/ci/cuda/cache_nvidia_wheels.sh CI/CD 基础设施 added 7.0
scripts/ci/cuda/ci_install_dependency.sh CI/CD 基础设施 modified 6.0

分析完成后,这里会展示 LLM 生成的相对完整源码片段和详细注释。

评论区精华

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

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

风险与影响

风险包括:1) 本地缓存文件可能损坏或过期,但脚本使用 'unzip -t' 进行完整性验证以缓解;2) wheels 的 URL 硬编码了特定版本(如 9.10.2.21),若 Nvidia 更新版本,脚本需手动更新,可能影响兼容性;3) 缓存目录 '/root/.cache/nvidia-wheels/' 依赖特定路径,在不同 CI 环境中可能存在权限或可用性问题,但已添加 'mkdir -p' 确保目录创建。

正面影响:CI 运行时间显著减少,安装主包时间从 175 秒降至 90 秒,总安装时间从约 4.5 分钟缩短到 1.5 分钟,提升了 CI 效率和开发速度。对用户和开发者透明,无需额外配置。潜在影响:若缓存机制失败,可能回退到下载,但脚本设计了验证步骤来最小化风险。

依赖版本硬编码 缓存完整性风险

关联 Issue

未识别关联 Issue

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

完整报告

执行摘要

本 PR 通过新增本地缓存脚本,解决了 CI 中因 pypi.nvidia.com 的 no-store 缓存策略导致的重复下载问题,将 Nvidia wheels 下载时间从每次 830 MB 减少到零,显著提升了 CI 运行效率,属于基础设施优化。

功能与动机

由于 pypi.nvidia.com 返回 Cache-Control: no-store,pip 在每次 CI 运行中都会重新下载约 830 MB 的 Nvidia wheels(包括 nvidia-cudnn-cu12 和 nvidia-nvshmem-cu12),造成时间和带宽浪费。PR body 明确指出:"pypi.nvidia.com returns Cache-Control: no-store, causing pip to re-download cudnn (~707 MB) and nvshmem (~125 MB) on every CI run." 目标是通过本地缓存避免重复下载,缩短 CI 安装时间。

实现拆解

实现主要包括两个文件变更:

  1. 新增脚本 scripts/ci/cuda/cache_nvidia_wheels.sh

    • 使用 curl 下载 wheels 到持久化目录 /root/.cache/nvidia-wheels/
    • 通过 unzip -t 验证文件完整性,避免使用损坏的缓存。
    • 预安装 wheels 使后续 pip install 看到 "Requirement already satisfied"。
    • 代码示例:
      whl="$NVIDIA_WHEEL_CACHE/$(basename "$url")"
      [ -f "$whl" ] && unzip -tq "$whl" &>/dev/null || curl -fL -o "$whl" "$url"
      
  2. 修改脚本 scripts/ci/cuda/ci_install_dependency.sh

    • 提取版本变量 NVIDIA_CUDNN_VERSIONNVIDIA_NVSHMEM_VERSION,避免硬编码。
    • 在安装主包前调用缓存脚本:source "$(dirname "$0")/cache_nvidia_wheels.sh"
    • 更新依赖检查逻辑,使用变量版本号进行比较。

评论区精华

review 评论为空,但 commit 历史揭示了设计迭代过程:

作者尝试了多种方案,从初始的 pip 约束到本地缓存,最终采用 curl 下载和完整性检查。例如,commit 消息显示:"Use curl with file-exists check instead of pip download pip download also respects no-store and re-downloads every time." 这表明了绕过 no-store 限制的实用技巧。

风险与影响

风险

  • 依赖版本硬编码:脚本中 wheels 的 URL 包含固定版本号,若 Nvidia 更新版本,需手动更新脚本,否则可能导致兼容性问题。
  • 缓存完整性风险:尽管使用 unzip -t 验证,但极端情况下缓存文件可能损坏,脚本会重新下载,增加失败风险。
  • 环境依赖性:缓存目录 /root/.cache/nvidia-wheels/ 假设特定权限和路径,在不同 CI 环境中可能不适用。

影响

  • 正面影响:CI 安装时间大幅减少,从约 4.5 分钟缩短到 1.5 分钟,提升开发效率,减少带宽消耗。
  • 范围:影响所有使用该 CI 脚本的运行器,但对最终用户透明,无需额外配置。

关联脉络

与近期历史 PR 关联:

  • PR #21751PR #21753:同属 CI 优化类别,分别修复测试超时和测试套件检测问题,与本 PR 共同构成 CI 基础设施的持续改进脉络。
  • 整体趋势:团队正专注于提升 CI 效率和可靠性,减少等待时间和资源浪费,本 PR 是这一方向的具体实践。

参与讨论