| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
fix(geir-test): 修复 geir 测试日志级别与描述不一致(INFO→ERROR) Co-authored-by: sun-yibo1<sunyibo1@hisilicon.com> # message auto-generated for no-merge-commit merge: !9003 merge fix-geir-test-log-level-mismatch into master fix(geir-test): 修复 geir 测试日志级别与描述不一致(INFO→ERROR) Created-by: sun-yibo1 Commit-by: sun-yibo1 Merged-by: cann-robot Description: ## 描述 修复 14 个算子 geir 测试文件中日志级别与描述不一致的问题:3 类失败消息被误标记为 INFO,而同文件内其他失败消息均正确标记为 ERROR,构成内部不一致。本次将这 3 类失败消息的日志级别从 INFO 改为 ERROR。 ### 改动原因 geir 测试文件统一使用 printf("%s - LEVEL - [XIR]: message") 格式输出日志。在以下 3 类失败分支中,消息内容明确表示失败,但日志级别却写成 INFO,与同文件内其他失败消息(如 Generate input data failed、Create ir session using build options failed、Session add ir compute graph failed、Output verification FAILED,均标记为 ERROR)不一致,会误导日志排查: - Initialize ge using ge global options failed - Run graph failed - Finalize ir graph session failed ### 改动方法 仅将上述 3 类失败消息的日志级别标签 - INFO - 改为 - ERROR -,不修改任何测试逻辑、消息文本或参数。 ### 涉及文件(每个 3 处,共 42 处,14 文件 +42 -42) - activation/log_softmax_v2 - activation/confusion_softmax_grad - index/broadcast_gradient_args - norm/add_layer_norm_quant - norm/add_rms_norm_dynamic_quant_v2 - norm/batch_norm - norm/group_norm_v2 - norm/instance_norm - norm/layer_norm - norm/layer_norm_v3 - norm/sync_batch_norm_backward_elemt - norm/sync_batch_norm_backward_reduce - norm/sync_batch_norm_gather_stats - norm/sync_bn_training_update ## 关联的Issue - #4973 ## 测试 - 仅日志级别字符串修改,无逻辑变更,不影响测试编译与运行结果。 - 通过 git diff 逐项核对:仅 - INFO - → - ERROR -,消息文本与参数不变。 ## 文档更新 无。 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 - [x] AI辅助编写 See merge request: cann/ops-nn!9003 | 1 个月前 | |
TF plugin 迁移 Co-authored-by: sunchun<sunchun4@h-partners.com> # message auto-generated for no-merge-commit merge: !7632 merge nn4 into master TF plugin 迁移 Created-by: sunchun Commit-by: sunchun Merged-by: cann-robot Description: ## 描述 TF plugin 迁移 ## 关联的Issue https://gitcode.com/cann/ops-nn/issues/4196 ## 测试 <!--描述进行了哪些测试来验证你的改动。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [ ] AI辅助编写 See merge request: cann/ops-nn!7632 | 2 个月前 | |
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 | 2 个月前 | |
fix(instance_norm): 修复 ND 格式除零 UB 与 ReduceEmpty 小 N*C 对齐下溢 Co-authored-by: HelloWord-LuXin<luxin67@h-partners.com> # message auto-generated for no-merge-commit merge: !9740 merge fix-instancenorm-divzero-nd into master fix(instance_norm): 修复 ND 格式除零 UB 与 ReduceEmpty 小 N*C 对齐下溢 Created-by: HelloWord-LuXin Commit-by: HelloWord-LuXin Merged-by: cann-robot Description: 本 PR 包含 InstanceNorm(arch35)两个独立缺陷的修复。 ## 问题一:ND 格式 GetShapeAttrsInfo 除零 UB(issue #5010) ### 现象 ND 格式下 x 的第 0 维(N)或第 1 维(C)为 0 时,Host Tiling 进程整数除零(C++ 未定义行为),表现为 SIGFPE 宿主机崩溃而非干净报错。 ### 根因 ND 分支中 a1/a0 从 shape 维度赋值后,在零值校验之前就被用作除数: cpp a1 = xStorageShape.GetDim(DIM_0); a0 = xStorageShape.GetDim(DIM_1); r = xStorageShape.GetShapeSize() / a1 / a0; // 第138行:除法 ... if (a1 <= 0) return ge::GRAPH_FAILED; // 第144行:校验晚于除法 if (a0 <= 0) return ge::GRAPH_FAILED; // 第151行:校验晚于除法 上游的 CheckShapeAllNotNegative 仅检查 GetDim(i) < 0,不排除 0 值(有意放行 0 以支持空 tensor),因此 a1=0/a0=0 可到达除法。空 shape 专用处理器 InstanceNormReduceEmptyTiling 也无法拦截——其 IsCapable 在 GetShapeAttrsInfo 之后调用,UB 已发生。 其余格式分支(NCHW/NCDHW/NHWC/NDHWC)的 r 均由乘法计算,不受影响。 ### 修复 在 ND 分支的除法之前加入 a1 <= 0 || a0 <= 0 前置校验(OP_CHECK_IF),命中则记录原因并返回 GRAPH_FAILED。各格式分支共享的后置零值校验保持不变(它们对无除法的分支仍有效)。合法空 tensor(reduction 轴为 0、N>0、C>0)不受影响。 ## 问题二:ReduceEmpty tiling 对齐下溢(小 N*C 垃圾值) ### 现象 r=0(合法空 tensor)且 N\*C 小于 32B 对齐粒度(fp32 mean < 8,fp16/bf16 mean < 16)时,mean/variance 输出**垃圾值**而非 NaN。实测输出字节与 tiling data 内容完全一致(从未初始化的 UB 拷出),且输出非确定——同一用例时而 NaN 时而垃圾值,"碰巧对"比"稳定错"更具隐蔽性。典型触发:[1,7,0,0] fp32、[1,8,0,0] fp16 mean。 ### 根因链条 InstanceNormReduceEmptyTiling::DoOpTiling(头核,尾核对称): cpp perCorePerLoopElements = FloorAlign(min(perLoopMaxIndicesElements, perCoreElements), ubBlockSize / elemSize); // ① N*C < 粒度时下溢为 0 perCoreLoops = CeilDiv(perCoreElements, perCorePerLoopElements); // ② CeilDiv(x,0) 静默返回 x 1. FloorAlign(x, align) = x / align * align,当 x < align 时返回 0 2. CeilDiv(x, y) 定义 y == 0 时返回 x 而非报错,错误静默传播 3. kernel 侧(instance_norm_reduce_empty.h)以 perCorePerLoopElements=0 执行:InitBuffer(0 字节)、Duplicate(local, NaN, 0)(实际未写入)、末次 DataCopyPad 从 0 字节 local tensor 拷出 N\*C\*elemSize 字节 → 未初始化内存写入 mean/variance ### 修复 FloorAlign 结果下溢为 0 时回退为**单次全量拷贝**(DataCopyPad 本就支持字节级 blockLen,无需 32B 对齐),头核/尾核两处对称处理;对齐路径行为完全不变: cpp int64_t perCoreAligned = FloorAlign(min(perLoopMaxIndicesElements, perCoreElements), ubBlockSize / elemSize); // perCoreElements 小于对齐粒度时 FloorAlign 下溢为 0,回退为单次全量拷贝 perCorePerLoopElements = (perCoreAligned == 0) ? perCoreElements : perCoreAligned; 下溢分支健全性: - **下溢必为单核**:blockNum_ ≥ 2 ⟺ totalLength*elemSize > 32K ⟹ totalLength > 8192 ⟹ perCoreElements ≥ 4097 ≫ 对齐粒度(≤16),即 FloorAlign==0 仅在 blockNum_=1 时出现,头核/尾核两处对称兜底已完全覆盖 - **回退值必在 UB 内**:下溢时 min(perLoopMax, perCore) < align ≪ perLoopMax,故回退值 perCoreElements ≤ perLoopMax,InitBuffer 尺寸安全 ## UT 补充 test_instance_norm_tiling.cpp 此前对 reduce_empty 场景**零覆盖**(缺陷未被发现的原因),补充 6 例:fp32/fp16 mean × 下溢回退(N\*C=1/7/8)/ 对齐单拷贝(N\*C=8/16)/ 对齐多循环尾loop(N\*C=9),锁定 tiling 切分行为防回归。另有 ND N=0/C=0 两例锁定问题一的干净拒绝。 > 注:kernel UT(tikicpulib CPU 仿真)无法覆盖 ReduceEmpty 分支——仿真器不支持该路径 Duplicate 广播所需的 pset 谓词寄存器指令(dav_3510),故实机行为通过 TTK kernel 直调验证。 ## 验证 - **除零**:950PR 实机 TTK kernel 直调复现 SIGFPE 崩溃;替换修复库后变为干净报错("The N-dimension and C-dimension of input x must be positive numbers when the format of x is ND, where N is the 0th dim and C is the 1st dim"),恢复原库崩溃复现,因果闭环;5 种格式 N=0/C=0 全覆盖(唯 ND 崩溃,其余干净拒绝) - **下溢**:950PR 实机(TTK kernel 直调 + built-in libophost_nn.so 替换):小 N\*C 边界 6 例 6/6 PASS(mean/variance 全 NaN),大 shape reduce_empty(含多核 [433,90,0,...] blockNum=5、[221,90,150,0] blockNum=3)、各模板最小 shape(ar/ara 通路 10 例)、r=0 常规、正常对照均无回归 - **UT 红绿验证**:撤掉下溢修复后恰 3 个下溢用例失败、对齐用例不受影响;加修复后 26/26 全部通过 - **本地定向 CI**(ascend950 + ascend910b):pre-commit、pkg、ophost、opgraph 全部 PASS ## 关联 issue Fixes #5010 See merge request: cann/ops-nn!9740 | 14 天前 | |
将norm,quant目录下 MicroAPI 命名空间统一替换为 Reg Co-authored-by: m0_71149169<1907825139@qq.com> # message auto-generated for no-merge-commit merge: !9291 merge norm-quant-microapi-to-reg into master 将norm,quant目录下 MicroAPI 命名空间统一替换为 Reg Created-by: m0_71149169 Commit-by: m0_71149169 Merged-by: cann-robot Description: ## 描述 MicroAPI → Reg 命名空间迁移: norm,quant CANN 头文件 kernel_macros.h 中存在命名空间别名 namespace MicroAPI = Reg;,MicroAPI 只是 Reg 的别名。为统一命名规范,将 nn 仓所有算子 kernel 代码中的 MicroAPI 替换为 Reg,并通过对比替换前后 binary .o 文件 MD5 验证替换无影响。 覆盖范围 - nn 主仓目录:norm,quant ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> 关联Issue [#5098](https://gitcode.com/cann/ops-nn/issues/5098) ## 测试 验证方法 严格按四步流程,逐算子验证: 1. Step 1:编译原始代码,保存 baseline binary .o 文件 MD5 2. Step 2:执行 MicroAPI → Reg 替换 3. Step 3:编译替换后代码,保存 after binary .o 文件 MD5 4. Step 4:对比 A_before.md5 与 B_after.md5 平台:ascend950,编译参数:--soc=ascend950 --ops=<op> -j16 验证替换前后 binary 产物 MD5 完全一致。 ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: norm,quant目录下MicroAPI → Reg 命名空间迁移 See merge request: cann/ops-nn!9291 | 27 天前 | |
fix(instance_norm): 修复 ND 格式除零 UB 与 ReduceEmpty 小 N*C 对齐下溢 Co-authored-by: HelloWord-LuXin<luxin67@h-partners.com> # message auto-generated for no-merge-commit merge: !9740 merge fix-instancenorm-divzero-nd into master fix(instance_norm): 修复 ND 格式除零 UB 与 ReduceEmpty 小 N*C 对齐下溢 Created-by: HelloWord-LuXin Commit-by: HelloWord-LuXin Merged-by: cann-robot Description: 本 PR 包含 InstanceNorm(arch35)两个独立缺陷的修复。 ## 问题一:ND 格式 GetShapeAttrsInfo 除零 UB(issue #5010) ### 现象 ND 格式下 x 的第 0 维(N)或第 1 维(C)为 0 时,Host Tiling 进程整数除零(C++ 未定义行为),表现为 SIGFPE 宿主机崩溃而非干净报错。 ### 根因 ND 分支中 a1/a0 从 shape 维度赋值后,在零值校验之前就被用作除数: cpp a1 = xStorageShape.GetDim(DIM_0); a0 = xStorageShape.GetDim(DIM_1); r = xStorageShape.GetShapeSize() / a1 / a0; // 第138行:除法 ... if (a1 <= 0) return ge::GRAPH_FAILED; // 第144行:校验晚于除法 if (a0 <= 0) return ge::GRAPH_FAILED; // 第151行:校验晚于除法 上游的 CheckShapeAllNotNegative 仅检查 GetDim(i) < 0,不排除 0 值(有意放行 0 以支持空 tensor),因此 a1=0/a0=0 可到达除法。空 shape 专用处理器 InstanceNormReduceEmptyTiling 也无法拦截——其 IsCapable 在 GetShapeAttrsInfo 之后调用,UB 已发生。 其余格式分支(NCHW/NCDHW/NHWC/NDHWC)的 r 均由乘法计算,不受影响。 ### 修复 在 ND 分支的除法之前加入 a1 <= 0 || a0 <= 0 前置校验(OP_CHECK_IF),命中则记录原因并返回 GRAPH_FAILED。各格式分支共享的后置零值校验保持不变(它们对无除法的分支仍有效)。合法空 tensor(reduction 轴为 0、N>0、C>0)不受影响。 ## 问题二:ReduceEmpty tiling 对齐下溢(小 N*C 垃圾值) ### 现象 r=0(合法空 tensor)且 N\*C 小于 32B 对齐粒度(fp32 mean < 8,fp16/bf16 mean < 16)时,mean/variance 输出**垃圾值**而非 NaN。实测输出字节与 tiling data 内容完全一致(从未初始化的 UB 拷出),且输出非确定——同一用例时而 NaN 时而垃圾值,"碰巧对"比"稳定错"更具隐蔽性。典型触发:[1,7,0,0] fp32、[1,8,0,0] fp16 mean。 ### 根因链条 InstanceNormReduceEmptyTiling::DoOpTiling(头核,尾核对称): cpp perCorePerLoopElements = FloorAlign(min(perLoopMaxIndicesElements, perCoreElements), ubBlockSize / elemSize); // ① N*C < 粒度时下溢为 0 perCoreLoops = CeilDiv(perCoreElements, perCorePerLoopElements); // ② CeilDiv(x,0) 静默返回 x 1. FloorAlign(x, align) = x / align * align,当 x < align 时返回 0 2. CeilDiv(x, y) 定义 y == 0 时返回 x 而非报错,错误静默传播 3. kernel 侧(instance_norm_reduce_empty.h)以 perCorePerLoopElements=0 执行:InitBuffer(0 字节)、Duplicate(local, NaN, 0)(实际未写入)、末次 DataCopyPad 从 0 字节 local tensor 拷出 N\*C\*elemSize 字节 → 未初始化内存写入 mean/variance ### 修复 FloorAlign 结果下溢为 0 时回退为**单次全量拷贝**(DataCopyPad 本就支持字节级 blockLen,无需 32B 对齐),头核/尾核两处对称处理;对齐路径行为完全不变: cpp int64_t perCoreAligned = FloorAlign(min(perLoopMaxIndicesElements, perCoreElements), ubBlockSize / elemSize); // perCoreElements 小于对齐粒度时 FloorAlign 下溢为 0,回退为单次全量拷贝 perCorePerLoopElements = (perCoreAligned == 0) ? perCoreElements : perCoreAligned; 下溢分支健全性: - **下溢必为单核**:blockNum_ ≥ 2 ⟺ totalLength*elemSize > 32K ⟹ totalLength > 8192 ⟹ perCoreElements ≥ 4097 ≫ 对齐粒度(≤16),即 FloorAlign==0 仅在 blockNum_=1 时出现,头核/尾核两处对称兜底已完全覆盖 - **回退值必在 UB 内**:下溢时 min(perLoopMax, perCore) < align ≪ perLoopMax,故回退值 perCoreElements ≤ perLoopMax,InitBuffer 尺寸安全 ## UT 补充 test_instance_norm_tiling.cpp 此前对 reduce_empty 场景**零覆盖**(缺陷未被发现的原因),补充 6 例:fp32/fp16 mean × 下溢回退(N\*C=1/7/8)/ 对齐单拷贝(N\*C=8/16)/ 对齐多循环尾loop(N\*C=9),锁定 tiling 切分行为防回归。另有 ND N=0/C=0 两例锁定问题一的干净拒绝。 > 注:kernel UT(tikicpulib CPU 仿真)无法覆盖 ReduceEmpty 分支——仿真器不支持该路径 Duplicate 广播所需的 pset 谓词寄存器指令(dav_3510),故实机行为通过 TTK kernel 直调验证。 ## 验证 - **除零**:950PR 实机 TTK kernel 直调复现 SIGFPE 崩溃;替换修复库后变为干净报错("The N-dimension and C-dimension of input x must be positive numbers when the format of x is ND, where N is the 0th dim and C is the 1st dim"),恢复原库崩溃复现,因果闭环;5 种格式 N=0/C=0 全覆盖(唯 ND 崩溃,其余干净拒绝) - **下溢**:950PR 实机(TTK kernel 直调 + built-in libophost_nn.so 替换):小 N\*C 边界 6 例 6/6 PASS(mean/variance 全 NaN),大 shape reduce_empty(含多核 [433,90,0,...] blockNum=5、[221,90,150,0] blockNum=3)、各模板最小 shape(ar/ara 通路 10 例)、r=0 常规、正常对照均无回归 - **UT 红绿验证**:撤掉下溢修复后恰 3 个下溢用例失败、对齐用例不受影响;加修复后 26/26 全部通过 - **本地定向 CI**(ascend950 + ascend910b):pre-commit、pkg、ophost、opgraph 全部 PASS ## 关联 issue Fixes #5010 See merge request: cann/ops-nn!9740 | 14 天前 | |
添加InstanceNorm的实现 Co-authored-by: duchaune<duchuang7@huawei.com> # message auto-generated for no-merge-commit merge: !1496 merge dev_InstanceNorm into master 添加InstanceNorm的实现 Created-by: lazyduck008 Commit-by: duchaune Merged-by: cann-robot Description: ## 描述 InstanceNorm Ascend950开发,具体包括: 1、算子原型定义、信息库注册和infershape功能; 2、tiling策略和kernel实现,包括AR全载模板、AR welford模板、ARA全载模板和ARA welford模板; 3、针对Ascend 950平台的编译配置与二进制生成规则; 4、新增geir的examples,新增tiling ut、kernel ut和infershape ut; 5、新增READEME文档和op_list文档更新。 ## 关联的Issue 关联Issue [#1128](https://gitcode.com/cann/ops-nn/issues/1128) ## 测试 本地泛化精度和性能测试通过。 ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> 1、新增InstanceNorm的README.md文件; 2、更新docs/zh/op_list.md,在相应位置加上InstanceNorm算子描述。 ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-nn!1496 | 6 个月前 | |
docs目录基本概念md中文名改为英文名 Co-authored-by: chenjiao<chenjiao31@huawei.com> # message auto-generated for no-merge-commit merge: !7857 merge master into master docs目录基本概念md中文名改为英文名 Created-by: gitcode-chenjiao Commit-by: gitcode-chenjiao;chenjiao Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> docs目录基本概念md文件名改为英文: 避免link中的中文字符引发的跳转异常,例如两段式接口.md变成%E4%B8%A4%E6%AE%B5%E5%BC%8F%E6%8E%A5%E5%8F%A3.md,不易于维护,可能导致其他平台跳转有问题。 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> [#4260](https://gitcode.com/cann/ops-nn/issues/4260) ## 测试 <!--描述进行了哪些测试来验证你的改动。--> ok ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> docs/zh/context所有md和对应的link ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [x ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [ ] AI辅助编写 See merge request: cann/ops-nn!7857 | 2 个月前 |
InstanceNorm
产品支持情况
| 产品 | 是否支持 |
|---|---|
| Ascend 950PR/Ascend 950DT | √ |
| Atlas A3 训练系列产品/Atlas A3 推理系列产品 | × |
| Atlas A2 训练系列产品/Atlas A2 推理系列产品 | × |
| Atlas 200I/500 A2 推理产品 | × |
| Atlas 推理系列产品 | × |
| Atlas 训练系列产品 | × |
功能说明
-
算子功能:用于执行Instance Normalization(实例归一化)操作。与BatchNorm相比,InstanceNorm在每个样本的实例上进行归一化,而不是在整个批次上进行归一化,这使得该函数更适合处理图像等数据。
-
计算公式:
y=x−E(x)Var(x)+ε∗γ+βy = {{x-E(x)}\over\sqrt {Var(x) + ε}} * γ + β y=Var(x)+εx−E(x)∗γ+β
参数说明
| 参数名 | 输入/输出/属性 | 描述 | 数据类型 | 数据格式 |
|---|---|---|---|---|
| x | 输入 |
|
FLOAT32、FLOAT16、BFLOAT16 | NCHW/NHWC/NCDHW/NDHWC/ND |
| gamma | 输入 |
|
FLOAT32、FLOAT16、BFLOAT16 | ND |
| beta | 输入 |
|
FLOAT32、FLOAT16、BFLOAT16 | ND |
| data_format | 可选属性 |
|
STRING | - |
| epsilon | 可选属性 |
|
FLOAT32 | - |
| y | 输出 |
|
FLOAT32、FLOAT16、BFLOAT16 | NCHW/NHWC/NCDHW/NDHWC/ND |
| mean | 输出 |
|
FLOAT32、FLOAT16、BFLOAT16 | ND |
| variance | 输出 |
|
FLOAT32、FLOAT16、BFLOAT16 | ND |
约束说明
无
调用说明
| 调用方式 | 调用样例 | 说明 |
|---|---|---|
| 图模式调用 | test_geir_instance_norm | 通过算子IR构图方式调用InstanceNorm算子。 |