执行摘要
- 一句话:XPU CI 依赖统一收敛至 xpu.in,8 处 pip install 下线
- 推荐动作:
- 是否值得精读:对 Intel/XPU CI 维护者、以及负责 requirements 与镜像构建的同学值得精读;对做模型、内核、调度的工程师可快速略过(零运行时源码改动)。
- 值得关注的设计决策:把“步骤级 pip install”整体上移到镜像 requirements,是一次典型的 CI 依赖治理;阅读时应重点对照删除命令与 xpu.in 新增条目的映射表,确认没有遗漏(例如
pip install open-clip-torch --no-deps 改为带依赖解析的 open_clip_torch==2.32.0 属于语义变化,不只是形式迁移)。
- 建议的后续动作:跟进补上
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 的锁文件回退给出验证结论或原因说明。
功能与动机
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 的既有依赖管理模式保持一致。
实现拆解
- 依赖清单归拢(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,并补上文件末尾换行。
- 锁文件重算(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 为新增固定版本。
- 流水线瘦身(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)保留在命令串内。
- 配套与缺口:
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(模块 测试依赖;类别 test;类型 dependency-manifest;符号 tblib==3.1.0, runai-model-streamer[s3,gcs,azure], tensorizer==2.10.1, av): 本次变更的单一依赖真源:所有从 5 个 Buildkite job 里删除的 pip install 都在此固化,并新增 pin 与版本下限,是理解整份 PR 的入口文件。
requirements/test/xpu.txt(模块 依赖锁文件;类别 config;类型 dependency-lock;符号 gpt-oss==0.0.5, numpy==2.2.6, av==18.1.0, open-clip-torch==2.32.0): 由 xpu.in 重算的锁文件(+172/-26),把版本漂移风险与新增传递依赖(S3/GCS/Azure 后端、tensorizer、matplotlib)全部显性化,也是“依赖文件变更应触发 XPU 测试”的对象之一。
.buildkite/intel_jobs/test-intel.yaml(模块 流水线配置;类别 config;类型 configuration;符号 xpu-example-test, xpu-server-test): 删除 tblib 安装的落地文件,同时也是 CodeRabbit 提出 source_file_dependencies 覆盖缺口的具体位置(第 37 行附近),代码评审的主要争议点在此。
.buildkite/intel_jobs/misc_intel.yaml(模块 流水线配置;类别 config;类型 configuration;符号 async-engine-inputs-utils-worker, metrics-tracing-2-gpus, regression): 删除条目最多(lm_eval、modelscope、四条 opentelemetry 包、av),覆盖 Basic Models / Regression / Metrics-Tracing / Async Engine 四个 job,是验证依赖迁移完整性的重点文件。
.buildkite/intel_jobs/models_multimodal_intel.yaml(模块 流水线配置;类别 config;类型 configuration;符号 multi-modal-processor, multi-modal-models-standard-1-qwen2): 删除三处安装命令(av、matplotlib/ftfy、open-clip-torch --no-deps),后者从 --no-deps 改为带依赖解析,是本次最容易被忽略的语义变化点。
.buildkite/intel_jobs/model_executor_intel.yaml(模块 流水线配置;类别 config;类型 configuration;符号 model-executor-intel): 删除 tensorizer 与 runai-model-streamer 的安装,这两个包正是 xpu.txt 中新增依赖链(boto3/azure/google-cloud-storage/hiredis)的源头。
.buildkite/intel_jobs/lm_eval_intel.yaml(模块 流水线配置;类别 config;类型 configuration;符号 xpu-gpqa-eval-gpt-oss): 删除 gpt-oss[eval]==0.0.5 安装,该 pin 被迁入 xpu.in 并导致锁文件中 gpt-oss 版本变化,是版本回退风险的来源之一。
关键符号:xpu-example-test(Buildkite step key), xpu-server-test, model-executor-intel, xpu-gpqa-eval-gpt-oss, multi-modal-processor, metrics-tracing-2-gpus
评论区精华
- 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 中修复。
- 人工评审只有一次 APPROVED:reviewer
bigPYJ1151 直接 approve,没有留下文字意见,说明 Intel CI 侧维护者认可这次收敛方向。
- claude[bot] 因 fork 来源禁用自动评审:“This pull request is from a fork — automated review is disabled.”,因此本 PR 实质只经过 CodeRabbit 一轮自动审查,评审深度有限。
- 协作流程:作者在评论中发起两次
/ci run(Buildkite #88142、#88489),期间出现合并冲突,先请 @copilot 帮忙解决,随后以 Merge branch 'main' into kunshang/remove_pip_in_test 提交收尾——这也意味着 xpu.in 中 cohere/cohere_melody、opentelemetry 等部分条目可能混入了 main 的合并内容,diff 语义不够纯粹。
- CI 触发依赖未覆盖新增的 requirements/test/xpu.in(.txt) (testing): 未修复。PR 只有 remove pip install 与 merge main 两个 commit,评论无回复,评审人 bigPYJ1151 直接 approve 后合入,缺口被带到 main。
- fork 来源 PR 的自动评审被禁用 (other): 维持禁用状态,没有触发额外一次性评审;评审覆盖度依赖人工 reviewer。
- 合并冲突与 CI 触发流程 (other): 通过合并 main 解决冲突,CI 以最终 commit 4bbf81b 跑通并合入;但合并可能把 main 的依赖条目带入 xpu.in,使 diff 归因不够纯粹。
风险与影响
- 风险:
- 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 需要同步。
- 依赖安装从“步骤级联网安装”变成“镜像级预装”,失败面转移:删除
pip install tensorizer==2.10.1、runai-model-streamer[...]、av、matplotlib、tblib 等命令后,这些包必须由 XPU 镜像(image_build_xpu.sh)在构建阶段提供;一旦镜像构建缓存未刷新或构建失败,model_executor / multi-modal / example 等整组步骤会因缺包直接报错,而不是像以前那样在步骤内临时装齐。
- 锁文件级别的版本变化可能带来隐性回归:
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 章节是空的。
- 可复现性的双刃剑:
av 等包从“安装当日最新版”变为锁定的 av==18.1.0,有利于复现但意味着行为变化点从 CI 运行时悄悄前移到了镜像构建时;镜像 tag 与 requirements 的对应关系没有在本 PR 中显式说明。
- 影响:
- 对用户:不改变任何推理路径与 API 行为,最终用户无直接感知;间接影响是 XPU 平台若出现依赖类回归,可能更早(或更晚,视触发覆盖而定)被 CI 捕获。
- 对系统/CI:XPU 测试步骤的命令串显著缩短(去掉联网 pip install),理论上每个 step 启动更快、失败定位更清晰(依赖缺失会集中在镜像阶段);但 CI 的失败模式从“步骤内安装失败”集中为“镜像构建失败”,且镜像构建是 XPU 全组的
depends_on,失败时会阻塞整个 Intel 流水线。
- 对团队:明确了一条新的约束——XPU 测试新增依赖应写进
requirements/test/xpu.in 而不是 yaml 内的 pip install;Intel CI 维护者需要额外留意 requirements 变更与镜像重建的联动,同时需要补上触发依赖(跟进 CodeRabbit 的建议)。
- 对仓库依赖管理: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 描述缺少测试结果
关联脉络
- PR #56463 [XPU][CI] skip DeepSeek-V4.1-Flash in
test_tensor_schema.py: 同样修改 .buildkite/intel_jobs/models_multimodal_intel.yaml 的 Multi-Modal Processor 步骤;本 PR head 中该步骤仍保留 --deselect=DeepSeek-V4.1-Flash 这一行,只是删掉了前面的 pip install av matplotlib ftfy 与 open-clip-torch --no-deps,属于同一 job 定义的连续演进。
- PR #56329 [CI] Give every Buildkite step an explicit key, and a hook to enforce it: 同一批 .buildkite/intel_jobs/*.yaml(含 test-intel.yaml、misc_intel.yaml、models_multimodal_intel.yaml)刚在 #56329 中被要求补齐显式 step key 并由 pre-commit 钩子强制;本 PR 继续在这些 yaml 上做命令裁剪,必须保持 step key 不变,属于同一条 CI 配置维护线。
参与讨论