Prhub

#55171 [XPU][CI] Remove pip install dependency in test yaml files

原始 PR 作者 jikunshang 合并时间 2026-09-12 20:03 文件变更 7 提交数 2 评论 9 代码增减 +200 / -51

执行摘要

XPU CI 依赖统一收敛至 xpu.in,8 处 pip install 下线

PR body 只有一句核心表述:“move all dependency into requirements/test/xpu.in file”。其动机是:XPU 的 5 个 intel job yaml 中长期存在大量步骤级 pip install(tblib、av、matplotlib、ftfy、open-clip-torch、tensorizer、runai-model-streamer、lm_eval、modelscope、opentelemetry 四件套、gpt-oss[eval]),这些命令在每个测试步骤启动时都要联网重复解析和安装,既拖慢 CI(每个 step 多出几十秒到数分钟),又让依赖版本随上游漂移、难以复现。把这些依赖收进 XPU 测试镜像的 requirements 清单,可以做到“镜像一次装好、步骤直接跑测试”,与仓库中 requirements/.in + .txt 的既有依赖管理模式保持一致。

  1. 是否值得精读:对 Intel/XPU CI 维护者、以及负责 requirements 与镜像构建的同学值得精读;对做模型、内核、调度的工程师可快速略过(零运行时源码改动)。
  2. 值得关注的设计决策:把“步骤级 pip install”整体上移到镜像 requirements,是一次典型的 CI 依赖治理;阅读时应重点对照删除命令与 xpu.in 新增条目的映射表,确认没有遗漏(例如 pip install open-clip-torch --no-deps 改为带依赖解析的 open_clip_torch==2.32.0 属于语义变化,不只是形式迁移)。
  3. 建议的后续动作:跟进补上 requirements/test/xpu.in、requirements/test/xpu.txt 到 .buildkite/intel_jobs/*.yaml 的 source_file_dependencies 及 .buildkite/ci_config_intel.yaml;在 PR 描述中补测试证据(至少说明依赖已随镜像生效);对 gpt-oss 0.0.9 → 0.0.5、numpy 2.3.5 → 2.2.6 的锁文件回退给出验证结论或原因说明。
讨论亮点
  1. CodeRabbit 的唯一 actionable 评论(未解决):在 .buildkite/intel_jobs/test-intel.yaml 第 37 行提出“Update Intel CI trigger coverage by adding requirements/test/xpu.in and requirements/test/xpu.txt to the relevant source_file_dependencies and .buildkite/ci_config_intel.yaml configuration, ensuring changes to either XPU test requirements file schedule the affected XPU tests”,并附了 rg 'source_file_dependencies|image-build-xpu|requirements/test/xpu\.(in|txt)' 的静态分析脚本输出作为证据。PR 只提交了 remove pip install 与 merge main 两个 commit,该评论未见回复、也未在后续 commit 中修复。
  2. 人工评审只有一次 APPROVED:reviewer bigPYJ1151 直接 approve,没有留下文字意见,说明 Intel CI 侧维护者认可这次收敛方向。
  3. claude[bot] 因 fork 来源禁用自动评审:“This pull request is from a fork — automated review is disabled.”,因此本 PR 实质只经过 CodeRabbit 一轮自动审查,评审深度有限。
  4. 协作流程:作者在评论中发起两次 /ci run(Buildkite #88142、#88489),期间出现合并冲突,先请 @copilot 帮忙解决,随后以 Merge branch 'main' into kunshang/remove_pip_in_test 提交收尾——这也意味着 xpu.in 中 cohere/cohere_melody、opentelemetry 等部分条目可能混入了 main 的合并内容,diff 语义不够纯粹。

实现拆解

  1. 依赖清单归拢(requirements/test/xpu.in,+19/-3):新增 tblib==3.1.0、runai-model-streamer[s3,gcs,azure]>=0.15.7、tensorizer==2.10.1、av、gpt-oss[eval]==0.0.5、ftfy、matplotlib、open_clip_torch==2.32.0、opentelemetry-api/exporter-otlp/sdk/semantic-conventions-ai 四个带版本下限的条目,以及 cohere_melody>=0.11.1、cohere>=7.0.0 两个 parser/API 测试依赖;同时把原先裸写的 tblib 固定为 tblib==3.1.0、裸 gpt-oss 改为 gpt-oss[eval]==0.0.5,并补上文件末尾换行。
  2. 锁文件重算(requirements/test/xpu.txt,+172/-26):由 xpu.in 重新解析生成。新增链条包括 runai-model-streamer 的三个存储后端(boto3/botocore/s3transfer、google-cloud-storage/google-auth/google-api-core、azure-identity/azure-storage-blob/msal)、tensorizer 的 hiredis/libnacl、matplotlib 的 contourpy/cycler/fonttools/kiwisolver/pyparsing、open-clip-torch 引入的 ftfy;gpt-oss 由 0.0.9 回退到 0.0.5 并连带移除 jupyter-client/jupyter-core,numpy 由 2.3.5 降到 2.2.6,av==18.1.0、cohere==7.1.1 为新增固定版本。
  3. 流水线瘦身(5 个 .buildkite/intel_jobs/*.yaml,净 -18 行):删除的安装命令与其迁移目标一一对应:test-intel.yaml 去掉 pip install tblib==3.1.0 与 pip install av;misc_intel.yaml 去掉 lm_eval[api]>=0.4.12、modelscope<1.38、四条 opentelemetry 包与 av;models_multimodal_intel.yaml 去掉三处 av/matplotlib/ftfy 与 pip install open-clip-torch --no-deps;model_executor_intel.yaml 去掉 tensorizer==2.10.1 与 runai-model-streamer[s3,gcs,azure]>=0.15.7;lm_eval_intel.yaml 去掉 gpt-oss[eval]==0.0.5。改造后这些命令统一以 cd tests && pytest ... 开头,export 类环境变量(如 VLLM_WORKER_MULTIPROC_METHOD=spawn)保留在命令串内。
  4. 配套与缺口:gpt-oss[eval] 的 pin 从 yaml 迁到 xpu.in 后,锁文件里实际降级为 0.0.5,与 lm_eval 步骤原有 pin 对齐,但会影响其他依赖 gpt-oss 的用例;更关键的是 CodeRabbit 指出 .buildkite/intel_jobs/test-intel.yaml 等 job 的 source_file_dependencies 以及 .buildkite/ci_config_intel.yaml 均未加入 requirements/test/xpu.in 与 requirements/test/xpu.txt,导致后续只改依赖文件不会触发对应 XPU 测试。该 PR 未补测试代码,验证完全依赖两次 /ci run(Buildkite #88142、#88489)。
文件 模块 状态 重要度
requirements/test/xpu.in 测试依赖 modified 5.13
requirements/test/xpu.txt 依赖锁文件 modified 4.35
.buildkite/intel_jobs/test-intel.yaml 流水线配置 modified 3.6
.buildkite/intel_jobs/misc_intel.yaml 流水线配置 modified 3.55
.buildkite/intel_jobs/models_multimodal_intel.yaml 流水线配置 modified 3.76
.buildkite/intel_jobs/model_executor_intel.yaml 流水线配置 modified 3.11
.buildkite/intel_jobs/lm_eval_intel.yaml 流水线配置 modified 3.0

关键符号

xpu-example-test(Buildkite step key) xpu-server-test model-executor-intel xpu-gpqa-eval-gpt-oss multi-modal-processor metrics-tracing-2-gpus

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

评论区精华

CI 触发依赖未覆盖新增的 requirements/test/xpu.in(.txt) 测试

CodeRabbit 在 .buildkite/intel_jobs/test-intel.yaml 第 37 行提出:“Update Intel CI trigger coverage by adding requirements/test/xpu.in and requirements/test/xpu.txt to the relevant source_file_dependencies and .buildkite/ci_config_intel.yaml configuration, ensuring changes to either XPU test requirements file schedule the affected XPU tests.”,并用 rg 检索 source_file_dependencies / image-build-xpu / requirements/test/xpu.(in|txt) 的输出作为静态分析证据。

结论:未修复。PR 只有 remove pip install 与 merge main 两个 commit,评论无回复,评审人 bigPYJ1151 直接 approve 后合入,缺口被带到 main。 · unresolved

fork 来源 PR 的自动评审被禁用 other

claude[bot] 声明:“This pull request is from a fork — automated review is disabled. A repository maintainer can comment `@claude review` to run a one-time review.”,因此本 PR 只经历 CodeRabbit 一轮自动审查加一次人工 approve。

结论:维持禁用状态,没有触发额外一次性评审;评审覆盖度依赖人工 reviewer。 · 已解决

合并冲突与 CI 触发流程 other

mergify[bot] 提示存在 merge conflict 需要 rebase,作者先请求 @copilot 协助解决冲突,随后两次执行 `/ci run`(Buildkite #88142 / #88489),并以 “Merge branch 'main' into kunshang/remove_pip_in_test” 收尾。

结论:通过合并 main 解决冲突,CI 以最终 commit 4bbf81b 跑通并合入;但合并可能把 main 的依赖条目带入 xpu.in,使 diff 归因不够纯粹。 · 已解决

风险与影响

  1. CI 触发覆盖缺口(已确认,未修复):.buildkite/intel_jobs/*.yaml 中 source_file_dependencies 只列 vllm/、tests/... 与自身 yaml,不含 requirements/test/xpu.in(.txt);今后任何只改 XPU 依赖文件的 PR 都不会触发对应 XPU 测试,依赖回归只能在合入 main 之后才暴露。CodeRabbit 还点名了 .buildkite/ci_config_intel.yaml 需要同步。
  2. 依赖安装从“步骤级联网安装”变成“镜像级预装”,失败面转移:删除 pip install tensorizer==2.10.1、runai-model-streamer[...]、av、matplotlib、tblib 等命令后,这些包必须由 XPU 镜像(image_build_xpu.sh)在构建阶段提供;一旦镜像构建缓存未刷新或构建失败,model_executor / multi-modal / example 等整组步骤会因缺包直接报错,而不是像以前那样在步骤内临时装齐。
  3. 锁文件级别的版本变化可能带来隐性回归:gpt-oss 0.0.9 → 0.0.5(连带移除 jupyter-client/jupyter-core),numpy 2.3.5 → 2.2.6,open-clip-torch 从 --no-deps 安装变为参与完整依赖解析(新增 ftfy 等传递依赖)。这些变化没有在 PR 描述中给出任何验证结论,PR body 的 Test Plan / Test Result 章节是空的。
  4. 可复现性的双刃剑:av 等包从“安装当日最新版”变为锁定的 av==18.1.0,有利于复现但意味着行为变化点从 CI 运行时悄悄前移到了镜像构建时;镜像 tag 与 requirements 的对应关系没有在本 PR 中显式说明。
  1. 对用户:不改变任何推理路径与 API 行为,最终用户无直接感知;间接影响是 XPU 平台若出现依赖类回归,可能更早(或更晚,视触发覆盖而定)被 CI 捕获。
  2. 对系统/CI:XPU 测试步骤的命令串显著缩短(去掉联网 pip install),理论上每个 step 启动更快、失败定位更清晰(依赖缺失会集中在镜像阶段);但 CI 的失败模式从“步骤内安装失败”集中为“镜像构建失败”,且镜像构建是 XPU 全组的 depends_on,失败时会阻塞整个 Intel 流水线。
  3. 对团队:明确了一条新的约束——XPU 测试新增依赖应写进 requirements/test/xpu.in 而不是 yaml 内的 pip install;Intel CI 维护者需要额外留意 requirements 变更与镜像重建的联动,同时需要补上触发依赖(跟进 CodeRabbit 的建议)。
  4. 对仓库依赖管理:xpu.in/xpu.txt 与 cuda.txt、tpu.txt 等并列,成为 XPU 平台单一依赖真源,后续依赖升级类 PR(如 tpu-inference 升版、CUTLASS DSL 升版)的同类模式可能继续扩展到 XPU。
CI 触发覆盖缺口 依赖安装改为镜像预装 锁文件版本回退(gpt-oss 0.0.9→0.0.5、numpy 2.3.5→2.2.6) open-clip-torch 由 --no-deps 改为完整解析 PR 描述缺少测试结果

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论