Skip to content

02 · 精度台账(pass/fail 计数 + 725cf45d 全零事件完整拆解) ​

数据全部搬自 PLAN.md 与 docs/(未跑任何新实验)。标 本报告计算 的是派生量。

结论先行 ​

  1. 正确性状态的整条链是 0 fail → 11 fail → 1 fail → 0 fail:00e39ab5 全绿(5P/0F/5S)→ d0906c3e 引入 1 个精度 fail(nrmse 0.0269)→ 048d0427 双修复后 15 passed 0 failed(PLAN.md §Step A+B L71、L92-93、L110)。
  2. 中间 commit 725cf45d 是"输出全零"的坏版本:11 个 fail 全部由全零导致,构成 = 9 组 tail + beta_zero + recurrent_reference;test_shapes_and_dtypes/test_optional_g 因只断言 torch.isfinite 而通过(docs/PR-1135-d0906c3e/10-Commit演进史.md §9.3 L303-310)。全零的直接证据是探针 absmax:725cf45d = 0.0/0.0,a9c66ddb/69300ffc/d0906c3e ≈ 0.096/0.023(docs/PR-1135-d0906c3e/02-实验复现.md §6.4 L212)。
  3. 同一个精度指标(test_accuracy_recurrent_reference[fp16])在两个版本上的值是连续恶化的:d0906c3e cos=0.9996 / nrmse=0.0269,69300ffc cos=0.9995 / nrmse=0.0319(阈值 cos≥0.999、nrmse≤0.02)。69300ffc 的 nrmse 比终态更差 18.6%(本报告计算),但文档把它记为"与终态完全一致",两处口径需并列看(§2)。
  4. 崩溃(稳定性)与精度(正确性)是两条独立的失效线:崩溃 kernel 后缀随 tilingKey 数从 _2 变 _3,但 shape 簇、概率量级(~1/3)、硬件错误机理(L0C read/write conflict)在整条分支上完全一致(docs/PR-1135-d0906c3e/02-实验复现.md §6.5 L217-225)。
  5. RGDR(!1140)的 3 failed 只作为 prefill/decode 分工的对照,不参与 CGDR 的精度趋势线(§7)。

1. 各 commit 的 pass/fail/skip 计数 ​

构建(commit)测量日正确性收集passedfailedskipped唯一/主要 failperf出处
00e39ab5 (!1108)2026-09-0810(另 6 条 perf 被 -k 排除)505(bf16)—6PPLAN.md L71、docs/PR-406-00e39ab5/00 §4.3/§4.5
a9c66ddb(!1135 初版)2026-09-142613013—6P(首跑崩、复跑 6P)PLAN.md L131、docs/PR-1135-d0906c3e/10 §9.1
725cf45d(泛化重构)2026-09-142621113全零(见 §3)6PPLAN.md L131、docs/PR-1135-d0906c3e/10 §9.3
69300ffc(四桶)2026-09-142612113recurrent_reference[fp16] nrmse=0.03196P(首跑崩、复跑 6P)PLAN.md:93、docs/PR-1135-d0906c3e/10 §9.4
d0906c3e (!1135 终态)2026-09-082612113recurrent_reference[fp16] nrmse=0.02696P(t512 间歇崩)PLAN.md L92-93、docs/PR-1135-d0906c3e/02 §3/§4
d0906c3e(09-14 当日对照)2026-09-142612113同上6P(t2048 pass/crash/pass)PLAN.md L131、docs/PR-1135-d0906c3e/10 §9.1
88d8b965 (!1158 单独)—未在单独验证—————docs/PR-1158-88d8b965/02 §5 L62
048d0427 (!1158+!1174)2026-09-0828(本报告计算,见下)15013—6P,t512 连续 2 次通过PLAN.md L110-112、docs/PR-1174-048d0427/00 §2、docs/PR-1174-048d0427/02 §5
96ea3f55(CGDR 对照组)2026-09-082612113recurrent_reference[fp16](nrmse 边缘)未测PLAN.md L14、L118、docs/PR-1140-96ea3f55/02 §3
96ea3f55(RGDR)2026-09-084(正确性 3 + perf 1 被 deselect)030decode 单步精度(§7)无数据PLAN.md L14、L117、docs/PR-1140-96ea3f55/00 §4、§02 §4

收集数 26 → 28 的推算(本报告计算):d0906c3e 的 12P+1F+13S = 26,且 docs/PR-1135-d0906c3e/10 §9.1 明写"26 例收集:fp16 执行 + bf16 skip";048d0427 的 15P+0F+13S = 28,skip 数不变 → 新增 2 条 fp16-only 用例。这与 docs/PR-1158-88d8b965/00 §2("本 PR 同时加了 87 行测试把'宽 Hv / 多种 GQA 比例'变成测试变量")和 docs/PR-1158-88d8b965 头部("kernel.h 1 行 + 测试 +87 行")方向一致。"2" 这个数 docs 未直接给出,是从计数差反推的。

