Prhub

#28190 fix(precision): do not promote failed runs to the comparison baseline

原始 PR 作者 JustinTong0323 合并时间 2026-07-02 09:19 文件变更 2 提交数 4 评论 5 代码增减 +73 / -1

执行摘要

修复失败基线晋升为比较基准的 bug

夜间精度回归测试的核心功能是持续检测回归。然而,_select_latest_run 只根据 push_index 选择最新 run,忽略了 pass_label。当某次运行回归失败后,会上传失败张量带 pass_label="failed",但下次运行会选中最新的失败 run 作为基准,导致即使回归仍然存在,测试也会通过(因为与已回归的基准比较)。这导致持续回归在一天后变成绿色,完全违背了测试设计初衷。PR body 详细描述了 N→N+1→N+2 的掩盖过程。

值得精读,尤其是对于需要维护自动化回归测试的团队。该 PR 展示了一个微妙的 bug(基线晋升掩盖回归)及其简洁修复,以及测试如何精准覆盖边界。设计决策关注点:用两行代码解决根本问题,保持向后兼容,测试覆盖所有场景。

讨论亮点

gemini-code-assist[bot] 提出性能优化建议:与其通过列表推导创建新列表,不如反向遍历已排序的 candidates,在找到第一个非失败 run 时立即返回,避免分配中间列表。该建议未在最终代码中采纳(代码仍使用了列表过滤方式)。JaredforReal 直接批准,没有进一步讨论。

实现拆解

  1. python/sglang/test/precision_baseline_store.py_select_latest_run 函数中,在排序候选列表后,首先过滤出 pass_label != "failed" 的可用行列表,然后优先选择可用行中的最新一条;只有在没有可用行时才回退到全部候选列表。
  2. 核心改动仅两行:usable = [c for c in candidates if c[1].get("pass_label") != "failed"]chosen = usable or candidates
  3. test/registered/unit/test_precision_baseline_store.pyTestSelectLatestRun 类中新增 4 个测试方法:
    • test_prefers_older_passed_over_newer_failed:验证旧但通过的 run 优于新失败的 run。
    • test_prefers_baseline_established_over_newer_failed:验证 baseline_established 标签的 run 优于新失败的 run。
    • test_falls_back_to_failed_when_only_failed:验证当所有候选都失败时,仍然返回最新失败 run。
    • test_missing_pass_label_treated_as_usable:验证没有 pass_label 的旧行被视为可用(向后兼容)。
文件 模块 状态 重要度
python/sglang/test/precision_baseline_store.py 测试工具 modified 4.77
test/registered/unit/test_precision_baseline_store.py 测试工具 modified 7.16

关键符号

_select_latest_run test_prefers_older_passed_over_newer_failed test_prefers_baseline_established_over_newer_failed test_falls_back_to_failed_when_only_failed test_missing_pass_label_treated_as_usable

关键源码片段

python/sglang/test/precision_baseline_store.py test-coverage

核心修复文件,修改 _select_latest_run 函数,在排序后过滤掉失败的 run,仅在所有候选都失败时回退。

def _select_latest_run(
    rows: list[dict[str, Any]],
    *,
    model: str,
    capture_signature: Optional[str] = None,
) -> Optional[str]:
    # ... 前面的过滤逻辑不变 ...
    candidates.sort(key=lambda kv: kv[0])
​
    # 过滤掉失败的 run,仅在无可用基线时才回退到失败 run
    # 这防止了一次回归失败后,失败张量成为下次比较的基准
    usable = [c for c in candidates if c[1].get("pass_label") != "failed"]
    chosen = usable or candidates
    return chosen[-1][1]["run_path"]
test/registered/unit/test_precision_baseline_store.py test-coverage

新增 4 个单元测试,全面覆盖新逻辑的各种场景:优先选择老的通过 run、优先选择 baseline_established run、仅失败时回退、缺少 pass_label 的向后兼容。

def test_prefers_older_passed_over_newer_failed(self):
    # 先有一个老的通过 run,后有一个新的失败 run
    # 应返回老的通过 run,而不是新的失败 run
    rows = [
        {"model": "org/m", "run_path": "good", "pass_label": "passed", "push_index": 1},
        {"model": "org/m", "run_path": "bad", "pass_label": "failed", "push_index": 2},
    ]
    self.assertEqual(hfs._select_latest_run(rows, model="org/m"), "good")def test_prefers_baseline_established_over_newer_failed(self):
    rows = [
        {"model": "org/m", "run_path": "seed", "pass_label": "baseline_established", "push_index": 1},
        {"model": "org/m", "run_path": "bad", "pass_label": "failed", "push_index": 2},
    ]
    self.assertEqual(hfs._select_latest_run(rows, model="org/m"), "seed")def test_falls_back_to_failed_when_only_failed(self):
    rows = [
        {"model": "org/m", "run_path": "bad1", "pass_label": "failed", "push_index": 1},
        {"model": "org/m", "run_path": "bad2", "pass_label": "failed", "push_index": 2},
    ]
    self.assertEqual(hfs._select_latest_run(rows, model="org/m"), "bad2")def test_missing_pass_label_treated_as_usable(self):
    rows = [
        {"model": "org/m", "run_path": "legacy", "push_index": 1},
        {"model": "org/m", "run_path": "bad", "pass_label": "failed", "push_index": 2},
    ]
    self.assertEqual(hfs._select_latest_run(rows, model="org/m"), "legacy")

评论区精华

通过反向遍历优化性能 性能

gemini-code-assist[bot] 建议使用 `for c in reversed(candidates)` 反向遍历,当找到第一个非失败候选时立即返回,避免创建中间列表。

结论:未采纳。最终代码使用了列表过滤方式,可能出于可读性考虑。 · unresolved

风险与影响

风险极低。核心改动只有两行,且完全在测试框架的私有函数内,不影响任何运行时逻辑。测试覆盖了所有关键场景(包括向后兼容性)。唯一的边界情况是当所有候选都失败时,行为与原来一致(返回最新失败 run),不会恶化。

直接影响夜间精度回归测试的正确性:修复后,持续回归将每晚被捕获,直到问题修复。仅影响测试框架,不影响任何用户可见功能。对系统性能无影响。

测试框架变更 向后兼容保障

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论