Pull Request已成功合入, 合并人@CANN-robot
(感谢 starfican 的贡献)Hi @starfican, welcome to submitting your first PR to ops-ras!
PR Merge Steps
1. CLA Signing
If the current PR label includes cann-cla/yes, it means you have signed the CLA and can proceed to the next step. If the label includes cann-cla/no, please sign the CLA first. If you have any questions, please refer to the FAQ.
2. CI Check
Please comment /compile to trigger the CI pipeline check. If the CI run is successful, the PR will be tagged with ci-pipeline-passed and you can proceed to the next step. If the CI run fails, the PR will be tagged with ci-pipeline-failed, please check the CI logs to fix the issues in the PR. If you have any questions, please refer to the FAQ.
3. Code Review
After CI passes, please refer to the PR Approval Progress and proactively @ the committers in the table to review the code. After approval, committers will comment /lgtm and /approve. Once the lgtm and approved labels are successfully added, the PR will be merged automatically.


Thanks for your pull-request.
The full list of commands accepted by me can be found at here.
You can get sig-info at here.
You can self-configure the PR merge rules for this repository. For more details, please refer to Here.
For more, you also can visit HICANN.
PR Approval Progress
✅ Congratulations! All modules have met the lgtm and approve requirements.
Module Approval Details
| module | lgtm status | approve status |
|---|---|---|
| repo-cann/ops-ras | ✅ 冯彤, 於欣洁 (2/2) | ✅ 於欣洁 (1/1) |
💡 Tip:
- Committer can comment
/approveor/lgtm- Commenting
/approveimplies both code review (lgtm) and intent to merge (approve)
CLA Signature Pass
starfican, thanks for your pull request. All authors of the commits have signed the CLA. 👍