11 fail 的算术自洽:可执行 fp16 用例 = 26 − 13 skip = 13;725cf45d 为 11 fail + 2 pass = 13 ✓;a9c66ddb/69300ffc/d0906c3e 的 13 可执行拆分为"9 组 tail + 4 个非 tail(shapes_and_dtypes / optional_g / beta_zero / recurrent_reference 各 1 条 fp16)",与 §3 的 fail 清单和 docs/PR-1135-d0906c3e/02 §6.3 的 pytest 节点 id test_non_multiple_reduce_width[80-dtype0](含 dtype 参数)一致(本报告推算,docs 未给完整的 26 条参数化清单)。

2. 唯一的长期 fail:test_accuracy_recurrent_reference[fp16] ​

判定口径(阈值来自 docs):cosine ≥ 0.999 且 nrmse ≤ 0.02(docs/PR-1135-d0906c3e/10 §4 L180-182,7bbe0e01 给 tail 测试加 CPU 递推双断言时写明 out/state 都要过这两条);对照物是逐 token 的 CPU 全精度参考实现(docs/PR-406-00e39ab5/00 §4.4:"精度金标准")。

版本cosnrmse判定出处
d0906c3e(!1135 终态)0.9996(达标)0.0269 > 0.02FAILPLAN.md L93;docs/PR-1135-d0906c3e/02 §3 L68;docs/PR-1135-d0906c3e/00 §2 L57
69300ffc(四桶)0.9995(达标)0.0319 > 0.02FAILdocs/PR-1135-d0906c3e/10 §9.4 L331-333
725cf45d0.0(cosine=0.0)1.0FAIL(全零)docs/PR-1135-d0906c3e/10 §9.3 L306
048d0427(!1158+!1174 后)——PASS(15P/0F)PLAN.md L110;docs/PR-1174-048d0427/00 §2 L25
96ea3f55(CGDR 对照)—边缘FAILPLAN.md L118

派生量(本报告计算):

  • 69300ffc → d0906c3e 的 nrmse 改善:(0.0269 − 0.0319)/0.0319 = −15.67%;反向看 69300ffc 比终态差 18.59%(0.0319/0.0269 − 1)。
  • 超阈幅度:d0906c3e 超阈 34.5%(0.0269/0.02),69300ffc 超阈 59.5%(0.0319/0.02)→ 两者都属"边缘 fail",与 cos 余量(0.9995/0.9996 对 0.999)一样说明误差量级小、方向单一。
  • 口径冲突提示:docs/PR-1135-d0906c3e/10 §9.4 称 69300ffc 的唯一 fail "与终态 d0906c3e 完全一致",但同一句又给出不同的数值(cos 0.9995 vs 0.9996、nrmse 0.0319 vs 0.0269)。"完全一致"指的是失效用例与归因(同一个 !1158 待修的 beta 精度问题),不是指标数值。两处并列记录,不取舍。

3. 725cf45d 全零事件:11 个 fail 的完整拆解 ​

#用例判定条件(docs 原文口径)全零时的实际结果结论
1–9test_non_multiple_reduce_width[dk∈{63,65,79,80,81,95,96,97,127}](9 组桶边界,每组另有 bf16 版 skip)双断言:① 与零填充输入自洽比对;② 与 CPU 递推基线比 cosine ≥ 0.999 && nrmse ≤ 0.02cosine=0.0 / nrmse=1.0(全零与任何参考的余弦都是 0)9 组全挂
10test_accuracy_beta_zero(beta=0 边界)数值差比对out_diff ≈ 0.50挂
11test_accuracy_recurrent_reference[fp16](精度金标准)cosine ≥ 0.999 && nrmse ≤ 0.02cosine=0.0挂
12test_shapes_and_dtypes[fp16]只断言 torch.isfinite全零是有限的 → 通过过(漏网)
13test_optional_g[fp16](有/无 g 输入)只断言 torch.isfinite同上过(漏网)

出处:docs/PR-1135-d0906c3e/10-Commit演进史.md §9.3 L303-310(fail 构成 + "过"的两条 + 理由);9 组 dk 列表来自同文 §5.3 L218-219;阈值与"新增 CPU 递推基线"来自同文 §4 L180-185;用例定义来自 docs/PR-406-00e39ab5/00 §4.4 L106-116。

