满 分 要 对 上 芯 片 上限: 华 为 CANN Bench 评 Agent 写的 昇 腾 算 子
53 个算子、1060 条公开用例,另有每算子 80 条隐藏用例还没放出。编译、算对、速度的权重是 0.2、0.3、0.5。全部算对但只跑到基线,是 75 分。这篇没有模型排行。

本文目录
满分要对上芯片上限:华为 CANN Bench 评 Agent 写的昇腾算子
华为的预印本 CANN Bench: Benchmarking Agent Generated Kernels against Real NPU and Algorithmic Limits,arXiv 公开戳记是 2026 年 7 月 8 日(2607.20518)。作者单位写的是 Huawei。CANN Bench 评的是 Agent 在华为昇腾 NPU 上写出的算子内核:能不能编译、算得对不对、离这颗芯片的分析上限还有多远。这篇没有模型排行。在线榜和提交后端都写明还在准备。
现有昇腾评测要么太浅,要么绑在一条训练配方上
CUDA 和 Triton 上的内核评测不能直接搬到昇腾。昇腾要显式管存储层次、tile 形状,以及 Vector 核和 Cube 核怎么排流水。CANN 是华为连接上层框架和昇腾处理器的异构计算架构。
论文点名两套更靠近昇腾的基准,并说明它们没同时满足自己的维护和防奖励黑客要求。MultiKernelBench 有 285 道任务、14 类内核、三种硬件(NVIDIA GPU、华为昇腾 NPU、Google TPU),昇腾只是其中一片,单算子规格浅。NPUKernelBench 和 AscendKernelGen 的微调配方一起放出;该配方报告 Level-2 的编译率在思维链数据加端上执行反馈的强化学习之后,Pass@10 从 0% 升到 95.5%。论文认为它有两处不适合当公共尺子:静态形状轨道上,一道任务的全部测试对应同一种输入配置,专吃这一种形状就能过;任务集跟着这一条训练流水线变,而不是跟着整个昇腾生态变。这些百分比是别的工作的数字,不是 CANN Bench 上的模型分。
同样只作背景、不进 CANN Bench 分数的还有:AscendOptimizer 在 cann-ops 的 127 个算子上报告 1.19 倍几何平均加速;EvoKernel 在自建的 NPU 版 KernelBench 上把前沿模型正确率从 11% 抬到 83%。
53 个算子、1060 条公开用例,隐藏集另算
首发 53 个算子、1060 条测试,目标硬件是昇腾 910B2,对照的工具链是 CANN 9.0.0 及以上。精度覆盖 FP16、BF16、FP32 和整数路径(int8、uint8、int32、int64),以及混合精度。FP8、HiF8、MXFP8、FP4、MXFP4 还没进这版榜。
难度按算子怎么占硬件单元分四档,不按代码长短:
- L1:8 个,只用 Vector Core 的单原语。例子是 gelu、swi_glu、sigmoid、mish。
- L2:16 个,融合的 Vector 计算,不做矩阵收缩。例子是 rms_norm、cross_entropy_loss、softmax、apply_rotary_pos_emb。
- L3:21 个,矩阵收缩再加 Vector。例子是 conv2_d、grouped_matmul、top_k、dequant_swiglu_quant。
- L4:8 个,一个内核里要把 Matrix 和 Vector 流水协调起来。例子是 sparse_flash_attention、mla_prolog、gru、lstm。
8+16+21+8=53。正文写每个算子大约 20 条用例,53×20=1060,所以这 1060 是公开集。每个算子另有 80 条隐藏用例,留在榜单服务器上,不随仓库公开,规格和唯一性约束与公开集相同。隐藏集因此不在 1060 里。榜单准备把两段都算进去,用来挡住只拟合公开输入的内核。提交后端和在线榜都还没放出。
规格相对官方算子库 opbase 做了收窄:dtype、形状范围和外围路径可以比生产实现少,评的是核心内核,不是整套生产代码。也收了官方库里还没有的新算子,例如 DeepSeek 的 Engram。仓库在 https://gitcode.com/cann/cann-bench ,协议是 CANN Open Software License Agreement Version 2.0。opbase 仍是随 CANN 发布的生产算子集合,两者任务有重叠,但不是同一套。
每道题四个文件:desc.md 写数学定义、接口和精度容差;proto.yaml 写名字、类别、形状和 dtype;cases.csv 写具体形状、超参和基线耗时(微秒);golden.py 是通常用 PyTorch 写的参考实现。
用例不用单一形状。元素总量大约从 10^6 到 3×10^8:小的卡在片上缓冲,大的把带宽打满。最内层维度的字节长度是 512 B 的倍数算对齐,否则不算。512 B 对 FP16/BF16 是 256 个元素,对 FP32 是 128 个,对 INT8 是 512 个。每个算子的 20 条公开用例里,至少一半必须不对齐;不对齐的子集再偏向质数形状。秩从 1D 到 5D。输入范围至少要覆盖对称小值、类型边界和特殊值(±∞、NaN),不能只喂温和数据。公开集里,元素总量、属性组合和取值范围三条都要求互不重复。图 1d 标的 n 是 160、320、378、156,加总 1014,对不上 1060,这篇不把它们当成各档题量。图 1b 的类别计数加总是 53,最大的是 FusedComposite。
编译、算对、快慢是三轴,快慢钉在芯片上
每个用例有三个时间。Tbaseline 是目标 NPU 上测到的参考实现耗时。摘要和结论把它写成开箱的 PyTorch-on-Ascend 基线,第 3 节写成该算子的 CANN 内部实现。THW 是这条用例的硬件锚定性能上限(HAP),按 910B2 已公布的峰值和分析步骤算一次,不随框架版本漂。Tcand 是候选内核实测。按定义应有 THW ≤ Tbaseline;反过来就触发审查,查的是上界推导或计时,不是直接加分。
910B2 的一个 AIC 组里六类单元同时干活:Cube、Vector、MTE1、MTE2、MTE3、FixP。一颗芯片上有 24 个 AIC 组。THW 是在各种 tile、调度和缓冲分配里,让这六类单元里最慢的那段时间尽量短,并且假设峰值速率、完美重叠、零主机启动开销。真实内核不能突破这个理想下界。1060 条用例的瓶颈标签是:MTE 63%,Vector 26%,Cube 11%。MTE 把数据搬运和 FixP 写回算在一起。
单用例性能分是:
Score = (Tbaseline − THW) / ((Tcand − THW) + (Tbaseline − THW))
和基线一样快是 0.5,贴上 HAP 是 1,越慢越靠近 0。比 HAP 还快不截断到 1,但要标记复查:上界偏松、测量被钻空子,或分析模型有缺口,三者都要查。比原始加速比 Tbaseline/Tcand 稳的地方是:基线已经很接近芯片上限时,公式仍然有定义,并且同样比例的进步拿同样的分。
算子分把三轴加起来,再乘 100。权重是编译 wc=0.2、功能 wf=0.3、性能 wp=0.5。编译是算子级的一次成功或失败;功能和性能按用例。编译失败时,功能项全部记 0,算子分就是 0。编译成功但某条用例没算对,这条用例丢掉 0.3 和 0.5×Score,别的用例和那 0.2 还在。因此只编译过、一条都没算对,是 20 分。全部算对并且每条都贴上 HAP,是 100 分。全部算对但只跑到基线(Score=0.5),是 75 分。全部贴上 HAP、但只做对一部分用例时,要超过大约 11/16 的用例(20 条里大约 14 条)才能超过这个 75 分。
档分和总分是算子分的和,不是平均。L3 有 21 个算子,L1 只有 8 个,所以满分档分分别是 2100 和 800。档分不能直接比谁更难。
功能门限看相对误差。有限值位置上,ei = |预测 − 参考| / (|参考| + 10^−7)。均值要小于 τ,最大值要小于 10τ。现用榜的浮点门限是 FP16 的 2^−10、BF16 的 2^−7、FP32 的 2^−13。HiF32 的 2^−11、FP8 E4M3 的 2^−3、FP8 E5M2 的 2^−2 只是扩展项,还不是这版榜的门。整数默认要精确相等,量化输出可以声明有界容差。NaN 必须对得上;同号无穷大不进相对误差;反号无穷大直接失败。
第一道筛子没过时,只有落在小值区或消去区、而且正常区没有失败的点,才可以改看绝对误差条数。NPU 上的错误计数除以 CPU 同精度黄金实现的错误计数(至少按 1)要 ≤ 2。两个区分开算。默认黄金实现在 CPU 上把浮点升到 FP64,比完再铸回设备 dtype。某个算子可以在 proto.yaml 里放宽阈值,论文建议浮点放宽不超过默认的 10 倍,结果里要能看出是放宽后通过的。
默认榜只跑一轮输入。另有可选的第二轮:过了第一轮之后重采样,浮点张量再扰动 0.01,两轮都过才算功能正确。返回值必须是真正算出来的 torch.Tensor,挡住懒计算包装。
计时前用一次重的 MatMul 加 ReduceMax 把 NPU 推到持续的最高 DVFS 状态,两次计时之间清掉 L2,每个算子单独一个子进程。基线写在各任务的 cases.yaml 里,跟着记录它们的那一版 CANN 走;更老的工具链不保证对得上这些微秒数。刷新基线的工具还在后续版本里。
防奖励黑客写成规格的一部分,不公开触发器细节。论文列了五类表面:把语义转给现成框架或同一个 CANN 算子、把张量弄下 NPU 在 CPU 上算、缓存或写死输出、交懒计算包装、改计时或 profiler。原则是:被计时的必须是提交的内核,计算留在目标设备上,输出要逐条物化,测量路径归评测器管。多流提交先限制、不完整排名。不透明的预编译二进制靠策略和人工复查。评测机上可以禁止静默派发到已安装的同名算子;这是榜单机器的策略,不是禁止内核里使用合法的底层原语。本地安装不会自动带上这层机器加固。
这些数不能被读成什么
这篇没有 Agent 分数,不能排出模型名次。1060 是公开用例;每算子 80 条隐藏用例还没公开,在线榜和提交后端也还没上线。档分是求和,算子多的档天然更大。Tbaseline 在摘要里叫 PyTorch-on-Ascend,在第 3 节叫 CANN 内部实现,两边用词不完全一样。图 1d 的 n 加总不是 1060。分数绑在昇腾 910B2 和当前这一套内核写法上,不能外推到更新的昇腾芯片或其他 DSL;Triton、PyPTO、TileLang 是计划,不是这版结果。FP8 及更低精度不是这版的榜门。可选的第二轮刷新默认没开。比 HAP 更快的分数不截断,但是复查信号,不是成绩。MultiKernelBench、NPUKernelBench、AscendOptimizer、EvoKernel 的百分比和加速比是它们自己的实验。预印本许可证是 arXiv.org perpetual non-exclusive license,这篇只复述评测口径和论文里的汇总数字,不写算子实现。
出处:华为,Xue-Jian Gao、Deng Pan、Yueming Su 等,CANN Bench: Benchmarking Agent Generated Kernels against Real NPU and Algorithmic Limits,2026-07-08,https://arxiv.org/abs/2607.20518
觉得有用,转给同事
微信扫码
用微信扫一扫,在手机上打开后即可转发。