Merged
fix: harden SGD, Relu6Grad and NormalizeBBox #12376
fix: harden SGD, Relu6Grad and NormalizeBBox #12376
Merged
raoliang_sacAdd on 22 days ago
raoliang_sacCollaborators
22 days ago

描述

按算子拆分原PR #12376:本PR仅保留SGD、Relu6Grad、NormalizeBBox,共24个变更文件。L2Normalize、INTrainingReduceV2的18个文件独立交付于https://gitcode.com/cann/ops-nn/pull/12515,两个分支都直接基于主仓master,不互相依赖提交。

SGD:属性校验、golden及GE示例

  • op_host/sgd_infershape.cpp:将weight_decay < 0改为!(weight_decay >= 0),使NaN与负值一样被拒绝;保留-0.0及非负值的原有接受行为,与独立Tiling入口的属性检查保持一致。
  • tests/ut/op_host/test_sgd_infershape.cpp:新增NaN拒绝、负无穷拒绝、非负边界接受三组Host UT,非负边界包含-0.0、0.5和正无穷。实际执行情况见“测试”。
  • tests/assets/golden.py:将CPU计算、legacy入口、Kernel/GEIR封装、TestSpec及独立组合参考中的dampening、weight_decay、nesterov默认实参改为None,使未显式传入的属性能够回退到attributes字典;显式传入的0、False仍优先于字典值。CPU参考中间计算统一使用float64,避免parameters * weight_decay或accum * momentum与设备float32计算共享溢出;输出仍按TTK请求的数据类型转换,独立组合参考保留设备float32运算顺序,未回写的accum/stat仍保留原始位模式。删除不再使用的精度提升辅助函数,并修正参考实现及未交付接口的说明。
  • examples/test_geir_sgd.cpp输入与资源处理:六个Data节点的index按输入顺序设置为0~5;检查临时输入缓冲区分配结果并在Tensor构造后释放;检查AddGraph返回值;补齐构图、Session创建、结果检查和文件写入失败时的清理。
  • examples/test_geir_sgd.cpp结果与文件校验:增加带SGD控制依赖的两个Identity节点,观察accum/stat原地更新后的结果;同时检查权重、accum、stat三个可观察输出的数量、shape、dtype、字节数、数据指针及全部数值,覆盖默认动量和零动量示例。文件改为二进制写入,检查fopen、fwrite和fclose,将失败传播到程序返回值;移除不适用于当前交付的旧环境崩溃排障注释。
  • README、Proto及实现注释:调整参数表中的输出/属性顺序;补充中间精度、舍入及零动量特殊值语义;修正OpDef中不准确的注册先例说明,清理内部审批、私有材料引用,改用当前README和实现路径说明支持范围及校验职责。具体内容见“文档更新”。

NormalizeBBox:GE示例及接口说明

  • examples/arch35/test_geir_normalize_bbox.cpp:使用本仓op_graph/normalize_bbox_proto.h替代安装包中的通用Proto头文件,使示例构图依据与交付接口一致。
  • 示例由打印结果改为实际判定成功条件:要求恰有一个输出,检查shape、dtype、字节数及非空数据指针;对FP32和FP16的全部8个坐标计算期望值并按对应容差比较,FP16先解码为浮点数,拒绝非有限值及错误结果。
  • 补齐输入生成失败、Session创建失败和结果校验失败时的资源清理,并返回失败。
  • README调整输出与属性顺序,删除将内部TensorFlow插件源码列成用户调用入口的说明及对应的图导入承诺,保留真实GE图模式、算子IR和示例入口;插件、内部UT及reversed_box默认值均保留。docs/zh/op_list.md将ACLNN支持标记从“✓”改为“✗”,并纠正“归一化结果必在[0,1]”的描述。

