执行摘要
- 一句话:B200测试移至nightly并精简CI分区配置
- 推荐动作:推荐关注 CI 效率优化的团队阅读此 PR,特别是
compute_partitions.py 中的改动,展示了如何通过数据驱动校准和移除过度保护来精简 CI 配置。未来可考虑将更多非门控测试移至条件触发或 nightly 队列。
功能与动机
B200 测试在 per-commit 中运行了8个分区,但它们并不门控大多数典型 PR,且 est_time 被过度配置了30-60%。通过移除非必要测试和移除冗余的 LPT_SLOP 填充,可以减少 CI 资源消耗,缩短开发者等待时间。
实现拆解
- 测试套件迁移:在7个 B200 测试文件中,将
register_cuda_ci 的参数从 stage="stage-c", runner_config="4-gpu-b200" 替换为 suite="nightly-4-gpu-b200", nightly=True,并调低 est_time 至实际观测值(如 LoRA 测试从300秒降至90-100秒)。
- LPT_SLOP 移除:在
scripts/ci/utils/compute_partitions.py 中删除 LPT_SLOP = 1.15 及其使用,分区数直接通过 max(1, math.ceil(total / TARGET_SECONDS)) 计算,转而依赖作业级30分钟超时和 MAX_PARTITION_SECONDS 检查作为安全网。
- est_time 重新校准:更新剩余 B200 测试的
est_time,例如 test_gpt_oss_4gpu.py 的 B200 项从740秒降至350秒,test_nvidia_nemotron_3_super_nvfp4.py 从710秒降至540秒,使其更贴近实际运行时间。
关键文件:
scripts/ci/utils/compute_partitions.py(模块 CI脚本;类别 infra;类型 infrastructure;符号 compute_partitions): 移除 LPT_SLOP 常量并简化分区计算逻辑,是 CI 分区优化的核心变更。
test/registered/lora/test_lora_gpt_oss_20b_logprob_diff.py(模块 LoRA回归;类别 test;类型 test-coverage): 代表 7 个从 per-commit 移至 nightly 的 B200 LoRA 测试之一,展示了注册参数的变化。
test/registered/4-gpu-models/test_gpt_oss_4gpu.py(模块 模型测试;类别 test;类型 test-coverage): B200 测试的 est_time 从 740 秒降至 350 秒,基于实际观测进行校准。
关键符号:compute_partitions
关键源码片段
scripts/ci/utils/compute_partitions.py
移除 LPT_SLOP 常量并简化分区计算逻辑,是 CI 分区优化的核心变更。
def compute_partitions(tests, full_parallel=False):
# ...
if suite in _STAGE_A_OVERRIDES:
size = _STAGE_A_OVERRIDES[suite]
max_parallel = size
else:
# 之前使用 LPT_SLOP = 1.15 进行填充,现直接除以 TARGET_SECONDS(20 分钟)
# 作业级 30 分钟超时作为最终安全网
size = max(1, math.ceil(total / TARGET_SECONDS))
max_parallel = size if full_parallel else compute_max_parallel(size)
# 检查平均时间是否超过硬性上限
if total / size > MAX_PARTITION_SECONDS:
raise RuntimeError(
f"Suite {suite!r}: total est_time {total:.0f}s / size {size} "
f"= {total/size:.0f}s > {MAX_PARTITION_SECONDS}s"
)
注:TARGET_SECONDS=1200,MAX_PARTITION_SECONDS=1800。
test/registered/lora/test_lora_gpt_oss_20b_logprob_diff.py
代表 7 个从 per-commit 移至 nightly 的 B200 LoRA 测试之一,展示了注册参数的变化。
# 之前:register_cuda_ci(est_time=300, stage="stage-c", runner_config="4-gpu-b200")
# 之后:移至 nightly 套件,est_time 降至 90 秒
register_cuda_ci(
est_time=90,
suite="nightly-4-gpu-b200",
nightly=True,
)
评论区精华
该PR未收到审核评论,仅包含作者触发的 rerun 请求和自动额度提示。由于变更属于纯基础设施优化且逻辑清晰,可能已通过内部对齐后直接合并。
风险与影响
- 风险:主要风险有两方面:一是将测试移至 nightly 后会延迟 B200 相关问题的发现,但这些测试原本就不常触发失败,且 nightly 运行仍能覆盖;二是移除 LPT_SLOP 后,在极端不平衡场景下可能导致单个分区略超预期,但作业级30分钟硬超时和
MAX_PARTITION_SECONDS 检查提供了保护,风险较低。另外,est_time 重新校准基于单次观测,若模型更新或环境变化导致运行时间增加,可能需要再次校准。
- 影响:对开发者而言,CI 反馈速度提升:
stage-c-test-4-gpu-b200 从8分区(~16分钟)缩减至3分区(~19分钟),相同时间窗内可运行更多 PR;其他套件如 stage-b-test-1-gpu-large 从14分区降至12分区,stage-c-test-8-gpu-h200 从6分区降至5分区。负面影响是 B200 相关的回归测试反馈延迟至 nightly 运行。
- 风险标记:CI配置逻辑变更, 测试覆盖降级, 跨套件影响
关联脉络
- PR #25193 ci: compute matrix partition counts from
est_time: 同样涉及 compute_partitions.py 的分区动态计算,本 PR 在其基础上移除了 LPT_SLOP。
- PR #25197 ci: decouple stage and runner for cuda registry: 涉及 CI 注册体系解耦,为本 PR 引入 suite 和 nightly 参数提供了基础设施。
参与讨论