变更摘要
本次 PR 新增 MatmulFt 矩阵乘法外挂容错算子,代码位于 reliability/matmul_abft_verify。
该算子面向输出精度为 FLOAT32 的矩阵乘法算子。调用方提供输入矩阵 A、B 以及待检测的矩阵乘法结果 C,MatmulAbftVerify 基于方差估计
自适应门限算法(V-ABFT),对 C 执行分块 checksum 校验,以检测并定位矩阵乘法过程中产生的静默计算错误。
算子支持 BFLOAT16 和 FLOAT32 两种输入精度,支持 Atlas A2/A3 系列产品,并配套提供算子定义、shape/dtype 推导、
host tiling、kernel 实现、aclnn 接口文档以及 BF16 调用样例。
主要改动
新增 MatmulAbftVerify 外挂容错算子
接口功能:实现基于方差估计自适应门限算法(V-ABFT)的GEMM容错检测算子。算子接收矩阵A、B以及预先计算的矩阵乘结果C,对C进行分块ABFT校验,检测静默计算错误并输出逐行检测结果。
特点
自适应阈值: 该算子能够根据矩阵大小与值域自动确定用于比对的阈值,能够在保证检出率的同时避免误检。
计算量显著小于基于重新计算的容错方案。在矩阵维度m=n=k=a时,本算子只需8a^2次浮点计算,而重算则需要2a^3次浮点计算。且容错阈值也与该算法相匹配
计算公式:
C=A×B,A∈RM×K,B∈RK×N
Cr=C×r,Br=B×r
其中阈值Thresholdi由输入矩阵A、B的局部统计特征(均值、标准差)动态估计,无需依赖C矩阵输出结果。
算子功能说明:
输入矩阵A、B和预先计算的C经过checksum编码、阈值估计和校验比对流程,输出压缩后的逐行故障检测结果张量
comp_row,1表示正确,0表示检测到错误。函数原型
每个算子分为两段式接口,必须先调用“aclnnMatmulAbftVerifyGetWorkspaceSize”接口获取入参并根据计算流程计算所需workspace大小,再调用“aclnnMatmulAbftVerify”接口执行计算。
aclnnStatus aclnnMatmulAbftVerifyGetWorkspaceSize( const aclTensor *a, const aclTensor *b, const aclTensor *c, const aclTensor *checksumWeight, double EMAX, const aclTensor *compRow, uint64_t *workspaceSize, aclOpExecutor **executor);aclnnStatus aclnnMatmulAbftVerify( void *workspace, uint64_t workspaceSize, aclOpExecutor *executor, aclrtStream stream);aclnnMatmulAbftVerifyGetWorkspaceSize
参数说明:
其中 splitN=⌈N/256⌉。
算子文档
新增 reliability/matmul_abft_verify/docs/MatmulAbftVerify.md
BF16 调用样例
新增:
reliability/matmul_abft_verify/examples/test_aclnn_matmul_abft_verify_bf16.cpp
由于前序矩阵乘法算子 aclnnGemm 暂时无法通过 ops-transformer 当前提供的脚本完成编译,仓库内样例仅展示 MatmulAbftVerify的调用方
式,没有在样例中串联实际的前序矩阵乘法,因此不构成完整的端到端容错演示。
包含前序矩阵乘法、多精度验证的完整样例可参考:
https://gitee.com/kanby123/matmul_abft_verify
约束说明
确定性计算:
输入矩阵a、b和c必须为2维,shape分别为[M, K]、[K, N]和[M, N],且a的第1维(K)与b的第0维(K)必须相等。
输入向量weight的shape必须为[N]。
支持的数据类型组合为:
不支持的场景:
Workspace使用设计
workspace由两部分组成:
算子tiling阶段根据M、N、K和输入精度计算完整大小,并通过
workspaceSize返回。调用者必须申请不少于该大小的连续device内存,不能只按compRow大小申请。所有中间张量的起始地址按32字节向上对齐。定义:
设
W为user workspace首地址。在kernel内,W = AscendC::GetUserWorkspace(workspace);对于算子外部的device地址计算,当前实现等价于W = (uint8_t *)workspace + 16 MiB。以下偏移均相对
W。令S0 = 0,每个张量的起始偏移为Oi = align32(Si),结束位置为Si+1 = Oi + 元素数 × 元素字节数:W + O0rowSplitLenW + O1rowSplitLenW + O2rowSplitLenW + O3bStatLenW + O4bStatLenW + O5bStatLenW + O6beLenW + O7beLenW + O8beLenW + O9beLenW + O10MW + O11MW + O12MAMean计算使用的常量因子
1/K不占用workspace。tiling阶段按输入精度生成该scalar,kernel在首次计算AMean时直接用它初始化FT的L1内部缓冲区,因此该因子不能作为workspace中间结果拷出。如果需要调试并拷出某个中间结果,应在算子执行完成且workspace尚未释放或复用时,从上表对应的
W + Oi开始执行device-to-host拷贝,拷贝字节数为“元素数 × 元素字节数”。对外读取workspace属于调试能力,不是稳定的公开输出接口;布局发生变更时,以matmul_abft_verify.cpp中Workspace ABI注释下的地址切分代码为准,该代码也是偏移计算的示例实现。验证情况
精度验证
算子编译及执行测试通过;
BF16 FP32 aclnn 接口调用测试通过;
测试数据类型:BF16、FP32。
测试形状:矩阵乘形状按 (M, N, K) 表示,M/N/K 分别取 {1024, 2048, 4096, 8192},采用全组合覆盖,共 64 种形状/数据类
型,合计 128 个测试用例。
精度标杆:以 CPU 侧 Golden 计算结果为基准,校验 BMeanAbs、BMeanSquare、BVar、COMPRow、ZRow、BE/BEforAIV、DRow、
AMean、AMin、AMax 和 Thre 共 11 项中间结果及检测结果。阈值计算参数 e_max 为:
通过标准:
测试结果:BF16 和 FP32 各 64/64 个形状全部执行成功;每个用例的 11 项 Golden 校验均为 PASSED,合计 128/128 个用例通
过,1408/1408 项校验通过,无失败项,通过率 100%。
结论:MatmulAbftVerify 算子在本次覆盖的 BF16、FP32 数据类型及全部 64 种矩阵形状下,精度测试全部通过。
FP32 C 错误注入实验
除无故障场景下的数值精度验证外,对待检测矩阵 (C) 进行了 bit-flip 错误注入,以验证算子对实际 SDC 的检测能力。
测试覆盖以下矩阵形状:
并覆盖多种输入数据分布:
对于 BF16 输入、FLOAT32 C 的实验,在 FP32 C 的 bit 27~29 注入错误时,四组矩阵 shape 的检出率基本保持稳定:
clamped_normal_0_1:约 95.12%~95.27%normal_1_1:100%normal_1e-6_1:约 97.49%~97.60%uniform_-1_1:约 92.51%~92.73%例如 ((M,K,N)=(4096,4096,8192)) 时,bit 27~29 的检出率分别为约 95.20%、100%、97.60% 和 92.73%。
对于 FP32 输入,在测试的 bit 23~30 范围内,各数据分布的检出率整体保持在约 90%~100%。例如 ((4096,4096,4096)) 时,bit 23~30 的检出率最低约为 90.04%,多项测试达到 100%。
与此同时,在上述错误注入测试对应的正常数据检测中,各测试 bit、矩阵 shape 和数据分布均未观察到误报,False-positive rate 为 0%。例如 FP32 ((4096,4096,8192)) 的全部 bit 23~30 和四种数据分布误报率均为 0。
该结果说明,在当前错误注入覆盖范围内,自适应门限能够在保持零误报的同时,对会造成显著结果扰动的 bit-flip 错误维持较高检出率。
BF16 (M,K,N)=(2048,4096,4096) — Detection rate (%)
BF16 (M,K,N)=(2048,4096,8192) — Detection rate (%)
BF16 (M,K,N)=(4096,4096,4096) — Detection rate (%)
BF16 (M,K,N)=(4096,4096,8192) — Detection rate (%)
FP32 (M,K,N)=(2048,4096,4096) — Detection rate (%)
FP32 (M,K,N)=(2048,4096,8192) — Detection rate (%)
FP32 (M,K,N)=(4096,4096,4096) — Detection rate (%)
FP32 (M,K,N)=(4096,4096,8192) — Detection rate (%)
BF16 C 转 FP32 后的错误检测实验
由于 MatmulAbftVerify 当前对外接口要求待检测矩阵 (C) 为 FLOAT32,而实际业务中前序矩阵乘可能产生 BF16 输出,因此额外验证如下使用路径:
首先在 BF16 的矩阵乘结果中注入错误,再将结果转换为 FLOAT32,最后作为
C输入 MatmulAbftVerify。测试同样覆盖:
以及四种数据分布。
实验结果显示,对于 BF16 bit 11~13 的错误:
clamped_normal_0_1:检出率约 95.12%~95.27%normal_1_1:100%normal_1e-6_1:约 97.49%~97.60%uniform_-1_1:约 92.51%~92.73%例如 ((2048,4096,4096)) 时,bit 11~13 在四种数据分布下的检出率分别为 95.122%、100%、97.531% 和 92.506%。
对于较低 bit,随着注入扰动幅度降低,检测率也会下降。例如该组实验的 bit 7~8 未产生可检出的结果,bit 9~10 的检出率则依数据分布和 bit 位置不同而变化。
四组矩阵 shape 下的误报率均为 0%。例如 ((4096,4096,8192)) 时,从 bit 7 到 bit 14、四种数据分布下的 False-positive rate 全部为 0。
因此,对于“前序矩阵乘结果为 BF16、转换为 FP32 后再进行外挂校验”的使用场景,当前实现同样能够对具有足够数值影响的错误保持较高检测能力,并在本次测试范围内未观察到误报。
BF16 (M,K,N)=(2048,4096,4096) — Detection rate (%)
BF16 (M,K,N)=(2048,4096,8192) — Detection rate (%)
BF16 (M,K,N)=(4096,4096,4096) — Detection rate (%)
BF16 (M,K,N)=(4096,4096,8192) — Detection rate (%)
性能测试
对 MatmulAbftVerify 单独执行延时以及同 shape 下
aclnnGemm的执行延时进行了测试,并使用:Fault Tolerance Overhead=TGEMMTMatmulAbftVerify×100%
衡量外挂检测算子相对于原始矩阵乘的额外时间成本。
部分代表性测试结果如下:
测试结果与算法复杂度的预期一致:对于较小矩阵,外挂算子本身的固定启动及统计计算开销占比较高;随着矩阵规模增大,GEMM 计算量按 (O(a^3)) 增长,而容错检测主要按 (O(a^2)) 增长,因此相对容错成本明显下降。
例如对于 (8192^3):
3.8666 ms0.7536 ms而对于 FP32:
12.5441 ms1.0695 ms说明在较大规模矩阵乘场景下,该方案能够以明显低于重新执行一次完整 GEMM 的额外延时完成结果校验。