Relu6Grad:完整V2推导迁移、编译信息回退、参考实现及GE示例

  • op_graph/relu6_grad_graph_infer.cpp:删除原生V1兼容广播InferShape实现及COMMON_INFER_FUNC_REG,包括仅供该实现使用的shape转换辅助函数和头文件;shape推导由已有V2广播入口承担。配套canndev需隔离相应旧注册,避免旧入口覆盖合法广播shape。
  • dtype推导从op_host/relu6_grad_infershape.cpp移至op_graph,检查空context、两个输入dtype一致性,并返回输出dtype写入状态;对应dtype UT移动至Graph测试目录。保留既有V2广播shape推导、编译信息修复、golden及示例增强。配套CANN验证仍由Issue #6956跟进。
  • op_host/arch35/relu6_grad_tiling_arch35.cpp:将TilingParse<ElewiseCompileInfo>改为TilingParse<Ops::Base::BroadcastCompileInfo>。原16字节结构与广播框架读取的24字节结构布局不同,平台对象为空时可能误读coreNum并越界读取ubSize;原TilingPrepare还直接返回成功而不初始化字段。现在校验编译信息和平台指针,写入真实AIV核数与UB容量,使解析和回退读取使用同一类型。
  • op_host/arch35/relu6_grad_tiling_arch35.h:修正构造函数格式和多余分号;现有Host UT同步改用BroadcastCompileInfo。Host UT的实际执行范围见下文。
  • tests/assets/golden.py:Kernel/GEIR的CPU参考改用PyTorch严格比较和where选择,浮点中间值使用float64,按原dtype回传,Promote模式保留float64;支持NumPy的BF16输入。修复本地TTK加载TensorFlow时在生成golden阶段崩溃的问题。TestSpec及legacy golden同时注册relu6_grad和Relu6Grad,兼容两种CSV命名。TensorFlow E2E仍使用框架原生CPU参考及原有乘掩码三方参考,没有将这一路径改为Kernel的Select语义。
  • examples/arch35/test_geir_relu6_grad.cpp:输入数组使用unique_ptr管理并检查分配与SetData返回值;第二Data索引改为1,补齐两个Data的输出描述;Session使用nothrow分配。结果必须恰有一个输出,核对完整shape、dtype、字节数、数据指针及全部数值,空输出列表不能再误报成功。保留原有24个场景,并加入双向广播和rank=8广播两个回归场景;增加--list及按场景名执行入口,支持逐场景独立进程验证。
  • examples/arch35/CMakeLists.txt:补充与当前CANN目录布局相符的独立GE示例构建配置,通过ASCEND_HOME_PATH定位头文件和四个GE库。
  • README与Proto:纠正Ascend 950PR&950DT系列产品“不支持广播”和输出固定同gradients形状的错误,按产品区分广播:Ascend 950PR&950DT系列产品支持双向广播,Atlas A3系列产品与Atlas A2系列产品保留等形或features为[1]的存量约束;允许features使用Relu6前向输入或输出;将第三方边界兼容限定为有限梯度,说明带外NaN/Inf梯度的Select语义;补充950产品rank上限与GE空Tensor语义,修复Markdown围栏。保留其他产品既有支持标记。

未修改计算Kernel算法。Relu6Grad的完整V2迁移依赖配套canndev PR https://gitcode.com/cann/canndev/pull/82602;现有未包含隔离改动的CANN曾出现合法交叉广播失败,需要在包含配套改动的CANN中完成回归,不以官方发布包为前提。

关联的Issue

https://gitcode.com/cann/ops-nn/issues/6947

注册迁移及配套CANN验证:https://gitcode.com/cann/ops-nn/issues/6956

测试

  • 2026-10-22拆分:基于原提交fcf476d309601677497a93823edbeff8c8e5dbfb分割;两个分支重组后的Git tree与完整binary diff和原提交完全一致。随后分别rebase到579aede0519a1c70364ec49c5c78591f6fb7eff4,各自patch不变、仅一个提交,pre-commit/OAT及diff检查通过。
  • 拆分提交为faf1320e92f8cdeb0ba113d11e2486bc7ef77064。本轮按评审意见追加仅修改三份README的提交8ec9d8176849b241dd6015419a8a9d1ec06f87e6,没有改动生产源码、示例、插件或UT;未重跑拆分后的完整CI,历史CI不能冒充当前SHA通过。
  • 本轮文档验证:pre-commit及OAT通过;6个本地链接有效;HTML渲染及列表/表格结构检查通过;三份README的产品支持表保持不变,参数表仅修正Relu6Grad的章节指向,各产品原有dtype、format、动态shape/rank、广播及空Tensor限制保留。公式与代码块未变化。
  • 只涉及文档组织和不当调用说明的纠正,未重跑编译、算子UT、TTK或NPU;本轮文档检查不计为线上CI通过。
  • 历史完整提交fcf476d30曾串行通过950/A2本地CI:950 Host179/Graph21、A2 Host46/Graph21;统计包含已经移出的两个算子,不计作本PR独立覆盖。各平台API入口0用例,kernel target仅构建。
  • 历史普通兼容版本0415d02e中Relu6Grad 26个示例场景、NormalizeBBox FP32/FP16示例实际运行并核对输出。完整去V1候选的LD_PRELOAD诊断通过不能代替配套CANN集成验证。
  • L2Normalize示例CMake已随算子移至PR #12515。排查确认独立示例被自动带入Host;入口隔离修复及配置/独立编译链接回归在#12515完成,本PR不包含该文件。不能把拆分本身或旧CI结果计作新提交构建通过。

