Merged
fix: harden SGD, Relu6Grad and NormalizeBBox #12376
raoliang_sacAdd on 22 days ago
fix: harden SGD, Relu6Grad and NormalizeBBox #12376
Merged
Pull Request has been successfully merged by CANN-robot.
(Thank you for raoliang_sac's contribution.)22 days ago Created pull request, commit c310d5c3
atomgit-bot
22 days ago Comments:
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 中间值,更新了模块文档说明。SGDGE 示例修正与校验:test_geir_sgd.cpp将op::Data的set_attr_index改为intputIndex - 1,为new分配补空指针判断与delete[],WriteDataToFile以二进制模式写入并返回真实成功/失败状态,新增Identity节点暴露accum/stat槽位并加入CheckOutputs数值校验,同时补齐失败分支的session释放与GEFinalize。NormalizeBBoxGE 示例更新: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:


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


Incorrect?
22 days ago Modify description of pull request
22 days ago Added label: cann-cla/yes
100 messages are collapsed here。 See more
TangPC
19 days ago Comments:
19 days ago Comments:
/lgtm
/approve


19 days ago Added label: lgtm
19 days ago Closed associated issue
19 days ago Merged pull request
CANN-robot
19 days ago Comments:
19 days ago Comments:
Pull Request 已合并或已关闭。
If you want to solve this problem, you can click here to do it in the FAQs.


描述
按算子拆分原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,将失败传播到程序返回值;移除不适用于当前交付的旧环境崩溃排障注释。NormalizeBBox:GE示例及接口说明
examples/arch35/test_geir_normalize_bbox.cpp:使用本仓op_graph/normalize_bbox_proto.h替代安装包中的通用Proto头文件,使示例构图依据与交付接口一致。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。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库。[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
测试
fcf476d309601677497a93823edbeff8c8e5dbfb分割;两个分支重组后的Git tree与完整binary diff和原提交完全一致。随后分别rebase到579aede0519a1c70364ec49c5c78591f6fb7eff4,各自patch不变、仅一个提交,pre-commit/OAT及diff检查通过。faf1320e92f8cdeb0ba113d11e2486bc7ef77064。本轮按评审意见追加仅修改三份README的提交8ec9d8176849b241dd6015419a8a9d1ec06f87e6,没有改动生产源码、示例、插件或UT;未重跑拆分后的完整CI,历史CI不能冒充当前SHA通过。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集成验证。文档更新
docs/zh/op_list.md的NormalizeBBox索引修正保留,未追加README编译运行段落。类型标签
AI/Agent生成声明