执行摘要
- 一句话:修复 /rerun-test 对非 CUDA 后端注册的误报
- 推荐动作:值得略读,属于低风险修复,但展示了 CI 工具链中注册信息与调度逻辑的耦合。关注点:
1) 如何通过共享数据结构(REGISTER_MAPPING)来避免硬编码后端列表;
2) 考虑将 AMD 等工作流纳入 /rerun-test 的调度范围,以彻底消除此类误导。
功能与动机
PR body 指出,对于通过 register_amd_ci 等注册的测试文件,/rerun-test 会错误地回复“No register_cuda_ci(...) or register_cpu_ci() found”,但这与事实不符。实测 test/registered/ 目录下 354 个文件受到此误导,容易让用户误入歧途,以为需要修复注册,而实际应使用 /rerun-failed-ci。
实现拆解
实现分为三个主要步骤:
- 将 _extract_legacy_suites 重构为通用的 _extract_suites(content, register_fn),使其能提取任意注册函数的 suite 值,同时保持对 register_cuda_ci 的兼容。
- 新增 _extract_other_backends(content) 函数,用于识别 register_amd_ci、register_npu_ci、register_xpu_ci、register_musa_ci、register_mlx_ci 等非 CUDA/CPU 注册,并返回后端标签和对应的 suite 列表。
- 在 detect_suite 中,在原有 CUDA/CPU/legacy suite 检查之后,新增对其他后端注册的检测分支。若检测到这类注册,则返回一条新的错误信息,明确指出该文件注册的后端、suite(若有),并建议使用 /rerun-failed-ci 或手动调度对应工作流。
该变更仅影响错误提示,不改变任何调度逻辑。新增代码位于 scripts/ci/utils/slash_command_handler.py 中,涉及符号 _extract_suites、_extract_other_backends 和 detect_suite。
关键文件:
scripts/ci/utils/slash_command_handler.py(模块 CI脚本;类别 infra;类型 infrastructure;符号 _extract_legacy_suites, _extract_suites, _extract_other_backends, detect_suite): 唯一的变更文件,包含核心逻辑修改:新增 _extract_other_backends 函数,重构 _extract_suites,并在 detect_suite 中增加对非 CUDA/CPU 后端的检测分支。
关键符号:_extract_suites, _extract_other_backends, detect_suite
关键源码片段
scripts/ci/utils/slash_command_handler.py
唯一的变更文件,包含核心逻辑修改:新增 _extract_other_backends 函数,重构 _extract_suites,并在 detect_suite 中增加对非 CUDA/CPU 后端的检测分支。
# scripts/ci/utils/slash_command_handler.py
# 将原 _extract_legacy_suites 泛化为对任意注册函数提取 suite
def _extract_suites(content, register_fn):
"""Pull every single-string `suite=` from `<register_fn>(...)` calls."""
out = []
for args in re.finditer(
rf"^[^#\n]*{register_fn}\s*\(([^)]*)\)", content, re.MULTILINE
):
m = re.search(r'suite\s*=\s*["\']([^"\']+)["\']', args.group(1))
if m:
out.append(m.group(1))
return out
# 兼容旧调用,仅针对 register_cuda_ci
def _extract_legacy_suites(content):
"""Pull every legacy single-string `suite=` from `register_cuda_ci(...)`
calls. Used only to report why such a file is not dispatchable."""
return _extract_suites(content, "register_cuda_ci")
# 非 CUDA/CPU 后端注册函数对应的标签,镜像 ci_register.py 中的 REGISTER_MAPPING
_OTHER_BACKEND_REGISTERS = {
"register_amd_ci": "AMD",
"register_npu_ci": "NPU",
"register_xpu_ci": "XPU",
"register_musa_ci": "MUSA",
"register_mlx_ci": "MLX",
}
def _extract_other_backends(content):
"""Return (backend labels, suite names) for every non-CUDA/CPU registration."""
labels, suites = [], []
for register_fn, label in _OTHER_BACKEND_REGISTERS.items():
if re.search(rf"^[^#\n]*{register_fn}\s*\(", content, re.MULTILINE):
labels.append(label)
suites.extend(_extract_suites(content, register_fn))
return labels, sorted(set(suites))
# 在 detect_suite 中,完成 CUDA / CPU / legacy suite 检查后,新增分支:
# 若检测到其他后端注册,则返回准确提示,而非笼统的“未注册”错误。
评论区精华
Codex 机器人提出了两点 P2 级别建议:
- 避免承诺 /rerun-failed-ci 能重跑跳过(skipped)的文件,因为 handle_rerun_failed_ci 仅处理失败或跳过的 workflow,对于成功或从未运行的 workflow 无效,可能导致 /rerun-group amd 等命令无法重跑被跳过的文件。
- 过滤空的 suite 名称,因为部分 NPU 文件使用 suite="",会导致响应中出现空的 suite 占位符,并推荐一个没有搜索模式的 grep 命令。
这两点建议均未被作者明确回应,也未在最终合并版本中解决。
- 对 /rerun-failed-ci 的承诺是否过度 (design): 作者未回应,最终合并版本仍保留该建议,存在潜在误导。
- 过滤空 suite 名称 (correctness): 作者未回应,最终合并版本未处理空 suite 值。
风险与影响
- 风险:主要风险在于新错误信息可能误导用户,尤其是当后端 workflow 从未运行或成功后,/rerun-failed-ci 无法重跑这些文件。此外,若 suite 为空字符串,新逻辑会生成不准确的提示信息。这些风险仅涉及 CI 提示文本,不会影响运行时行为,风险较低。
- 影响:影响范围限于 CI 斜杠命令 /rerun-test 的错误提示信息。受益方包括使用 AMD/NPU/XPU/MUSA/MLX 后端注册测试的开发者,他们现在能获得准确的重跑指引。团队维护成本增加,但逻辑保持简单。变更不会影响实际测试调度或任何运行时功能。
- 风险标记:对 /rerun-failed-ci 的承诺可能误导, 空 suite 值未处理
关联脉络
- PR #36914 [Fix] Lazy-import aiter in DSv4 paged_decode to unbreak CPU CI: 同样涉及 CI 基础设施修复,聚焦非 CUDA 后端的 CI 稳定性。
- PR #36638 Fix KeyError on batch requests whose state is freed before it is read: 同为针对 CI/测试工具链的修复,但方向不同。
参与讨论