文档更新

  • 按2026-10-22更新的《文档修改与示例验证指引》及评审意见,将SGD、Relu6Grad、NormalizeBBox的产品差异迁入已有“约束说明”,按完整产品名称分组使用无序列表,移除独立差异章节及差异表。保留产品支持情况表和公共参数表,不增加README产品筛选标签。
  • Relu6Grad参数说明中的“见产品差异说明”改为“见约束说明”,避免残留无效章节指向。
  • NormalizeBBox删除内部TensorFlow插件调用行及前文相应承诺,保留GE图模式的IR和示例链接。内部插件及其已有UT继续保留,不将其当成用户调用API。
  • 其余已交付的接口/实现注释和docs/zh/op_list.md的NormalizeBBox索引修正保留,未追加README编译运行段落。
  • 本轮仅更新本PR的三个README及PR说明,不更新其他PR、Issue或CI技能。

类型标签

AI/Agent生成声明

likedislike
Pull Request has been successfully merged by CANN-robot.
(Thank you for raoliang_sac's contribution.)
Rraoliang_sacCollaborators
22 days ago Created pull request, commit c310d5c3
atomgit-bot
atomgit-bot
22 days ago Comments:

变更摘要

本次变更主要围绕 SGD 算子的校验加固、GE 示例与 golden 参考实现,以及相关文档/注释的一致性修正。核心是把 InferShapeForSgd 中 weight_decay 的校验由 weightDecayVal < 0.0f 改为 !(weightDecayVal >= 0.0f),从而拒绝 NaN,并补充相应 UT;同时让 golden.py 的属性默认值改为 None,使显式属性优先于 attributes 字典、缺省时回退到字典,并把 CPU 参考中间运算改用 float64,避免与设备的 float32 溢出耦合,而独立第三方组合仍保留 float32 运算顺序。SGD 与 NormalizeBBox 的 GE 示例补齐资源释放、写文件错误传播、输出校验与 Proto 引用。

主要改动

  • SGD 的 weight_decay 校验加固: sgd_infershape.cpp 中 InferShapeForSgd 将 weightDecayVal < 0.0f 改为 !(weightDecayVal >= 0.0f),使 NaN 也被拒绝,并在 test_sgd_infershape.cpp 新增 NaN、负无穷拒绝以及 -0.0f/正数/正无穷通过的用例。
  • golden.py 参考语义调整: _compute、sgd_golden、_kernel_golden、_SgdCompose、SgdKernelSpec 的 dampening/weight_decay/nesterov 默认值由 0.0/False 改为 None,显式属性优先、缺省回退字典;移除 _f32_floor 并统一用 torch.float64 计算 CPU 中间值,更新了模块文档说明。
  • SGD GE 示例修正与校验: test_geir_sgd.cpp 将 op::Data 的 set_attr_index 改为 intputIndex - 1,为 new 分配补空指针判断与 delete[],WriteDataToFile 以二进制模式写入并返回真实成功/失败状态,新增 Identity 节点暴露 accum/stat 槽位并加入 CheckOutputs 数值校验,同时补齐失败分支的 session 释放与 GEFinalize。
  • NormalizeBBox GE 示例更新: test_geir_normalize_bbox.cpp 改为引用本仓 normalize_bbox_proto.h,补充 GEFinalize 清理,并对 DT_FLOAT/DT_FLOAT16 输出做 dtype、shape、数据与数值(含 FP16 手动解码与容差)校验。
  • 属性语义说明与注释清理: sgd_proto.h 补充 momentum=0 时 0 * inf 仍可能传播 NaN 至 parameters,以及 Ascend 950PR&950DT 上中间运算为 float32、FP16/BF16 使用就近偶数舍入;sgd_tiling.cpp、sgd_def.cpp、sgd_infershape.cpp 与 in_training_reduce_v2 多个文件同步修正了过时/失效注释与文档描述。

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

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

代码审查

✅ 未发现问题


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

likedislike
Incorrect?
Rraoliang_sacCollaborators
22 days ago Modify description of pull request
CANN-robotCANN-robotCollaborators
22 days ago Added label: cann-cla/yes
100 messages are collapsed here。 See more
TangPC
TangPCCollaborators
19 days ago Comments:

/lgtm
/approve

likedislike
CANN-robotCANN-robotCollaborators
19 days ago Added label: lgtm
CANN-robotCANN-robotCollaborators
19 days ago Closed associated issue
CANN-robotCANN-robotCollaborators
19 days ago Merged pull request
CANN-robot
CANN-robotCollaborators
19 days ago Comments:

Pull Request 已合并或已关闭。

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

likedislike