Merged
fix(AccumulateNV2): P1缺陷整改+broadcast收回+fp16性能优化+golden精度标准落位 #6584
fix(AccumulateNV2): P1缺陷整改+broadcast收回+fp16性能优化+golden精度标准落位 #6584
Merged
wangweidongAdd on 19 days ago
wangweidong
19 days ago

概述

AccumulateNV2 算子验证整改全量提交(15 个 commit,基于 cann/ops-math master 干净分支,不含其他算子改动)。

修复内容

P1 功能缺陷

  • dtype 一致性校验(7f5b5cd8b):图路径/aclnn 第一段/tiling 三层补齐 161002 校验
  • fp32 极值 NaN(7f5b5cd8b→6cbebfe2e):守卫式 TwoSum → TF 竞品同构顺序求和(N≤9 顺序、N>9 余数优先 8 分块,复现 TF AddN 舍入)
  • N 参数校验(7f5b5cd8b):Host 侧 N==输入数一致性
  • broadcast 收回(ebb6bdce3):算子本体同 shape 强校验;aclnnSum 接口层保留 BroadcastTo 对齐

死代码清理(4e840cb20,-242 行)

  • TilingData 删 needBroadcast/rank/outputShape/inputStrides 四个死字段(2632B→32B)
  • SIMT 路径收敛为 float 专用;删 GetBroadcastInputOffset 与全部广播死分支
  • 入口模板以 UT_SOC_VERSION 守护,修复 UT 构建回归(fbd2dd9f2 连带)

性能优化(MTE bound 归一化后 NPU 优 A100 1.68x)

  • fp16 SIMT 地址提升(c4ca3f64e,+3%)
  • fp16 非广播路径切换 Vector 管线 half 累加(502dd93b6):中位加速 7.60x,吞吐 203→1615GB/s(峰值 2140),67 例三方比对 67/67 PASS

golden 精度标准(2b074c737、743c3606a)

  • fp16 分路径:kernel 直连=numpy 顺序 half 累加(Vector Add 链同构);aclnnSum=fp32 promote
  • TestSpec 落位 tolerance:浮点 cross_check L1 / 整数 binary_equal L2
  • kernel 直连参考移除 broadcast 对齐块(同 shape 契约)

文档(5c09ec3d0、4976fa638、fbd2dd9f2、72e543b8a)

  • README/aclnnSum 7 项修正;-1/-2 动态维语义声明;文件命名规范;格式规范清理

验证(Ascend950PR / CANN 9.3.0)

  • UT:op_kernel 10/10、op_host 20/20
  • TTK:fp16 大 shape 67/67;混合 dtype 26/26(另 10 例 rank-0 挂已知 CANN 框架 bug 的 Dyn/Cst 编译,Binary 全 100%)
  • v4 全量扫描:kernel L1 150 例 Binary 对 golden 零精度失败
  • 性能无回归(清理前后中位持平)

关联的Issue

3870

测试

已通过对应算子的构建、UT 与 TTK 精度验证。

文档更新

包含相关 README / 接口文档更新。

类型标签

