| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
add cases Co-authored-by: zhaogrug<zhaohai16@h-partners.com> # message auto-generated for no-merge-commit merge: !8026 merge the_rest_of_cases into master add cases Created-by: zhaogrug Commit-by: zhaogrug Merged-by: cann-robot Description: ## 描述 新增仓内新版ttk用例 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> ## 关联的Issue [#4386](https://gitcode.com/cann/ops-nn/issues/4386) <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> ## 测试 冒烟测试,本地验证 <!--描述进行了哪些测试来验证你的改动。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [x] 其他,请描述:用例添加 ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [ ] AI辅助编写 See merge request: cann/ops-nn!8026 | 1 个月前 | |
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 | 13 天前 | |
添加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 个月前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 1 个月前 | ||
| 13 天前 | ||
| 6 个月前 |