归因链(docs 已验证的三步,逐条可溯源):

  1. 失败只随 kernel 构建走:单测隔离实验——beta_zero 在 725cf45d 构建上单独跑也挂(排除测试间状态污染),同一用例在 a9c66ddb / 69300ffc 构建上单独跑都过(docs/PR-1135-d0906c3e/10 §9.3 L309-310)。
  2. 代码考古 + 排除:725cf45d 首次引入的 LoadPaddedRows 用 DataCopyPad 承担全部 K/Q 装载;a9c66ddb 的装载是标准 strided DataCopy,其 kernel.h 中 DataCopyPad 出现次数为 0(grep 验证)。310P(dav_m200)的 MTE2 对 DataCopyPad 支持不完整 → 静默不写数据:UB 先被 Duplicate 清零、DataCopyPad 不落数、后续 Cast 全读 0 → 全链路输出全零(docs/PR-1135-d0906c3e/10 §9.3 L312-321)。
  3. 修复由下一代 commit 承担:69300ffc 的 commit 注释明写 "using dav-2002 supported primitives",把 LoadPaddedRows 重写成 Duplicate 清零 + 标准 DataCopy 分块 + 标量尾巴三段式(同文 §5.2),终态 src/d0906c3e/op_kernel/chunk_gated_delta_rule.h:274 即该版本,其函数头注释本地可读到"dav-2002 supported primitives … fill at most 15 tail elements through Scalar"。

时间窗:docs 记为"71 小时窗口内主干上存在一个全零输出的 kernel"(docs/PR-1135-d0906c3e/10 §9.3 L323-327)。按同文 §0 的 commit 日期(725cf45d 8/17 → 69300ffc 8/17 中午)该窗口在同一天内,而 71 小时是按 8/14→8/17 分支跨度算的——本报告未重算这个时长,原样引用,标注为 docs 口径。

4. 探针脚本输出(absmax 对比) ​

探针:/tmp/probe725.py,shape B=1,H=2,T=64,DK=64,DV=32,标准随机输入,打印 out.float().abs().max() 与 fs.float().abs().max()。

构建out absmaxstate absmax判定
725cf45d0.00.0全零(静默错误,无 NaN)
a9c66ddb≈0.096≈0.023正常
69300ffc≈0.096≈0.023正常
d0906c3e≈0.096≈0.023正常

