Prhub

#47032 [CI/Build] Add CPU test dependency pre-commit hooks

原始 PR 作者 bigPYJ1151 合并时间 2026-06-30 15:59 文件变更 3 提交数 9 评论 24 代码增减 +1306 / -21

执行摘要

为 CPU 测试依赖添加 pre-commit 自动编译钩子

原先 CPU 测试的依赖是手动维护的,容易与 CUDA 测试环境脱节,导致 CI 失败。通过添加 pre-commit 钩子,从统一的 CUDA 源文件编译 CPU 版本,确保两者依赖版本完全一致,降低维护成本。

值得精读。该 PR 展示了一种多平台依赖管理的实用模式——通过 pre-commit 钩子和 uv pip compile--torch-backend 参数,从单一源文件生成多平台锁文件,极大降低了维护成本。特别适合有多个硬件后端的项目参考。

讨论亮点
  • overrides vs 直接编译:hmellor 建议使用 --overrides 文件来覆盖 torch 等版本,但 bigPYJ1151 发现 cuda.in 已不再包含设备标签,且 mamba-ssm 已删除,因此直接编译即可,无需额外 overrides。
  • files 匹配模式:hmellor 指出 CUDA 文件变更不一定需要触发 CPU 编译,建议将 files 改为只匹配 CPU 相关文件(如 ^requirements/(common|cpu|test/(cuda|cpu))\.(in|txt)$),并排除 cuda.txt 本身,避免不必要的钩子运行。
  • 安全漏洞depthfirst-app[bot] 报告 cpu.txt 中多个依赖存在已知 CVE(如 aiohttp、pyjwt 等),hmellor 询问是否应立即修复,bigPYJ1151 决定暂不处理,优先与 CUDA 版本同步以避免 CI 失败。

实现拆解

  1. 新增 pre-commit 钩子:在 .pre-commit-config.yaml 中添加 pip-compile-cpu 本地钩子,使用 uv pip compilerequirements/test/cuda.in 编译为 requirements/test/cpu.txt,指定 --torch-backend cpu--python-platform x86_64-manylinux_2_28
  2. 简化 Dockerfile:在 Dockerfile.cpu 中,用一条 COPY 和简化的 RUN 命令替换原来的手动编译步骤,直接从预生成的 cpu.txt 安装依赖,移除了对 cpu.in 的依赖和 sed 脚本。
  3. 删除辅助脚本(隐式):原有 tools/pre_commit/generate_cpu_test.py 不再需要,因为钩子已直接通过 CLI 参数完成编译。
  4. 配置触发范围:钩子的 filesexclude 规则确保仅当 requirements/test/cuda.inrequirements/test/cpu.txtrequirements/cpu.txt 等文件变化时才会触发,避免 CUDA 无关变更触发 CPU 重新编译。
文件 模块 状态 重要度
requirements/test/cpu.txt 依赖管理 added 4.78
docker/Dockerfile.cpu Docker 部署 modified 4.29
.pre-commit-config.yaml 钩子配置 modified 4.01

关键源码片段

docker/Dockerfile.cpu infrastructure

简化了 CPU 测试依赖的安装流程,移除手动编译步骤,直接使用钩子生成的锁文件,是确保 CI 一致性关键。

# 从 base 阶段构建 CPU 测试依赖
FROM base AS vllm-test-depsWORKDIR /vllm-workspace# 直接复制预编译的 CPU 依赖锁文件,不再需要手动编译
# 之前版本需要 COPY requirements/common.txt 等文件,并运行大量 sed 命令
COPY requirements/test/cpu.txt requirements/test/cpu.txt
​
# arm64 平台上删除不支持的包(decord, terratorch)
RUN case "$(uname -m)" in \
    aarch64|arm64) sed -i '/^decord==/d; /^terratorch==/d' requirements/test/cpu.txt ;; \
    esac# 缓存的 uv 安装
RUN --mount=type=cache,target=/root/.cache/uv \
    uv pip install -r requirements/test/cpu.txt

评论区精华

使用 overrides 文件还是直接编译 设计

hmellor 建议添加 `cpu.overrides` 文件来覆盖特定版本,但 bigPYJ1151 确认 `cuda.in` 已清理,无需 overrides。

结论:直接编译即可,保持简洁。 · 已解决

钩子的 files 匹配模式 设计

hmellor 指出 CUDA 文件变化不应总是触发 CPU 编译,建议缩小匹配范围,排除 cuda.txt。

结论:采纳建议,设置 `files` 为 `^requirements/(common|cpu|test/(cuda|cpu))\.(in|txt)$` 并 `exclude: ^requirements/test/cuda\.txt$`。 · 已解决

生成文件中的安全漏洞 安全

depthfirst-app[bot] 报告多个 CVE,hmellor 询问是否升级,bigPYJ1151 认为先与 CUDA 同步版本,漏洞后续处理。

结论:暂不修复,优先主线同步。 · deferred

风险与影响

  • 版本同步风险:CPU 依赖完全从 CUDA 源编译,可能引入仅与 CUDA 环境兼容的版本,导致 CPU 测试失败。但 --torch-backend cpu 会强制解析 CPU 兼容 wheel,风险较低。
  • 安全漏洞积累:多个依赖(如 aiohttp、pyjwt、h11 等)存在已知漏洞,当前暂未升级,可能影响测试环境安全性。应规划后续同步修复。
  • arm64 兼容性:Dockerfile 中移除手动 sed 调整后,仅在 cpu.txt 上对 arm64 额外删除 decordterratorch,若未来 cpu.txt 中这些包版本变化,可能导致 arm 构建失败。
  • 钩子误触发:如果 files 规则不严谨,可能编辑无关文件时触发钩子,增加开发延迟。但当前规则已限制在特定路径,风险较低。
  • 对用户:CPU 测试用户(开发者、CI)不再需要手动维护 cpu.txt,依赖更新会自动与 CUDA 同步,减少环境不一致问题。
  • 对系统:简化了 Docker 构建流程,减少构建时间,但新钩子会增加 pre-commit 运行时间(在相关文件修改时)。
  • 对团队:维护工作减少,但需关注安全漏洞的后续修复;arm64 构建需额外留意。
  • 影响范围:仅涉及 CPU 测试环境和 CI 流程,不影响 GPU 或其他后端。
安全漏洞未解决 arm64 兼容性依赖构建时 sed

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论