likedislike
Pull Request has been successfully merged by CANN-robot.
(Thank you for wangweidong's contribution.)
Wwangweidong
19 days ago Created pull request, commit 91e4552c
atomgit-bot
atomgit-bot
19 days ago Comments:

变更摘要

本 PR 对 AccumulateNV2 算子进行验证整改,围绕功能缺陷修复、广播语义收回、死代码清理、性能优化与 golden 精度标准落位展开。核心是补齐 dtype/N 参数校验、将算子本体收敛为同 shape 强校验(广播对齐交由 aclnnSum 的 op_api 层 BroadcastTo 承担),并将 fp32 累加由 TwoSum 补偿改为与竞品同构的顺序求和,同时删除 tiling 中的广播死字段、将 fp16 非广播路径切换为 Vector 管线 half 累加,并新增 tests/assets/golden.py 落位 tolerance 标准。

主要改动

  • 三层补齐 dtype 一致性校验: aclnn_sum.cpp 的 CheckDtypeValid 逐个校验 tensors[i] 与 out 的 dtype;InferDataType4AccumulateNV2 遍历输入校验与首个输入一致并处理输入数为 0;tiling 侧 FillShapeInfo 一并校验输入与输出 dtype,不一致即返回 GRAPH_FAILED。
  • 广播收回与同 shape 契约: accumulate_nv2_infershape.cpp 移除 InferShape4Broadcast,改为校验 N 等于实际输入数并对每个输入逐维比对首输入 shape;accumulate_nv2_graph_infer.cpp 删除 MergeBroadcastShape/MergeBroadcastDim,FillShapeInfo 删除广播 stride 计算并直接以首输入 shape 作为输出。
  • fp32 极值求和改为 TF 同构顺序累加: AccumulateNV2SimtKernel 删除 TwoSum 补偿逻辑,改为 N<=9 左到右顺序累加、N>9 余数优先 8 分块累加,复现 TF AddN 舍入行为;kernel 收敛为 float 专用,删除 GetBroadcastInputOffset 与广播死分支。
  • 死字段与死代码清理: AccumulateNV2TilingData 删除 rank、needBroadcast、outputShape、inputStrides 四个字段;accumulate_nv2.h 中同步删除 ACCUMULATE_NV2_SIMT_SHAPE_OFFSET/STRIDE_OFFSET 及相关成员与初始化;删除测试 test_accumulate_nv2_graph_infer_pass.cpp。
  • fp16 路径与 golden 精度标准: fp16 非广播路径改为 Vector 管线 half 累加(UT 期望值由 2050 调整为 2048);新增 tests/assets/golden.py,分 kernel 直连(numpy 顺序 half 累加)与 aclnnSum(fp32 promote)两条参考路径,并在 TestSpec 落位浮点 cross_check/L1、整数 binary_equal/L2 容差。

🧩 本次 Review 已使用自定义 Skill:

likedislike
Incorrect?
atomgit-bot
atomgit-bot
19 days ago Comments:

代码审查

审查结论

发现清单(4 项:P2 × 1,P3 × 3)

# 优先级 位置 问题
1 P2 op_host/accumulate_nv2_infershape.cpp:55-60 逐维 != 比较把未知维 -1 判为不一致,误拒动态 shape 图(原 InferShape4Broadcast 按通配合并)
2 P3 op_graph/accumulate_nv2_graph_infer.cpp:59-62 V1 graph infer 同源缺陷:inputDims != outputDims 同样把 UNKNOWN_DIM(-1) 判为不一致
3 P3 op_graph/accumulate_nv2_graph_infer.cpp:80-100 新增的 dtype 一致性 / 同 shape / N 校验逻辑完全无 UT(原 op_graph UT 目录整体删除),错误闸门写反不会被任何用例拦住
4 P3 op_kernel/arch35/accumulate_nv2.h:143-145 fp16 空 tensor 由 SIMT 分支改落 vector 分支后,新可达路径下以 ubLength_==0 调用 InitBuffer

逐文件审阅确认

  • math/accumulate_nv2/framework/CMakeLists.txt —— no issues(仅版权头与行尾换行)
  • math/accumulate_nv2/op_api/aclnn_sum.cpp —— no issues(新增 dtype 一致性校验与 docs/aclnnSum.md 的「需与 out 数据类型相同」契约一致,循环与既有 %lu 用法一致)
  • math/accumulate_nv2/op_graph/accumulate_nv2_graph_infer.cpp —— 见 finding 2、3
  • math/accumulate_nv2/op_graph/accumulate_nv2_graph_infer.h —— no issues(删除不再需要的声明/头文件,仅被同目录 .cpp 引用)
  • math/accumulate_nv2/op_host/accumulate_nv2_def.cpp —— no issues(opFile.value 由 accumulate_nv2_apt 改为 accumulate_nv2,与重命名后的 op_kernel/accumulate_nv2.cpp 及仓内其它算子的命名约定一致)
  • math/accumulate_nv2/op_host/accumulate_nv2_infershape.cpp —— 见 finding 1
  • math/accumulate_nv2/op_host/arch35/accumulate_nv2_tiling_arch35.cpp —— no issues(broadcast 收回后与算子本体同 shape 语义自洽,FillShapeInfo 命名与调用同步更新;空 tensor 提前返回路径未在本次改动)
  • math/accumulate_nv2/op_kernel/accumulate_nv2.cpp —— no issues(#ifndef UT_SOC_VERSION 守护与 UT 自建 wrapper 的构建方式相符)
  • math/accumulate_nv2/op_kernel/arch35/accumulate_nv2.h —— 见 finding 4(SIMT 分块(N≤9 顺序、r 优先 8 分块)覆盖区间完整、无重复/越界,逐条覆盖 N=10…40 均正确)
  • math/accumulate_nv2/op_kernel/arch35/accumulate_nv2_tiling_data.h —— no issues(删字段后结构体 28→32B,全仓无残留引用)
  • math/accumulate_nv2/tests/CMakeLists.txt —— no issues(仅头注释)
  • math/accumulate_nv2/tests/assets/golden.py —— no issues(__golden__/__spec__/tolerance 结构符合仓内 mul_no_nan、sign 等既有约定;fp16 kernel 直连=numpy 顺序 half、aclnnSum=fp32 promote 与实现一致)
  • math/accumulate_nv2/tests/ut/CMakeLists.txt —— no issues
  • math/accumulate_nv2/tests/ut/op_api/CMakeLists.txt —— no issues
  • math/accumulate_nv2/tests/ut/op_host/CMakeLists.txt —— no issues
  • math/accumulate_nv2/tests/ut/op_host/arch35/CMakeLists.txt —— no issues
  • math/accumulate_nv2/tests/ut/op_host/arch35/test_accumulate_nv2_tiling.cpp —— no issues(用例与「拒收 broadcast、同 shape 通过、N==输入数」的新语义一致)
  • math/accumulate_nv2/tests/ut/op_host/test_accumulate_nv2_infershape.cpp —— no issues(期望值与新 infershape 一致)
  • math/accumulate_nv2/tests/ut/op_kernel/CMakeLists.txt —— no issues
  • math/accumulate_nv2/tests/ut/op_kernel/test_accumulate_nv2.cpp —— no issues(3.0/2048.0 等期望值与 SIMT 顺序求和、fp16 half 累加新语义一致)
  • math/accumulate_nv2/tests/ut/op_graph/test_accumulate_nv2_graph_infer_pass.cpp(已删除)—— 覆盖缺口见 finding 3

总体风险判断

改动主体(broadcast 收回 + TF 同构 fp32 求和 + fp16 切 Vector 管线 + 三层 dtype/shape/N 校验 + golden 精度标准)在设计上自洽,算术语义与 TF accumulate_n… 竞品对齐,未发现 P0/P1 级构建或数据正确性问题。主要风险集中在形状校验对「未知维」的语义处理(动态 shape 图可能被误拒,finding 1/2,另有 tiling 与 infershape 对 rank-0 标量处理不一致但被 infershape 前置拦截,未单列)以及新增校验逻辑缺 UT 覆盖。建议合入前确认未知维(-1)的通配语义,并补齐 op_graph UT。

类型 数量
🔴 阻塞 0
🟡 建议 1

💬 仅评论


🧩 本次 Review 已使用自定义 Skill:

likedislike
Incorrect?
CANN-robotCANN-robotCollaborators
19 days ago Added label: cann-cla/no
CANN-robotCANN-robotCollaborators
19 days ago Added label: stat/needs-squash
99 messages are collapsed here。 See more
CANN-robotCANN-robotCollaborators
15 days ago Added label: lgtm
CANN-robot
CANN-robotCollaborators
15 days ago Comments:

The MR can not be merged, because of CodeReview discussion not resolved

If you want to solve this problem, you can click here to do it in the FAQs.

likedislike
NerdddddNerdddddCollaborators
15 days ago Resolved final issue
CANN-robotCANN-robotCollaborators
15 days ago Closed associated issue
CANN-robotCANN-robotCollaborators
15 days ago Merged pull request