Prhub

#52344 [CI] Shard entrypoints API-server tests

原始 PR 作者 khluu 合并时间 2026-09-02 16:13 文件变更 1 提交数 1 评论 1 代码增减 +6 / -5

执行摘要

通过分片将 Entrypoints API Server 测试的并行度提高到 4,大幅缩短 CI 耗时。

在 24 小时 CI 仪表盘窗口内(截至 2026-09-01 10:31 UTC),NVIDIA 和 AMD 平台的 Entrypoints API Server 测试集的 P90 耗时均达到 2700 秒以上(约 45 分钟),成为 CI 瓶颈,亟需优化。

此 PR 是一个典型的 CI 性能优化,改动范围小、目标明确且验证充分。推荐 CI/Infra 团队快速审阅其分片策略和条件执行逻辑。对于希望优化自身大型测试套件的工程师,该 PR 提供了使用 pytest 分片与 Buildkite 并行功能结合的实用范例。

讨论亮点

无实质性技术讨论。唯一的评论来自 mergify[bot],指出 PR 存在合并冲突需要解决。核心设计决策(分片策略、有状态测试的条件执行)均在 PR 描述和验证结果中说明并直接实施。

实现拆解

  1. 入口配置修改:在 .buildkite/test_areas/entrypoints.yaml 中,为 :nvidia: (H200 MIG 35GB) Entrypoints Integration (API Server) 任务及其 AMD 镜像添加 parallelism: 4 配置,将任务从单实例变为四并行实例。
  2. 分片逻辑注入:修改 commands 列表中的 pytest 命令。对于 entrypoints/serve 和 entrypoints/scale_out 测试集,追加 --num-shards=$$BUILDKITE_PARALLEL_JOB_COUNT --shard-id=$$BUILDKITE_PARALLEL_JOB 参数,利用 Buildkite 注入的环境变量实现动态分片。
  3. 有状态测试隔离:将原先独立运行 entrypoints/serve/dev/rpc 测试的命令,修改为仅在特定分片(BUILDKITE_PARALLEL_JOB == 1)上执行的条件语句,防止 RPC 单例被多个分片并发启动,确保测试正确性。
  4. 标签与契约更新:在任务 label 中追加 %N 占位符,以便 Buildkite 为每个并行任务添加清晰的编号后缀,便于区分和调试。source_file_dependencies 未变,保证触发逻辑一致。
文件 模块 状态 重要度
.buildkite/test_areas/entrypoints.yaml CI 配置 modified 4.12

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

评论区精华

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

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

风险与影响

  1. 测试稳定性风险:引入分片后,需要确保每个分片的测试用例集划分是均衡且互不干扰的。如果 pytest 的分片机制存在缺陷,可能导致部分测试用例被遗漏或重复执行。PR 描述中包含了分片后各任务的耗时数据,表明划分基本均衡。
  2. 有状态测试隔离风险:RPC 测试(entrypoints/serve/dev/rpc)依赖单一进程实例。虽然通过 BUILDKITE_PARALLEL_JOB == 1 条件限制其只在第一个分片运行,但如果分片执行顺序或环境变量注入出现意外,可能导致该条件失效,引发并发冲突。目前通过 if 语句实现,逻辑相对直接。
  3. 兼容性风险:此变更仅修改 Buildkite CI 配置文件,不影响 vLLM 产品代码,因此对用户无直接影响,仅影响 CI 流程。

直接影响 CI 系统的测试执行效率。通过将原本需要顺序执行约 45 分钟的测试拆分为四个并行任务,每个任务耗时降至 18-26 分钟,显著缩短了 PR 合并前的验证等待时间,提升了开发团队的迭代效率。对系统稳定性、性能或安全无直接影响。

测试分片依赖环境变量 有状态测试隔离

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论