出处:docs/PR-1135-d0906c3e/02 §6.4 L194-213(脚本全文 + 注释行 # 725cf45d → 0.0 / 0.0(全零);a9c66ddb/69300ffc/d0906c3e → ~0.096 / ~0.023);同文 §6.4 的 shape 与 docs/PR-1135-d0906c3e/10 §9.3 L296-301 一致。

为什么探针必要(本报告计算):pytest 的 isfinite 类断言对"输出恰为 0"没有任何区分度,而 absmax 这个非平凡数值锚直接把比值拉到 ∞(0.096 vs 0.0);docs 的对应结论是"正确性测试至少要有一个非平凡数值锚(对全零敏感)"(docs/PR-1135-d0906c3e/10 §9.6 第 1 条)。

5. CGDR_DEBUG_LOG 观察:同 shape 在两个 commit 落进不同的桶 ​

CGDR_DEBUG_LOG=1 + pytest 带 -s,节点 test_non_multiple_reduce_width[80-dtype0](dk=80 的 tail 用例):

构建dkvSteptbuf(UB 预算,字节)装载实现结果
725cf45d8096153088DataCopyPad全零
d0906c3e8080125312LoadPaddedRows v2正确

出处:docs/PR-1135-d0906c3e/02 §6.3 L176-190(原文两行输出 + "同一个 shape 在两个 commit 间桶归属、UB 预算都不同——这是 SelectCubeDk 演进的直接可视化")。开关实现锚点:src/d0906c3e/op_host/chunk_gated_delta_rule_tiling.cpp:250-253(LogTiling,std::getenv("CGDR_DEBUG_LOG") 门控)。

派生量(本报告计算):vStep 96 vs 80 = +20.0%((96−80)/80);tbuf 153088 − 125312 = 27776 字节(+22.17%)。两者同号同向 → 落进 96 桶要按 96 宽补 K,UB 预算被顶高 22%,而多算的 16 列正是 docs/PR-1135-d0906c3e/10 §5 L191-193 说的"砍掉 80 意味着 dk=80 从专用快路径掉进 96 桶多算 16 列"的直接量化。

代码侧可核对的桶常量:src/d0906c3e/op_host/chunk_gated_delta_rule_tiling.cpp:43-46(kSmallCubeDk=64 / kMidSmallCubeDk=80 / kMediumCubeDk=96 / kLargeCubeDk=128)与 :212-226(四段 SelectCubeDk)。725cf45d 只有 64/96/128 三桶(docs/PR-1135-d0906c3e/10 §3.1 L131-136 的代码引用 + §5.1 L196 "80 桶回归"),与观测到的 dk=80→vStep=96 完全吻合。

6. 间歇崩溃的复测记录(稳定性失效线) ​

构建首跑复跑(带 -v)崩溃 kernel 后缀 / 报错出处
a9c66ddbperf 1F + 2 errors(设备脏后下一条数据生成算子连带报错)6 passedChunkGatedDeltaRule_..._2(当时 tilingKey=2 = 128 桶 kernel)docs/PR-1135-d0906c3e/02 §6.5 L219;同 10 §9.5 L340-342
69300ffcperf 1F(后续 case 受累)6 passed同模式(4 桶版,后缀 _3)docs/PR-1135-d0906c3e/02 §6.5 L220;后缀规则见同表 L222-225
d0906c3e(09-08)t512:单跑 3 次 = pass/crash/pass重跑即过runtime result 507015、fault kernel=ChunkGatedDeltaRule_...PLAN.md L106;docs/PR-1135-d0906c3e/02 §4 L92-93
d0906c3e(09-14)t2048 3 次 = pass/crash/pass;t512 2 次 = crash/pass—硬件报错 L0C read/write conflict (vec read & cube write same address)docs/PR-1135-d0906c3e/02 §6.5 L221;10 §9.5 L344-352(报错原文)
048d0427t512 连续 2 次通过(4.363 / 4.376 ms)—无崩溃docs/PR-1174-048d0427/02-实验复现.md:89;docs/PR-1174-048d0427/02 §5 L89

崩溃指纹三条(判定"是本 bug 不是环境问题"):fault kernel_name=ChunkGatedDeltaRule_... + runtime result = 507015 + Aicore kernel execute failed ... aicore exception(docs/PR-1174-048d0427/02 §4 L69-72)。

后缀随 tilingKey 数变化的规律(本报告与 docs 双口径核对):docs 写"3 桶版 _2 / 4 桶版 _3"(docs/PR-1135-d0906c3e/02 §6.5 L222-223)。可核对的是 kernel 入口的分支数:src/d0906c3e/op_kernel/chunk_gated_delta_rule.cpp:33-49 是 4 个 TILING_KEY_IS(0=64/1=80/2=96/3=128)、src/a9c66ddb/op_kernel/chunk_gated_delta_rule.cpp 是 3 个分支,与"kernel 个数 3→4"一致。但 a9c66ddb 的 3 分支注释把 key=2 定为 Dk=128 路径(src/a9c66ddb/op_host/chunk_gated_delta_rule_tiling.cpp:311-316),所以崩溃记录里的"_2 = 128 桶"是 3 桶版语义,不能按终态的 _2=96 桶去读——两套含义同号不同指,引用时必须带上构建版本。

同一 bug 而非新引入的判据(docs 原话):shape 簇(dk=128 长序列)、概率量级(~1/3)、错误机理(L0C 读写冲突)在整条分支上完全一致(docs/PR-1135-d0906c3e/02 §6.5 L223-225、10 §9.5 L353-356)。注意概率的样本量:崩溃侧只有 3~5 次单跑(pass/crash/pass、crash/pass),修复侧只有连续 2 次通过——"~1/3"是 docs 的表述,本报告不重新估计概率。

7. 对照段:RGDR(!1140)的 3 个 fail(不展开) ​

项值出处
测试规模4 条 = 正确性 3 + perf 1(deselected)PLAN.md L14
结果3 failed / 0 passed(decode 形状 seq_len=1,batch 1/2 + 第三个用例)PLAN.md L117;docs/PR-1140-96ea3f55/02 §4 L56-61
判定条件逐元素 atol 1e-3同上
超差比例59.7% 元素超差PLAN.md L117;docs/PR-1140-96ea3f55/00 §4 L44
最大绝对差0.0104(PLAN.md L117 / docs/PR-1140/00 §4);但 PLAN.md L14(Step H 勾选项)写作 0.010两处并列
docs 解读decode 每 token 一次 fp16 state 量化往返(无 CGDR 的 FP32 workspace 修正),噪声逐步累积;1e-3 对该结构偏严;该 commit 分支时点早于 CGDR 两修复合入docs/PR-1140-96ea3f55/00 §4 L44-46、PLAN.md L118

RGDR 只用于说明"同一模型的 prefill/decode 分工"(docs/PR-1140-96ea3f55/00 §1 L19-27),其精度问题不是本台账趋势线的一部分。派生(本报告计算):超差元素 59.7%、最大差 0.0104 = 阈值的 10.4 倍(0.0104/0.001),即超幅并不极端而覆盖极广 → 与"每步量化累积"的机理描述自洽(若是个别列被写坏,形态应是少量元素大幅超差)。