ascendc-sync-audit skill evaluator corpus (submodule)
| Files | Last commit | Last update |
|---|---|---|
| 2 months ago | ||
| 2 months ago | ||
| 2 months ago | ||
| 2 months ago | ||
| 2 months ago | ||
| 2 months ago | ||
| 2 months ago | ||
| 2 months ago | ||
| 2 months ago | ||
| 2 months ago | ||
| 2 months ago |
ascendc-sync-audit tests 语料仓
ascendc-sync-audit Skill 的评测语料独立仓。 tests/ 目录以 git submodule 方式挂载到主仓,避免大体积测试数据与 CI 扫描噪音进入主仓。
挂载方法
在主仓(cannbot-skills)根目录执行:
git submodule update --init --recursive
挂载位置:ops/ascendc-sync-audit/tests(与本地开发时的引用路径完全一致)。
目录结构
评测语料(4 套件,571 文件)
| 套件 | 文件数 | 评测点 |
|---|---|---|
| dataset/ | 53 | 条例覆盖样例 + mask 变形(宏封装/改名/#ifdef 包裹),测抗变形能力 |
| real_dataset/ | 54 | 真实算子仓(blas/nn/transformer/tensor)代码片段,缺陷+正确同源 |
| real_pr/ | 64 | 真实同步修复 PR 的修复前完整文件,在真实复杂度(500~2000 行)下测检出召回 |
| real_pairs/ | 400 | 同一 PR 修复前/后成对文件(200 对),测判别力(能否区分修前/修后) |
标注文件:各套件目录就近存放的 labels.json(dataset/labels.json、real_dataset/labels.json、
real_pr/labels.json、real_pairs/labels.json,字段 label + expected_sync + defect_lines,
机器 ground truth;real_pairs 的 pair 字段为本目录文件名)、issues.md(人读版标注表)、
real_pairs/issues.md(配对说明,94 个 PR / 200 对索引)。
defect_lines 覆盖:dataset/real_dataset 未标注(0/76,评测仅做条例判定); real_pr 40/64;real_pairs 134/200 有值(66 个为空:diff 变更行全部为注释/空白/宏定义, 被 extract_change_lines.py 过滤规则剔除)。
评测脚本:eval_recall.py(主评测,量化召回/误报/条例命中/配对判别)、
measure_accuracy.py(CPU 仿真 UT ground truth)、regression_real_ops.py(真实算子仓回归)、
common.py(共享引导模块,供上述评测脚本复用)。
与 benchmark/ 门禁的分工
| benchmark/(主仓) | 本仓 tests/ | |
|---|---|---|
| 角色 | L0 门禁,随主仓提交 | L1 全量语料,submodule 按需拉取 |
| 样例数 | 15 缺陷 + 6 正确 | 571(4 套件) |
| 评测器 | benchmark/eval_benchmark.py |
tests/eval_recall.py |
| 缺陷判定 | 三层:有候选 + 条例命中 + 行号命中 | 文件级召回:有 ≥1 候选即算(条例命中单列统计) |
| real_pairs 口径 | sync 子集 49 对(correct 侧同步过滤) | sync 子集 49 对(correct 侧同步过滤),口径一致 |
| 门槛 | 强约束(CI,15/15 + 0% 误报) | 无固定门限,目标为不回退 |
两个评测同源(同一 sync_audit.py、同一标注体系 label + expected_sync + defect_lines), 但口径不同:L0 是"条例+行号精确命中"门禁,L1 是"文件级召回 + 误报率"量化基线,两者互补。
评测
cd ops/ascendc-sync-audit
python3 tests/eval_recall.py # 全部套件(L1 量化基线)
python3 tests/eval_recall.py --json # JSON 输出(门禁/趋势跟踪)
python3 benchmark/eval_benchmark.py --full # L0 门禁 + L1 全量(消费本语料)
L0 门禁不依赖本仓(benchmark/ 最小集随主仓提交);L1 全量评测需先拉取本语料。
指标口径(与 eval_recall.py docstring 一致)
- 文件级召回:defect 文件中产生 ≥1 个候选(任意级别)的比例
- 条例命中率:已检出的 defect 文件中,候选条例包含 expected_sync 的比例(辅助指标)
- 文件级误报率:correct 文件中产生 ≥1 个候选的比例(含性能/信息级)
- 红线误报率:correct 文件中产生 ≥1 个红线候选的比例
- 配对判别率(仅 real_pairs):以配对 correct 文件候选为噪声基线, defect 文件存在"新增候选签名"(code + 去行号 message,计数多于 correct 侧)的比例
量化基线(2026-08-26 实测)
| 套件 | 文件级召回 | 条例命中 | 文件级误报率 | 红线误报率 |
|---|---|---|---|---|
| dataset/ | 89.1%(41/46) | 31/41 | 42.9% | 0% |
| real_dataset/ | 70.0%(21/30) | 17/21 | 29.2% | 12.5% |
| real_pr/ | 82.8%(53/64) | — | — | — |
| real_pairs/(sync 子集 49 对) | 75.5%(37/49) | — | 79.6% | 36.7%,配对判别率 20.4% |
real_pairs 共 200 对,经 diff 审计仅 49 对为真实同步修复(diff 含同步 API 增删, 白名单见 eval_recall.py
SYNC_CHANGE_RE),同步相关指标只统计这 49 对(sync 子集); 其余 151 对为精度/NAN/功能修复,不计入召回分母。
复现:python3 tests/eval_recall.py;指标变化记录于主仓 DEV_LOG.md。
维护
- 语料修改:更新对应套件的
<suite>/labels.json(或 issues.md + 二次生成)后重跑eval_recall.py确认指标,并在主仓 DEV_LOG.md 记录变化 - 历史:本仓由主仓
git subtree split --prefix=ops/ascendc-sync-audit/tests导出, 语料完整提交历史保留于本仓master
评测示例
示例数据均为实测:标注取自各套件 labels.json,脚本输出取自
python3 scripts/sync_audit.py <文件> --format json 的 findings,可直接复现。
dataset/:条例命中判定
文件: dataset/sync01a_wait_before_set.cpp
标注: { "label": "defect", "expected_sync": "SYNC-01" }
脚本: n=1, findings=[{code: "SYNC-01", line: 24, severity: "高",
message: "Wait 先于 Set(同函数消费+生产...): 方向=MTE2_V flag=EVEN"}]
判定: 有候选,且候选条例与 expected_sync 一致(SYNC-01)
→ 计入文件级召回与条例命中
real_dataset/:条例命中判定
文件: real_dataset/blas_1_SYNC-01.cpp (源自 ops-blas scopy_kernel.cpp)
标注: { "label": "defect", "expected_sync": "SYNC-01" }
脚本: n=1, findings=[{code: "SYNC-01", line: 14, ...}]
(该缺陷为把 MTE2_MTE3 的 WaitFlag 提到 SetFlag 之前)
判定: 有候选,且候选条例与 expected_sync 一致 → 计入文件级召回
real_pr/:行号命中判定
文件: real_pr/pr_3920_1.cpp (Conv3D 同步死锁修复的修复前完整文件,528 行)
标注: { "label": "defect", "defect_lines": [273, 274, 275, 283, ...] }(无 expected_sync)
脚本: n=10, codes={SYNC-01, SYNC-03}, lines={193, 203, 209, ...}
判定: 候选行号与 defect_lines 无交集 → 判为漏检
real_pairs/:配对判别与行号命中判定
文件: real_pairs/defect_pr_1678_1.cpp ↔ correct_pr_1678_1.cpp(同一 PR 修前/修后)
标注: { "label": "defect", "defect_lines": [179], "pair": "correct_pr_1678_1.cpp" }
脚本: defect 侧存在相对 correct 侧的新增候选签名(SYNC-11),候选行号 179 命中标注
判定: 配对判别成立(修复前较修复后新增 SYNC-11 候选),行号命中 → 通过
全量评测实测输出(复现:python3 tests/eval_recall.py)
[dataset]
文件级召回: 41/46 = 89.1% 条例命中: 31/41
文件级误报率(任意级别): 3/7 = 42.9% 红线误报率: 0.0%
[real_dataset]
文件级召回: 21/30 = 70.0% 条例命中: 17/21
文件级误报率(任意级别): 7/24 = 29.2% 红线误报率: 12.5%
[real_pr]
文件级召回: 53/64 = 82.8%
[real_pairs]
文件级召回: 37/49 = 75.5% (sync子集 49)
文件级误报率(任意级别): 39/49 = 79.6% 红线误报率: 36.7%
配对判别率: 20.4%
单文件验证:
cd ops/ascendc-sync-audit
python3 scripts/sync_audit.py tests/dataset/sync01a_wait_before_set.cpp --format json