Closed
[Bug-Report|缺陷反馈]: July算子图推导、属性与GE示例质量加固 #6947
raoliang_sacAdd on  21 days agoClosed at  19 days ago
raoliang_sacCollaborators
21 days ago Create

2026-10-22当前交付范围:

复用本任务已有Issue,不重复建单。拆分后各自单提交,组合patch/tree与原提交一致;旧CI/设备结果保持原SHA归属。L2示例的集成构建问题已在PR #12515加入入口隔离修复,配置复现对照和独立示例编译链接通过;尚不声明线上CI通过。配套CANN集成验证仍待完成,不要求官方发布包。下文为拆分前历史记录。


2026-10-21统一交付: 原PR #12383的全部修改已归入https://gitcode.com/cann/ops-nn/pull/12376,统一提交`ee32add3c8cab98119bf26641a87b2e887686367`。当前包含Relu6Grad原生V1桥接删除,正式canndev配套包验证仍未完成,不能沿用历史兼容版本的普通环境通过结论。以下既有验证记录保留原受测提交归属。

Describe the current behavior / 问题描述

主仓master 04524e624e486bbcd2c55ac2419ca539b2dda1f7存在以下可从源码确认的问题:SGD InferShape的weight_decay < 0判断不能拒绝NaN;golden形参的默认0/False遮蔽attributes字典,CPU参考计算还可能与float32设备计算共享中间值溢出。SGD示例的多个Data索引相同,缺少完整结果校验和文件写入错误处理;NormalizeBBox示例也未完整校验FP16输出。相关文档、索引及测试资产注释存在与交付内容不一致的表述。

Environment Information / 环境信息

  • 硬件:Ascend950PR_9579。
  • CANN:9.3.0~weekly.20260923.01。
  • Python:3.12.9;TTK:92496503b70e2e05892d15dd5b78d1f80eae77df。
  • 前次修复验证提交:9627dffbfe0befe01b41efbe6fb446a0435c9496。

Steps to reproduce the issue / 重现步骤

  1. 检查optim/sgd/op_host/sgd_infershape.cpp:NaN与0比较时,< 0为false,不能阻断非法属性。
  2. 调用optim/sgd/tests/assets/golden.py的参考入口,通过attributes字典传入非零weight_decay/dampening或true的nesterov,与相同属性的显式关键字调用比较。
  3. 使用有限输入构造parameters * weight_decay超出float32范围的参考计算,检查CPU参考中间值。
  4. 运行交付GE示例,检查Data索引和输出校验;将输出二进制文件的目标路径预先建为目录,检查文件打开失败是否传播到程序返回值。

Describe the expected behavior / 预期结果

InferShape拒绝NaN属性;golden正确处理两种属性传参并保留显式零值优先级,使用独立的高精度CPU中间结果;示例核对shape、dtype和全部可观察输出,失败时返回非零并释放资源;文档与公开接口、交付内容一致。

修复后TTK GEIR正向11/11通过,4个原样GE示例变体通过,6组CPU参考契约检查通过,SGD写文件失败负向通过。动态GEIR实际日志:

[sgd_infershape.cpp:63][InferShapeForSgd] Parameter weight_decay of op1 has incorrect value nan. Reason: attr weight_decay must be more than or equal to 0.

Special notes / 备注

本次补扫追加修订提交:6b3313ff2f7f5b33b3a165b97326d3116d07984a。

Relu6Grad:静态图广播推导、编译信息回退、参考实现及GE示例

  • op_graph/relu6_grad_graph_infer.cpp:补齐GE静态图V1推导注册。修复前双向广播(2,1,5)与(1,3,1)的输出被内置推导覆盖为(2,1,5),在Tiling阶段失败;现在复用Ops::Base::BroadcastShape得到(2,3,5),同时更新输出origin shape及dtype。通过转换保留未知维、未知rank及标量语义,转换前校验runtime Shape容量;与原有动态图V2广播规则保持一致。
  • 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:纠正“不支持广播”和输出固定同gradients形状的错误,统一为NumPy广播及广播后的输出shape;允许features使用Relu6前向输入或输出;将第三方边界兼容限定为有限梯度,说明带外NaN/Inf梯度的Select语义;补充950产品rank上限与GE空Tensor语义,修复Markdown围栏。保留其他产品既有支持标记。

本次Relu6Grad补扫验证

  • 定向JIT包构建与部署、最终交付GE示例编译通过,构建并行度≤8。
  • TTK GEIR正向8/8:FP32、FP16、BF16、双向广播、标量、rank=8、空Tensor及Relu6Grad注册名入口。
  • TTK动态GEIR5/5:双向广播、rank=8、空Tensor、标量及未知rank广播。非法广播(2,3)与(4)经TTK到达GE推导后按预期拒绝。
  • TTK GEIR特殊值3/3:三种浮点dtype验证带外NaN/Inf梯度输出0、带内NaN/Inf透传、features的NaN/Inf及负零。通过本任务MyTestCase适配器调用仓内golden,对固定数学期望、返回dtype和Promote精度另作断言。
  • 最终GE示例26/26场景通过(原有24个及新增2个广播场景),逐场景独立进程执行并检查输出;错误场景名和多余参数两条负向调用均返回预期255。
  • 初次TTK在TensorFlow导入阶段SIGSEGV,改用PyTorch CPU参考后完成上述复验;两个空Tensor示例初次在Session销毁阶段超时,独立复跑后完成验证,原始失败日志保留。
  • 补扫阶段的4条构建调用命令逐条执行通过,包括CMake配置、并行度8的构建、列举场景和单场景运行;产物与完成全部场景验证的二进制哈希一致。pre-commit、OAT及文档结构/链接/渲染检查通过。
  • Host UT文件只做编译信息类型适配,未单独执行;无平台对象的回退分支经过类型布局与源码核对,未声明获得Host UT运行覆盖。未运行全量本地CI、性能测试或其他产品验证。

