| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
format cpp Co-authored-by: yang-di52<yangdi52@huawei.com> # message auto-generated for no-merge-commit merge: !6784 merge issue_fix into master format cpp Created-by: yang-di52 Commit-by: yang-di52 Merged-by: cann-robot Description: ## 描述 批量刷新cpp代码格式 ## 关联的Issue [#3791](https://gitcode.com/cann/ops-nn/issues/3791) ## 测试 <!--描述进行了哪些测试来验证你的改动。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [x] 其他,请描述:代码格式化 ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [ ] AI辅助编写 See merge request: cann/ops-nn!6784 | 19 天前 | |
feat: 新增 Relu6Grad 算子(Ascend 950 / arch35) Co-authored-by: tangpingchuan<tangpingchuan@huawei.com> # message auto-generated for no-merge-commit merge: !5384 merge master into master feat: 新增 Relu6Grad 算子(Ascend 950 / arch35) Created-by: pingchuantang Commit-by: tangpingchuan Merged-by: cann-robot Description: ## 描述 新增 ReLU6 反向梯度算子 Relu6Grad,仅在 Ascend 950PR / Ascend 950DT(arch35)AI Core 上实现。该算子计算 ReLU6 的反向梯度:对前向输入 x 落在严格开区间 (0, 6) 的位置透传上游梯度 dy,落在区间外(含端点 x = 0 与 x = 6,以及 NaN / ±Inf)的位置输出 0;与 TensorFlow Relu6Grad 及 PyTorch hardtanh_backward(min=0, max=6) 在边界处取 0 的约定对齐。 ### 改动原因 当前 ops-nn 中尚无面向 Ascend 950 系列的 Relu6Grad 实现,需补齐 ReLU6 激活函数在新架构下的反向训练能力。 ### 改动方法 - **算子原型**(op_graph/relu6_grad_proto.h):REG_OP(Relu6Grad),二输入 gradients / features,一输出 backprops;DataType 支持 FLOAT16 / FLOAT / BFLOAT16,Format ND。 - **算子定义**(op_host/relu6_grad_def.cpp):通过 OpDef::AICore().AddConfig("ascend950", ...) 仅注册 ascend950 AICore 配置;启用 DynamicCompileStaticFlag / DynamicRankSupportFlag / DynamicShapeSupportFlag / PrecisionReduceFlag;ExtendCfgInfo("opFile.value", "relu6_grad_apt") 指定 kernel 入口文件。 - **InferShape**(op_host/relu6_grad_infershape.cpp):直接复用 Ops::Base::InferShape4Broadcast,输出 shape 为两输入的广播形状。 - **Tiling**(op_host/arch35/relu6_grad_tiling_arch35.{h,cpp}):按 dtype 分支调用 Ops::Base::BroadcastBaseTiling<OpDag>。 - **DAG**(op_kernel/arch35/relu6_grad_dag.h): - fp32 通路原生计算 mask = And(Compare(GT, x, 0), Compare(LT, x, 6)) → Select(mask, dy, 0),由硬件 vsel 实现,无分支; - fp16 / bf16 通路先 Cast(->fp32) 做 cmp/and/sel,末端 Cast(->T, CAST_MODE_RINT) 回退到原 dtype,与 DSL relu6_grad.py 在 fp16 vcmpsel 不可用时 fallback 到 fp32 的行为一致。 - **Kernel 入口**(op_kernel/relu6_grad_apt.cpp):KERNEL_TASK_TYPE_DEFAULT(KERNEL_TYPE_AIV_ONLY) + BroadcastSch<schMode, OpDag>。 ## 关联的Issue - 关联Issue #2953(https://gitcode.com/cann/ops-nn/issues/2953) ## 测试 - 新增 InferShape UT:tests/ut/op_host/test_relu6_grad_infershape.cpp,覆盖 fp32 / fp16 / bf16、动态 shape、广播形状推导。 - 新增 Tiling UT:tests/ut/op_host/arch35/test_relu6_grad_tiling.cpp,覆盖 ascend950 三种 dtype。 - 新增图模式示例:examples/test_geir_relu6_grad.cpp,覆盖 fp32 / fp16 / bf16 基础用例 + 边界 x = 0 / x = 6、x = NaN / ±Inf、广播等关键特殊值用例。 - 新增 golden 数据生成脚本:tests/assets/golden.py。 ## 文档更新 - 新增算子说明文档:activation/relu6_grad/README.md,含功能说明、计算公式、参数说明、约束、实现方案、调用样例索引。 ## 类型标签 - [x] 新特性 See merge request: cann/ops-nn!5384 | 1 个月前 | |
fix(relu6_grad): 修正 GE IR 示例位置/include 与 inf 比较,并补充 broadcast 看护用例 Co-authored-by: tangpingchuan<tangpingchuan@huawei.com> # message auto-generated for no-merge-commit merge: !5488 merge master into master fix(relu6_grad): 修正 GE IR 示例位置/include 与 inf 比较,并补充 broadcast 看护用例 Created-by: pingchuantang Commit-by: tangpingchuan Merged-by: cann-robot Description: ## 描述 本 PR 针对 activation/relu6_grad 算子,修复三处缺陷并补充 broadcast 场景的看护用例。 ### 改动原因 1. **GE IR graph 示例位置与 include 路径错误**:relu6_grad 算子仅在 arch35(Ascend 950 / dav-3510 / Atlas 350 加速卡)架构实现,但 GE IR 图模式示例 test_geir_relu6_grad.cpp 此前放在 examples/ 根目录,未按架构归类;且其内部 include 写作 ../op_graph/relu6_grad_proto.h,移动到子目录后相对路径会失效。 2. **示例中 inf 期望值比较逻辑错误**:MatchOne 校验函数对期望值统一用 std::abs(got - expect.expected) <= absTol 判定。当期望值为 ±inf 时,inf - inf 结果为 NaN,任何与 absTol 的比较都为 false,导致 inf 在带内(导数为 1)应原样输出的用例必然误判失败。 3. **broadcast 路径缺乏 UT 看护**:infershape 与 tiling 的单元测试仅覆盖少量 broadcast 形状,per-axis、single-axis、scalar、cross-rank、多维 mutual 等典型 broadcast 组合缺乏回归保护。 ### 改动方法 1. 将 examples/test_geir_relu6_grad.cpp 移动到 examples/arch35/test_geir_relu6_grad.cpp,并将 include 修正为 ../../op_graph/relu6_grad_proto.h。 2. 在 MatchOne 中新增 std::isinf(expect.expected) 分支:期望为 inf 时按 std::isinf(got) && std::signbit(got) == std::signbit(expect.expected) 判定(同号无穷即匹配),并新增 fp32_broadcast_dy_inf_inband 用例(dy=inf 落在导数为 1 的带内,期望输出 inf)。 3. 将 op_host/relu6_grad_infershape.cpp 中直接注册 Ops::Base::InferShape4Broadcast 改为包装函数 InferShape4Relu6Grad,新增 OP_LOGD 调试日志(引入 log/log.h),便于定位 infershape 调用链。 4. 移除 README.md 中"本算子目前仅在 Ascend 950 (dav-3510 / Atlas 350 加速卡) 架构上实现"一行说明。 5. 补充 broadcast 看护用例: - infershape UT 新增 7 例:per-axis、trailing/leading single-axis、scalar features、3D mutual、cross-rank 3D、4D mutual(覆盖 fp32 / fp16 / bf16)。 - arch35 tiling UT 新增 8 例:per-axis(fp16/bf16)、trailing/leading、scalar 双向、3D mutual、cross-rank 3D。 - GE IR 示例的 broadcast 用例由 3 例扩展至 16 例:mutual / single-axis / scalar 双向 / cross-rank / 含特殊值(inf 带内、负值、越界)/ fp16 / bf16。 ## 关联的Issue 关联Issue #3006 ## 测试 - activation/relu6_grad/tests/ut/op_host/test_relu6_grad_infershape.cpp:新增 7 个 broadcast 形状推导用例,断言输出 shape 与预期一致。 - activation/relu6_grad/tests/ut/op_host/arch35/test_relu6_grad_tiling.cpp:新增 8 个 broadcast tiling 用例,断言 tiling 返回 GRAPH_SUCCESS。 - activation/relu6_grad/examples/arch35/test_geir_relu6_grad.cpp:扩充 broadcast 端到端用例至 16 例,含 inf 带内输出校验。 ## 文档更新 更新了 activation/relu6_grad/README.md(移除关于仅 Ascend 950 架构实现的说明行)。 ## 类型标签 <!-- [x] 表示选中 --> - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-nn!5488 | 1 个月前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 19 天前 | ||
| 1 个月前 | ||
| 1 个月前 |