Prhub

#25197 ci: decouple stage and runner for cuda registry

原始 PR 作者 hnyls2002 合并时间 2026-05-14 08:28 文件变更 261 提交数 6 评论 2 代码增减 +388 / -293

执行摘要

拆分 CI 注册 suite 为 stage 和 runner_config

suite 字符串如 stage-c-test-8-gpu-h200 混合了阶段和运行器信息,不便于独立配置。PR 将 register_cuda_ci(..., suite='stage-X-test-Y', ...) 拆分为 stage='stage-X'runner='Y',提升可读性和可配置性,同时保留对旧 suite 的后向兼容。

该 PR 展示了如何通过 AST 工具进行大规模安全重构,值得 CI 基础设施维护者精读。建议合并后提醒团队迁移期间避免同时修改注册点。

讨论亮点

暂无实质性讨论。PR 由作者独立完成,无 review 评论。

实现拆解

  1. 数据类改造:在 python/sglang/test/ci/ci_register.py 中,CIRegistry 新增 stagerunner_config 可选字段,suite 变为可选,并添加 effective_suite 属性,当 stagerunner_config 均设置时自动复合为 f'{stage}-test-{runner_config}',否则回退到 suite
  2. 注册函数签名更新:register_cuda_ciregister_cpu_ciregister_amd_ciregister_npu_ci 均将 suite 改为可选,新增 stagerunner_config 关键字参数(通过 * 分隔)。
  3. AST 解析器调整:RegistryVisitor._parse_call_args 支持新的关键字参数,参数列表扩增为 _ALL_PARAMS,验证逻辑允许 suiteNone 但必须提供 stage+runner_config 之一。
  4. 注册点迁移:对 258 个文件中所有 register_cuda_ci 调用,将符合 ^stage-[abc]-test- 模式的 suite 替换为独立的 stagerunner_confignightly-*stressweekly-* 等特殊套件仍使用 suite=
  5. 下游消费者更新:test/run_suite.py 中的 filter_testsscripts/ci/utils/compute_partitions.py 从读取 registry.suite 改为读取 registry.effective_suite
  6. 验证:使用 AST 解析器导出迁移前后的 CIRegistry 列表,对比 effective_suite 重建后的条目完全一致,且 compute_partitions.py 输出 JSON 字节相同。
文件 模块 状态 重要度
python/sglang/test/ci/ci_register.py CI 注册 modified 6.71
test/registered/8-gpu-models/test_dsa_models_hisparse.py Hisparse 测试 modified 4.34
test/registered/8-gpu-models/test_dsa_models_mtp.py MTP 测试 modified 4.21
test/registered/debug_utils/test_cuda_coredump.py Coredump 测试 modified 4.21
test/registered/models/test_dummy_grok_models.py Dummy 测试 modified 4.21
test/registered/models/test_ministral3_models.py Ministral3 测试 modified 4.21
test/registered/models/test_ministral4_models.py Ministral4 测试 modified 4.21
test/run_suite.py 运行套件 modified 4.19
scripts/ci/utils/compute_partitions.py 分区计算 modified 4.0

关键符号

effective_suite _parse_call_args register_cuda_ci register_cpu_ci register_amd_ci register_npu_ci

关键源码片段

python/sglang/test/ci/ci_register.py core-logic

核心变更文件,定义了新的 CIRegistry 数据结构和 effective_suite 属性,改造了所有注册函数和 AST 解析器。

# `_PARAM_ORDER` 保持位置参数兼容,`_KWARG_ONLY` 为新关键字参数
_PARAM_ORDER = ('est_time', 'suite', 'nightly', 'disabled')
_KWARG_ONLY = ('stage', 'runner_config')
_ALL_PARAMS = _PARAM_ORDER + _KWARG_ONLY
_UNSET = object()@dataclass
class CIRegistry:
    backend: HWBackend
    filename: str
    est_time: float
    # 新增字段,均为可选
    stage: Optional[str] = None
    runner_config: Optional[str] = None
    # `suite` 保留用于向后兼容(nightly/stress 等)
    suite: Optional[str] = None
    nightly: bool = False
    disabled: Optional[str] = None
​
    @property
    def effective_suite(self) -> Optional[str]:
        # 当 `stage` 和 `runner_config` 都设置时,自动复合
        if self.stage is not None and self.runner_config is not None:
            return f'{self.stage}-test-{self.runner_config}'
        return self.suitedef register_cuda_ci(
    est_time: float,
    suite: Optional[str] = None,
    nightly: bool = False,
    disabled: Optional[str] = None,
    *,
    stage: Optional[str] = None,
    runner_config: Optional[str] = None,
):
    '''CUDA CI 注册标记(运行时无操作,仅供 AST 解析)。'''
    return None

评论区精华

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

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

风险与影响

  1. 兼容性风险:如果新代码外部的消费者直接访问 CIRegistry.suite 而非 effective_suite,在使用了新参数的注册点会得到 None,导致错误。但 PR 已更新所有内部消费者。
  2. 大量文件变更风险:258 个文件在主线分支可能产生冲突,需要及时合并。
  3. AST 解析器边界:_parse_call_args 假设所有参数为常量,若注册调用包含变量或复杂表达式,解析器会失败,但 CI 注册调用通常使用字面量。

对开发者:增加了 stagerunner_config 两个清晰维度,便于配置和后续扩展。对运行系统:无直接影响,所有逻辑语义保持不变。对合并协作:由于涉及大量文件,需协调其他分支避免冲突。

大量文件变更 向下兼容依赖 AST 解析器正确性 验证脚本依赖

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论