新增Host UT源码未单独执行;NaN路径通过TTK动态GEIR验证。INTrainingReduceV2改动仅为失效注释和测试资产位置说明,保留其他产品原有支持信息。

任务分支:fix/july-five-ops-hardening-20261020。

关联 PR:https://gitcode.com/cann/ops-nn/merge_requests/12376

接手推导注册任务后的补充(2026-10-20)

L2Normalize:V2推导、图声明校验及示例输出检查

  • 删除原生V1 InferShape注册;保留VERIFY_FUNC_REG,在推导覆盖前校验用户原始输出shape、已知dtype、输入rank及ND格式。Verify属于图校验,不能随V1 shape注册一起删除。
  • V2 shape推导增加空context和输入/输出描述检查、ND格式校验,允许空或前次推导残留的输出缓冲被正确覆盖,保留动态维、未知rank及空Tensor处理;V2 dtype返回写入状态。
  • 新增/调整Graph与Host UT及回归CSV;本次没有重跑Host/Graph UT,设备测试范围单列如下。
  • examples/test_geir_l2_normalize.cpp:检查唯一输出的shape、dtype、256字节缓冲及全部64个数值;全1输入每行16个元素,期望输出为0.25,拒绝非有限值和误差超过1e-6的结果。
  • 增加独立示例CMake配置,构建和运行均已实际验证。README沿用原有调用表及示例链接。

接手合并后验证(当前普通CANN环境)

  • 接手阶段NPU受测提交:0415d02e8b887baee227edd7e6c88211f97e58fb;TTK使用July本地提交92496503b70e2e05892d15dd5b78d1f80eae77df,当前算子仓golden,导入并校验哈希的冻结输入;--pc=1,Promote/stat_rel_err。构建并行度≤8。
  • 本仓21条用例、静态/动态42次执行通过:INTrainingReduceV2 6、L2Normalize 7、Relu6Grad 6、NormalizeBBox 2。L2Normalize的2条空Tensor仅计执行与shape覆盖。
  • 3条真实GE拒绝验证:Relu6Grad混合dtype、L2Normalize原始声明shape不一致、L2Normalize标量输入;均须到达GE并拒绝,测试端比较失败不计通过。混合dtype在当前包的存量Verify阶段拒绝,不计作新V2 dtype分支的本次执行覆盖;L2两条进入本次原生Verify。
  • 29个交付示例运行通过:Relu6Grad全部26个独立场景、NormalizeBBox FP32/FP16各1个、补强后的L2Normalize示例1个;均核对输出。L2Normalize的配置、构建和运行命令实际执行,完整步骤留存于任务验证记录。
  • 普通环境未设置LD_PRELOAD或注册屏蔽。定向包构建部署、pre-commit/OAT、文档及链接渲染检查通过。本阶段未跑全量本地CI、性能测试或其他产品上板。
  • 接手的完整去V1候选另有21条/42次诊断执行通过;它需要注册屏蔽,且去掉Relu6Grad兼容入口后,当前普通CANN的合法交叉广播实际失败。因此完整候选不作为本PR普通环境通过的依据;正式canndev包仍因缺少alog/opensdk内部依赖而无法构建。
  • 对方的217条NN Host/Graph UT及其其他设备记录属于原提交3b973bc51a95e6d36b964656a28536b74957e079的继承证据,没有冒充本次重跑。INTrainingReduceV2的另一设备基线/修改版均存在芯片不支持的Tiling阻塞,未关闭。

本Issue对应PR:https://gitcode.com/cann/ops-nn/pull/12376。完整去除Relu6Grad兼容入口单列PR #12383,正式canndev隔离包未完成集成验证。RaggedBinCount不在本次接手范围。

README精简(2026-10-21)

Relu6Grad、L2Normalize README删除多余的编译运行段落及场景选择说明,保留原有调用表、示例和算子IR链接。示例源码、CMake配置及算子实现未变。

2026-10-21文档精简提交168b69ee8dda61a6a5d292ec69b1d1e6154d5e82:完成本次范围的README检查、链接/调用表渲染、diff及提交钩子检查;确认相对上一提交仅README变化,未重跑NPU、TTK或构建。此前设备验证仍归属原受测提交。

正式包验证继续跟进:https://gitcode.com/cann/ops-nn/issues/6956。

likedislike
Rraoliang_sacCollaborators
21 days ago Added label: bug-report
yuning_chenyuning_chenCollaborators
21 days ago Assign raoliang_sac as responsible person
Rraoliang_sacCollaborators
21 days ago Change title to "[Bug-Report|缺陷反馈]: SGD校验、Relu6Grad广播推导与GE示例质量问题", originally titled "[Bug-Report|缺陷反馈]: SGD属性校验与参考实现及GE示例质量问题".
Rraoliang_sacCollaborators
21 days ago Modify description of issue
Rraoliang_sacCollaborators
21 days ago Change title to "[Bug-Report|缺陷反馈]: July算子图推导、属性与GE示例质量加固", originally titled "[Bug-Report|缺陷反馈]: SGD校验、Relu6Grad广播推导与GE示例质量问题".
Rraoliang_sacCollaborators
21 days ago Modify description of issue
Rraoliang_sacCollaborators
21 days ago Modify description of issue
Rraoliang_sacCollaborators
21 days ago Modify description of issue
Rraoliang_sacCollaborators
20 days ago Modify description of issue
Rraoliang_sacCollaborators
20 days ago Modify description of issue
CANN-robotCANN-robotCollaborators
19 days ago Close issue
CANN-robotCANN-robotCollaborators
18 days ago Added label: resolved