执行摘要
- 一句话:通过分片将 Entrypoints API Server 测试的并行度提高到 4,大幅缩短 CI 耗时。
- 推荐动作:此 PR 是一个典型的 CI 性能优化,改动范围小、目标明确且验证充分。推荐 CI/Infra 团队快速审阅其分片策略和条件执行逻辑。对于希望优化自身大型测试套件的工程师,该 PR 提供了使用 pytest 分片与 Buildkite 并行功能结合的实用范例。
功能与动机
在 24 小时 CI 仪表盘窗口内(截至 2026-09-01 10:31 UTC),NVIDIA 和 AMD 平台的 Entrypoints API Server 测试集的 P90 耗时均达到 2700 秒以上(约 45 分钟),成为 CI 瓶颈,亟需优化。
实现拆解
- 入口配置修改:在
.buildkite/test_areas/entrypoints.yaml 中,为 :nvidia: (H200 MIG 35GB) Entrypoints Integration (API Server) 任务及其 AMD 镜像添加 parallelism: 4 配置,将任务从单实例变为四并行实例。
- 分片逻辑注入:修改
commands 列表中的 pytest 命令。对于 entrypoints/serve 和 entrypoints/scale_out 测试集,追加 --num-shards=$$BUILDKITE_PARALLEL_JOB_COUNT --shard-id=$$BUILDKITE_PARALLEL_JOB 参数,利用 Buildkite 注入的环境变量实现动态分片。
- 有状态测试隔离:将原先独立运行
entrypoints/serve/dev/rpc 测试的命令,修改为仅在特定分片(BUILDKITE_PARALLEL_JOB == 1)上执行的条件语句,防止 RPC 单例被多个分片并发启动,确保测试正确性。
- 标签与契约更新:在任务
label 中追加 %N 占位符,以便 Buildkite 为每个并行任务添加清晰的编号后缀,便于区分和调试。source_file_dependencies 未变,保证触发逻辑一致。
关键文件:
.buildkite/test_areas/entrypoints.yaml(模块 CI 配置;类别 config;类型 configuration): 此配置文件定义了 CI 测试任务的结构、并行度、执行命令和依赖关系,是本次分片优化的唯一变更文件。
关键符号:未识别
评论区精华
无实质性技术讨论。唯一的评论来自 mergify[bot],指出 PR 存在合并冲突需要解决。核心设计决策(分片策略、有状态测试的条件执行)均在 PR 描述和验证结果中说明并直接实施。
风险与影响
- 风险:
- 测试稳定性风险:引入分片后,需要确保每个分片的测试用例集划分是均衡且互不干扰的。如果 pytest 的分片机制存在缺陷,可能导致部分测试用例被遗漏或重复执行。PR 描述中包含了分片后各任务的耗时数据,表明划分基本均衡。
- 有状态测试隔离风险:RPC 测试(
entrypoints/serve/dev/rpc)依赖单一进程实例。虽然通过 BUILDKITE_PARALLEL_JOB == 1 条件限制其只在第一个分片运行,但如果分片执行顺序或环境变量注入出现意外,可能导致该条件失效,引发并发冲突。目前通过 if 语句实现,逻辑相对直接。
- 兼容性风险:此变更仅修改 Buildkite CI 配置文件,不影响 vLLM 产品代码,因此对用户无直接影响,仅影响 CI 流程。
- 影响:直接影响 CI 系统的测试执行效率。通过将原本需要顺序执行约 45 分钟的测试拆分为四个并行任务,每个任务耗时降至 18-26 分钟,显著缩短了 PR 合并前的验证等待时间,提升了开发团队的迭代效率。对系统稳定性、性能或安全无直接影响。
- 风险标记:测试分片依赖环境变量, 有状态测试隔离
关联脉络
- PR #52350 [CI] Shard LoRA TP distributed tests: 同属 CI 分片优化系列,将 LoRA TP 分布式测试从顺序执行改为 4 个并行分片,与本 PR 的优化模式(增加 parallelism 并配置 pytest 分片)高度一致。
- PR #54753 [CI] Shard basic model initialization tests: 同样是 CI 分片优化,扩展基础模型初始化测试的分片数以降低耗时,体现了团队对提升 CI 效率的持续投入。
参与讨论