| Files | Last commit | Last update |
|---|---|---|
master翻译合入 Co-authored-by: caiwenwen<caiwenwen6@h-partners.com> # message auto-generated for no-merge-commit merge: !6751 merge master into master master翻译合入 Created-by: caiwenwen Commit-by: caiwenwen Merged-by: cann-robot Description: ## 描述 合入math仓翻译的内容 ## 关联的Issue https://gitcode.com/cann/ops-math/issues/4170 ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 docs/context,aclnn等商发文档 ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-math!6751 | 13 days ago | |
[reduce_std_with_mean] 算子质量加固修复 + TTK golden 资产 Co-authored-by: JasonZhang88<jason.zhangshen@huawei.com> # message auto-generated for no-merge-commit merge: !6691 merge reduceStdMin into master [reduce_std_with_mean] 算子质量加固修复 + TTK golden 资产 Created-by: JasonZhang88 Commit-by: JasonZhang88 Merged-by: cann-robot Description: ## 描述 依据 ReduceStdWithMean 算子六轮全量验证(静态检查 + ST 用例生成/评审/自验证 + 上板 TTK 675 条 kernel + 83 条 GEIR)发现的 20 项问题进行整改:算子侧修复 11 项(含 FR-15 注册后的 golden 契约补全),测试用例侧修复 4 项(FR-09/11/12/14,验证工作区完成并上板复验),其余为非缺陷定性、CANN 编译器缺陷(已实证归因并本地规避)及资料归口项。 本 PR 仅涉及 math/reduce_std_with_mean/ 目录(11 文件,+500/-11,19 个提交),不影响其他算子。 ## 变更概述 ### 1. P1 关键修复:group 模板 workspace 缺失(FR-02,连带修复 FR-03) **现象**:上板 675 条用例中 384 条(tiling key∈{1,5},group 模板)全部 VEC_ERROR(设备侧 trap,errcode 286 / subErrType 0x4),无任何输出;GEIR 通路 83 条中 43 条失败。 **定位**:17 种源码变体二分 + 关键实验(E21–E24)确认崩点为 Phase 2 从 wsGm_ 读 GM;workspace 指针改绑输入张量 x 即全部 PASS——ws[0]=usrSize 下 runtime 传递的 workspace 指针不可访问。**归因为经验性约定**(经评审降级):runtime GetUserWorkspace 语义为 base+RESERVED_WORKSPACE(=16MB),系统空间未预留时裸指针不可访问;adv_api RA ReduceSum 本身不读写 GM workspace;同仓 reduce_var / reduce_std_v2_update 同此约定(ws 含系统空间 + kernel 裸指针、不做偏移),kernel.h Phase 2 沿用裸指针、未调 SetSysWorkspace。 **修复**(op_host/arch35/reduce_std_with_mean_tiling_arch35.cpp):仅 group 模板在 usrSize 基础上追加 GetLibApiWorkSpaceSize() 系统空间(上述经验性约定);normal/empty 模板为纯 Vector kernel,保持 ws[0]=0 设计契约不变,不引入 16MB 无谓分配。 **效果**:kernel VEC_ERROR 384 → 0(FR-02 提交当轮全量 PASS 407/675,其余为 FR-10 编译失败与 NaN/Inf 数值类,与本修复无关);GEIR 43 失败 → 83/83 全 PASS 为后续轮次(P1 批量修复 + stat_rel_err 基线)结论。 ### 2. P1 数值与容量安全(FR-04/05/06/07/08) | 修复 | 文件 | 说明 | |---|---|---| | FR-04 空闲核写 0 | op_kernel/arch35/reduce_std_with_mean_kernel.h | rGroupCnt > rOuter 时空闲核直接 return,Phase 2 的 ReduceSum 会累加未初始化 GM 数据;改为清零 cacheBuf 后照常写出本行 0 | | FR-05 补位后 UB 超预算 | op_host/arch35/..._tiling_arch35.cpp | 预算按有效 R 反解,但 kernel 按 CeilAlign padded R 分配 UB;补预算校验,超出时 rUbFactor(Align) 同步降至 block 对齐上限内。评审收口:maxPadded < bsAElem 时原守卫会跳过限缩(tail-R 全载且尺寸 < bsAElem 时补齐必然超预算),补显式 tiling 结构化错误——当前平台该路径经推导不可达(aUnit 受 atmp ≤ cacheLine/dtypeSize 约束,rIMax ≥ bsAElem 恒成立),属受限 UB 环境防御性收口,UT 以 faker 小 UB 触发边界覆盖(拒绝 + 邻近放行对照) | | FR-06 cacheBuf 容量越界 | op_host/arch35/..._tiling_arch35.cpp | group 归约树 cacheCount × levelStride 可超 16KB cacheBuf;补容量校验,超出时回退 normal 模板(回退分支 usedCoreNum 补 std::max(...,1) 兜底与正常路径对齐) | | FR-07 空指针解引用 | op_api/aclnn_batch_norm_stats.cpp | l0op::Pow/FillVector 返回 nullptr 时 ViewCopy 先解引用;补 CHECK_RET(≠nullptr) 以 ACLNN_ERR_INNER_NULLPTR 上抛 | | FR-08 InferShape 校验缺失 | op_host/reduce_std_with_mean_infershape.cpp + op_graph/..._graph_infer.cpp | 补 4 项:mean shape 与 x 一致(unknown rank 跳过)、rank=0 时 dim ∈ {[], [0], [-1]}、correction 非负、x 与 mean dtype 一致 | ### 3. P1 资料修复(FR-01) 调用表补齐 aclnnStd 行、GE图模式链接改指 op_graph/reduce_std_with_mean_proto.h。 ### 4. P2 修复(FR-15/16/17/18) | 修复 | 文件 | 说明 | |---|---|---| | FR-15 golden 未注册 aclnn 通路 | tests/assets/golden.py | 显式注册 aclnnStdMeanCorrection(经 L0 调用本算子);补全注册后的插件契约:customize_inputs/golden 签名对齐 TTK aclnn 参数计划(self, dim, correction, keepdim, stdOut, meanOut);tolerance 保持声明 cross_check,本环境 GPU 三方参考不可达经运行参数 --compare stat_rel_err 规避(kernel/aclnn 两模式均支持,与全量验证既定方式一致) | | FR-16 golden 精度不足 | tests/assets/golden.py | FP16/BF16→FP32 计算,FP32→FP64(消除大 N 累加精度损失);类 docstring 陈旧"全程 FP32"表述已同步修正 | | FR-17 约束说明缺失 | README.md | 补 epsilon 非负、unbiased/correction 折算优先级、N≤corr 输出语义(+Inf 或 NaN:一般输入 +Inf、全等输入 0×Inf=NaN,与 tiling/golden/torch 实测一致)、空张量输出 NaN、动态标记 -1/-2 语义 | | FR-18 样例缺陷 | examples/(3 文件) | RunGraph 失败误返回 SUCCESS → 改 FAILED;aclDestroyIntArray(dim) 未配对释放补齐 | ### 5. Golden 测试资产 新增 tests/assets/golden.py(321 行): - 注册 Kernel/GEIR 双通路参考实现 + aclnnStdMeanCorrection aclnn 通路 - 参考计算全部由 torch 承担(FP16/BF16→FP32,FP32→FP64 升精度),NumPy 仅做数据桥接 - 延迟导入 torch(_ensure_torch()),纯 TF NPU 环境可加载注册 - 覆盖 dim/unbiased/keepdim/invert/epsilon/correction 全属性与特殊值(NaN/Inf/空张量)用例 ## 关联 Issue https://gitcode.com/cann/ops-math/issues/3992 ## 测试 ### 最终结论(2026-10-27 全量复验,HEAD d073d90bc,NPU 4 / Ascend950PR,--compare stat_rel_err) **本算子实际执行面(kernel L0 直连 + GE 图模式,共 781 例):780/781 有效通过(99.9%),算子真实缺陷 0。** | 套件 | 数量 | 结果 | |---|---|---| | kernel L0+L1(L0 直连,全量基线集) | 675 | **674/675 有效 PASS** | | kernel L0_default_100(属性默认值等价用例) | 1 | PASS | | kernel L2 负例(tiling/InferShape 结构化拒绝) | 22 | **22/22 按预期拒绝** | | GEIR(GE 图模式) | 83 | **83/83 PASS** | ### 明细与归因 - **kernel 675 条**:VEC_ERROR 384 → **0**;NaN/Inf mismatch = **0**。其中 672 直接 PASS;L1_449/L1_450 为 TTK profiling 瞬时失败(复跑 PASS,同 L1_541 先例);原 232 条 Cst/DYN 在线编译失败(0 维输出触发 CANN 编译器缺陷 TypeError: reduce() of empty iterable,与 [asc-devkit#6931](https://gitcode.com/cann/asc-devkit/pulls/6931) 同源)按其修法本地补丁后重跑 **232/232 全 PASS**——失败 100% 归因编译器缺陷,算子侧无需改动;本地 CANN 保留该补丁。唯一非 PASS:**L1_264**(N=2.4e7, fp16, mere=0.3% 超阈值)——fp32 累加舍入随 N 增长的精度极限,非算子缺陷 - **kernel L2 负例**:22/22 按预期拒绝,含改造后的 rank=0 dim 越界用例(tiling 结构化拒绝 EZ0026);停用的 constraint_020 详见验证工作区记录 - **aclnn 适配层**(注:A5/regbase 上 aclnn 适配层调用平台 ReduceStdV2,数值段不走本算子,仅计本算子资产结果):CheckParams 负例 **21/25 结构化拒绝**(本算子 op_api 代码,错误码与声明一致)+ 4 条平台行为观察;golden 契约 591/591 生成正常;数值比较段 45 例 FAIL 均为平台路径精度/语义 + 测试设计已知分类(N≤corr 交叉实证:kernel 套件 342 例同场景全 PASS,aclnn 设备返回 nan,确证计算主体非本算子) - **UT**:现有断言全部保持(normal/empty ws=0 契约、group ws>0),tiling 行为与断言对齐;新增 FR-05 评审边界用例(受限 UB"一个对齐块都放不下"→ 拒绝;邻近对照放行) - **包构建**:build.sh --pkg --soc=ascend950 --ops=reduce_std_with_mean 通过(0 error);验证工具 clang-format / ruff / pre-commit 通过 ## 类型标签 - [x] Bug修复 - [x] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 - [x] AI辅助编写 See merge request: cann/ops-math!6691 | 13 days ago | |
fix(aclnn_batch_norm_stats): 使用 AddInplace 减少 workspace 占用 Co-authored-by: andong_hw<andong2@huawei.com> # message auto-generated for no-merge-commit merge: !6982 merge fix-aclnn-bn-stats-workspace into master fix(aclnn_batch_norm_stats): 使用 AddInplace 减少 workspace 占用 Created-by: andong_hw Commit-by: andong_hw Merged-by: cann-robot Description: ## 描述 将 aclnnBatchNormStatsImplUnify 中的 l0op::Add 改为 l0op::AddInplace(eps, var),原地写回 ReduceVar 的 var 输出,去掉一块 [C] fp32 的临时 buffer。 以输入 [1, 51200000, 1]、fp16 为例: - workspaceSize:614401536 B → 426378752 B - mean / invstd 与 golden 比对通过 同时补充 aclnnBatchNormStats 的 TTK TestSpec golden(tests/assets/golden.py),便于用 TTK 验证该接口。 ## 关联的Issue Closes #4394 ## 测试 - bash build.sh --pkg --ops=reduce_std_with_mean --soc=ascend950 -j32 编译通过 - TTK ACLNN 用例(fp16 [1,51200000,1]):GOLD: PASS,PASS,PassRate 100% - pre-commit 全部通过 ## 文档更新 无 ## 类型标签 - [ ] Bug修复 - [ ] 新特性 - [x] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-math!6982 | 7 days ago | |
[reduce_std_with_mean] 算子质量加固修复 + TTK golden 资产 Co-authored-by: JasonZhang88<jason.zhangshen@huawei.com> # message auto-generated for no-merge-commit merge: !6691 merge reduceStdMin into master [reduce_std_with_mean] 算子质量加固修复 + TTK golden 资产 Created-by: JasonZhang88 Commit-by: JasonZhang88 Merged-by: cann-robot Description: ## 描述 依据 ReduceStdWithMean 算子六轮全量验证(静态检查 + ST 用例生成/评审/自验证 + 上板 TTK 675 条 kernel + 83 条 GEIR)发现的 20 项问题进行整改:算子侧修复 11 项(含 FR-15 注册后的 golden 契约补全),测试用例侧修复 4 项(FR-09/11/12/14,验证工作区完成并上板复验),其余为非缺陷定性、CANN 编译器缺陷(已实证归因并本地规避)及资料归口项。 本 PR 仅涉及 math/reduce_std_with_mean/ 目录(11 文件,+500/-11,19 个提交),不影响其他算子。 ## 变更概述 ### 1. P1 关键修复:group 模板 workspace 缺失(FR-02,连带修复 FR-03) **现象**:上板 675 条用例中 384 条(tiling key∈{1,5},group 模板)全部 VEC_ERROR(设备侧 trap,errcode 286 / subErrType 0x4),无任何输出;GEIR 通路 83 条中 43 条失败。 **定位**:17 种源码变体二分 + 关键实验(E21–E24)确认崩点为 Phase 2 从 wsGm_ 读 GM;workspace 指针改绑输入张量 x 即全部 PASS——ws[0]=usrSize 下 runtime 传递的 workspace 指针不可访问。**归因为经验性约定**(经评审降级):runtime GetUserWorkspace 语义为 base+RESERVED_WORKSPACE(=16MB),系统空间未预留时裸指针不可访问;adv_api RA ReduceSum 本身不读写 GM workspace;同仓 reduce_var / reduce_std_v2_update 同此约定(ws 含系统空间 + kernel 裸指针、不做偏移),kernel.h Phase 2 沿用裸指针、未调 SetSysWorkspace。 **修复**(op_host/arch35/reduce_std_with_mean_tiling_arch35.cpp):仅 group 模板在 usrSize 基础上追加 GetLibApiWorkSpaceSize() 系统空间(上述经验性约定);normal/empty 模板为纯 Vector kernel,保持 ws[0]=0 设计契约不变,不引入 16MB 无谓分配。 **效果**:kernel VEC_ERROR 384 → 0(FR-02 提交当轮全量 PASS 407/675,其余为 FR-10 编译失败与 NaN/Inf 数值类,与本修复无关);GEIR 43 失败 → 83/83 全 PASS 为后续轮次(P1 批量修复 + stat_rel_err 基线)结论。 ### 2. P1 数值与容量安全(FR-04/05/06/07/08) | 修复 | 文件 | 说明 | |---|---|---| | FR-04 空闲核写 0 | op_kernel/arch35/reduce_std_with_mean_kernel.h | rGroupCnt > rOuter 时空闲核直接 return,Phase 2 的 ReduceSum 会累加未初始化 GM 数据;改为清零 cacheBuf 后照常写出本行 0 | | FR-05 补位后 UB 超预算 | op_host/arch35/..._tiling_arch35.cpp | 预算按有效 R 反解,但 kernel 按 CeilAlign padded R 分配 UB;补预算校验,超出时 rUbFactor(Align) 同步降至 block 对齐上限内。评审收口:maxPadded < bsAElem 时原守卫会跳过限缩(tail-R 全载且尺寸 < bsAElem 时补齐必然超预算),补显式 tiling 结构化错误——当前平台该路径经推导不可达(aUnit 受 atmp ≤ cacheLine/dtypeSize 约束,rIMax ≥ bsAElem 恒成立),属受限 UB 环境防御性收口,UT 以 faker 小 UB 触发边界覆盖(拒绝 + 邻近放行对照) | | FR-06 cacheBuf 容量越界 | op_host/arch35/..._tiling_arch35.cpp | group 归约树 cacheCount × levelStride 可超 16KB cacheBuf;补容量校验,超出时回退 normal 模板(回退分支 usedCoreNum 补 std::max(...,1) 兜底与正常路径对齐) | | FR-07 空指针解引用 | op_api/aclnn_batch_norm_stats.cpp | l0op::Pow/FillVector 返回 nullptr 时 ViewCopy 先解引用;补 CHECK_RET(≠nullptr) 以 ACLNN_ERR_INNER_NULLPTR 上抛 | | FR-08 InferShape 校验缺失 | op_host/reduce_std_with_mean_infershape.cpp + op_graph/..._graph_infer.cpp | 补 4 项:mean shape 与 x 一致(unknown rank 跳过)、rank=0 时 dim ∈ {[], [0], [-1]}、correction 非负、x 与 mean dtype 一致 | ### 3. P1 资料修复(FR-01) 调用表补齐 aclnnStd 行、GE图模式链接改指 op_graph/reduce_std_with_mean_proto.h。 ### 4. P2 修复(FR-15/16/17/18) | 修复 | 文件 | 说明 | |---|---|---| | FR-15 golden 未注册 aclnn 通路 | tests/assets/golden.py | 显式注册 aclnnStdMeanCorrection(经 L0 调用本算子);补全注册后的插件契约:customize_inputs/golden 签名对齐 TTK aclnn 参数计划(self, dim, correction, keepdim, stdOut, meanOut);tolerance 保持声明 cross_check,本环境 GPU 三方参考不可达经运行参数 --compare stat_rel_err 规避(kernel/aclnn 两模式均支持,与全量验证既定方式一致) | | FR-16 golden 精度不足 | tests/assets/golden.py | FP16/BF16→FP32 计算,FP32→FP64(消除大 N 累加精度损失);类 docstring 陈旧"全程 FP32"表述已同步修正 | | FR-17 约束说明缺失 | README.md | 补 epsilon 非负、unbiased/correction 折算优先级、N≤corr 输出语义(+Inf 或 NaN:一般输入 +Inf、全等输入 0×Inf=NaN,与 tiling/golden/torch 实测一致)、空张量输出 NaN、动态标记 -1/-2 语义 | | FR-18 样例缺陷 | examples/(3 文件) | RunGraph 失败误返回 SUCCESS → 改 FAILED;aclDestroyIntArray(dim) 未配对释放补齐 | ### 5. Golden 测试资产 新增 tests/assets/golden.py(321 行): - 注册 Kernel/GEIR 双通路参考实现 + aclnnStdMeanCorrection aclnn 通路 - 参考计算全部由 torch 承担(FP16/BF16→FP32,FP32→FP64 升精度),NumPy 仅做数据桥接 - 延迟导入 torch(_ensure_torch()),纯 TF NPU 环境可加载注册 - 覆盖 dim/unbiased/keepdim/invert/epsilon/correction 全属性与特殊值(NaN/Inf/空张量)用例 ## 关联 Issue https://gitcode.com/cann/ops-math/issues/3992 ## 测试 ### 最终结论(2026-10-27 全量复验,HEAD d073d90bc,NPU 4 / Ascend950PR,--compare stat_rel_err) **本算子实际执行面(kernel L0 直连 + GE 图模式,共 781 例):780/781 有效通过(99.9%),算子真实缺陷 0。** | 套件 | 数量 | 结果 | |---|---|---| | kernel L0+L1(L0 直连,全量基线集) | 675 | **674/675 有效 PASS** | | kernel L0_default_100(属性默认值等价用例) | 1 | PASS | | kernel L2 负例(tiling/InferShape 结构化拒绝) | 22 | **22/22 按预期拒绝** | | GEIR(GE 图模式) | 83 | **83/83 PASS** | ### 明细与归因 - **kernel 675 条**:VEC_ERROR 384 → **0**;NaN/Inf mismatch = **0**。其中 672 直接 PASS;L1_449/L1_450 为 TTK profiling 瞬时失败(复跑 PASS,同 L1_541 先例);原 232 条 Cst/DYN 在线编译失败(0 维输出触发 CANN 编译器缺陷 TypeError: reduce() of empty iterable,与 [asc-devkit#6931](https://gitcode.com/cann/asc-devkit/pulls/6931) 同源)按其修法本地补丁后重跑 **232/232 全 PASS**——失败 100% 归因编译器缺陷,算子侧无需改动;本地 CANN 保留该补丁。唯一非 PASS:**L1_264**(N=2.4e7, fp16, mere=0.3% 超阈值)——fp32 累加舍入随 N 增长的精度极限,非算子缺陷 - **kernel L2 负例**:22/22 按预期拒绝,含改造后的 rank=0 dim 越界用例(tiling 结构化拒绝 EZ0026);停用的 constraint_020 详见验证工作区记录 - **aclnn 适配层**(注:A5/regbase 上 aclnn 适配层调用平台 ReduceStdV2,数值段不走本算子,仅计本算子资产结果):CheckParams 负例 **21/25 结构化拒绝**(本算子 op_api 代码,错误码与声明一致)+ 4 条平台行为观察;golden 契约 591/591 生成正常;数值比较段 45 例 FAIL 均为平台路径精度/语义 + 测试设计已知分类(N≤corr 交叉实证:kernel 套件 342 例同场景全 PASS,aclnn 设备返回 nan,确证计算主体非本算子) - **UT**:现有断言全部保持(normal/empty ws=0 契约、group ws>0),tiling 行为与断言对齐;新增 FR-05 评审边界用例(受限 UB"一个对齐块都放不下"→ 拒绝;邻近对照放行) - **包构建**:build.sh --pkg --soc=ascend950 --ops=reduce_std_with_mean 通过(0 error);验证工具 clang-format / ruff / pre-commit 通过 ## 类型标签 - [x] Bug修复 - [x] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 - [x] AI辅助编写 See merge request: cann/ops-math!6691 | 13 days ago | |
feat: ReduceStdV2Update 和 ReduceStdWithMean 适配 ascend960 Co-authored-by: wkyan<yanwenkai@huawei.com> # message auto-generated for no-merge-commit merge: !6555 merge 1020_reduce into master feat: ReduceStdV2Update 和 ReduceStdWithMean 适配 ascend960 Created-by: wkyan Commit-by: wkyan Merged-by: cann-robot Description: ## 描述 为 ReduceStdV2Update 和 ReduceStdWithMean 增加 ascend960dt 平台支持,并补充对应的 RegBase 路径与系统 workspace 配置。 ### 改动原因 两个算子原有构建配置和 AICore 注册仅包含 ascend950、ascend350,无法按当前算子实现配置在 ascend960dt 平台使用。 ### 改动方法 1. math/reduce_std_v2_update/CMakeLists.txt:将 ascend960dt 加入 SUPPORT_COMPUTE_UNIT,并复用 arch35 tiling 目录。 2. math/reduce_std_v2_update/op_host/reduce_std_v2_update_def.cpp:为 ReduceStdV2Update 增加 ascend960dt AICore 配置。 3. math/reduce_std_v2_update/op_kernel/arch35/reduce_std_v2_update.h:将 SetLoopModePara / ResetLoopModePara 的可用架构扩展为 __NPU_ARCH__ == 3510 || __NPU_ARCH__ == 9201,并同步更新不支持平台的编译错误信息。 4. math/reduce_std_with_mean/CMakeLists.txt:将 ascend960dt 加入 SUPPORT_COMPUTE_UNIT,并复用 arch35 tiling 目录。 5. math/reduce_std_with_mean/op_host/reduce_std_with_mean_def.cpp:为 ReduceStdWithMean 增加 ascend960dt AICore 配置。 6. math/reduce_std_with_mean/op_api/reduce_std_with_mean.cpp:引入 op_api/aclnn_check.h,使用 IsRegBase() 判断 AICore 路径,并更新 950/960DT 平台说明。 ## 关联的Issue https://gitcode.com/cann/ops-math/issues/4014 ## 测试 本次 PR diff 未包含测试文件或可核验的测试结果;变更涉及 ascend960dt 编译平台注册、LoopMode 架构条件及系统 workspace 配置,需在对应平台完成编译、精度和算子泛化验证。 ## 文档更新 无 ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-math!6555 | 12 days ago | |
[reduce_std_with_mean] 算子质量加固修复 + TTK golden 资产 Co-authored-by: JasonZhang88<jason.zhangshen@huawei.com> # message auto-generated for no-merge-commit merge: !6691 merge reduceStdMin into master [reduce_std_with_mean] 算子质量加固修复 + TTK golden 资产 Created-by: JasonZhang88 Commit-by: JasonZhang88 Merged-by: cann-robot Description: ## 描述 依据 ReduceStdWithMean 算子六轮全量验证(静态检查 + ST 用例生成/评审/自验证 + 上板 TTK 675 条 kernel + 83 条 GEIR)发现的 20 项问题进行整改:算子侧修复 11 项(含 FR-15 注册后的 golden 契约补全),测试用例侧修复 4 项(FR-09/11/12/14,验证工作区完成并上板复验),其余为非缺陷定性、CANN 编译器缺陷(已实证归因并本地规避)及资料归口项。 本 PR 仅涉及 math/reduce_std_with_mean/ 目录(11 文件,+500/-11,19 个提交),不影响其他算子。 ## 变更概述 ### 1. P1 关键修复:group 模板 workspace 缺失(FR-02,连带修复 FR-03) **现象**:上板 675 条用例中 384 条(tiling key∈{1,5},group 模板)全部 VEC_ERROR(设备侧 trap,errcode 286 / subErrType 0x4),无任何输出;GEIR 通路 83 条中 43 条失败。 **定位**:17 种源码变体二分 + 关键实验(E21–E24)确认崩点为 Phase 2 从 wsGm_ 读 GM;workspace 指针改绑输入张量 x 即全部 PASS——ws[0]=usrSize 下 runtime 传递的 workspace 指针不可访问。**归因为经验性约定**(经评审降级):runtime GetUserWorkspace 语义为 base+RESERVED_WORKSPACE(=16MB),系统空间未预留时裸指针不可访问;adv_api RA ReduceSum 本身不读写 GM workspace;同仓 reduce_var / reduce_std_v2_update 同此约定(ws 含系统空间 + kernel 裸指针、不做偏移),kernel.h Phase 2 沿用裸指针、未调 SetSysWorkspace。 **修复**(op_host/arch35/reduce_std_with_mean_tiling_arch35.cpp):仅 group 模板在 usrSize 基础上追加 GetLibApiWorkSpaceSize() 系统空间(上述经验性约定);normal/empty 模板为纯 Vector kernel,保持 ws[0]=0 设计契约不变,不引入 16MB 无谓分配。 **效果**:kernel VEC_ERROR 384 → 0(FR-02 提交当轮全量 PASS 407/675,其余为 FR-10 编译失败与 NaN/Inf 数值类,与本修复无关);GEIR 43 失败 → 83/83 全 PASS 为后续轮次(P1 批量修复 + stat_rel_err 基线)结论。 ### 2. P1 数值与容量安全(FR-04/05/06/07/08) | 修复 | 文件 | 说明 | |---|---|---| | FR-04 空闲核写 0 | op_kernel/arch35/reduce_std_with_mean_kernel.h | rGroupCnt > rOuter 时空闲核直接 return,Phase 2 的 ReduceSum 会累加未初始化 GM 数据;改为清零 cacheBuf 后照常写出本行 0 | | FR-05 补位后 UB 超预算 | op_host/arch35/..._tiling_arch35.cpp | 预算按有效 R 反解,但 kernel 按 CeilAlign padded R 分配 UB;补预算校验,超出时 rUbFactor(Align) 同步降至 block 对齐上限内。评审收口:maxPadded < bsAElem 时原守卫会跳过限缩(tail-R 全载且尺寸 < bsAElem 时补齐必然超预算),补显式 tiling 结构化错误——当前平台该路径经推导不可达(aUnit 受 atmp ≤ cacheLine/dtypeSize 约束,rIMax ≥ bsAElem 恒成立),属受限 UB 环境防御性收口,UT 以 faker 小 UB 触发边界覆盖(拒绝 + 邻近放行对照) | | FR-06 cacheBuf 容量越界 | op_host/arch35/..._tiling_arch35.cpp | group 归约树 cacheCount × levelStride 可超 16KB cacheBuf;补容量校验,超出时回退 normal 模板(回退分支 usedCoreNum 补 std::max(...,1) 兜底与正常路径对齐) | | FR-07 空指针解引用 | op_api/aclnn_batch_norm_stats.cpp | l0op::Pow/FillVector 返回 nullptr 时 ViewCopy 先解引用;补 CHECK_RET(≠nullptr) 以 ACLNN_ERR_INNER_NULLPTR 上抛 | | FR-08 InferShape 校验缺失 | op_host/reduce_std_with_mean_infershape.cpp + op_graph/..._graph_infer.cpp | 补 4 项:mean shape 与 x 一致(unknown rank 跳过)、rank=0 时 dim ∈ {[], [0], [-1]}、correction 非负、x 与 mean dtype 一致 | ### 3. P1 资料修复(FR-01) 调用表补齐 aclnnStd 行、GE图模式链接改指 op_graph/reduce_std_with_mean_proto.h。 ### 4. P2 修复(FR-15/16/17/18) | 修复 | 文件 | 说明 | |---|---|---| | FR-15 golden 未注册 aclnn 通路 | tests/assets/golden.py | 显式注册 aclnnStdMeanCorrection(经 L0 调用本算子);补全注册后的插件契约:customize_inputs/golden 签名对齐 TTK aclnn 参数计划(self, dim, correction, keepdim, stdOut, meanOut);tolerance 保持声明 cross_check,本环境 GPU 三方参考不可达经运行参数 --compare stat_rel_err 规避(kernel/aclnn 两模式均支持,与全量验证既定方式一致) | | FR-16 golden 精度不足 | tests/assets/golden.py | FP16/BF16→FP32 计算,FP32→FP64(消除大 N 累加精度损失);类 docstring 陈旧"全程 FP32"表述已同步修正 | | FR-17 约束说明缺失 | README.md | 补 epsilon 非负、unbiased/correction 折算优先级、N≤corr 输出语义(+Inf 或 NaN:一般输入 +Inf、全等输入 0×Inf=NaN,与 tiling/golden/torch 实测一致)、空张量输出 NaN、动态标记 -1/-2 语义 | | FR-18 样例缺陷 | examples/(3 文件) | RunGraph 失败误返回 SUCCESS → 改 FAILED;aclDestroyIntArray(dim) 未配对释放补齐 | ### 5. Golden 测试资产 新增 tests/assets/golden.py(321 行): - 注册 Kernel/GEIR 双通路参考实现 + aclnnStdMeanCorrection aclnn 通路 - 参考计算全部由 torch 承担(FP16/BF16→FP32,FP32→FP64 升精度),NumPy 仅做数据桥接 - 延迟导入 torch(_ensure_torch()),纯 TF NPU 环境可加载注册 - 覆盖 dim/unbiased/keepdim/invert/epsilon/correction 全属性与特殊值(NaN/Inf/空张量)用例 ## 关联 Issue https://gitcode.com/cann/ops-math/issues/3992 ## 测试 ### 最终结论(2026-10-27 全量复验,HEAD d073d90bc,NPU 4 / Ascend950PR,--compare stat_rel_err) **本算子实际执行面(kernel L0 直连 + GE 图模式,共 781 例):780/781 有效通过(99.9%),算子真实缺陷 0。** | 套件 | 数量 | 结果 | |---|---|---| | kernel L0+L1(L0 直连,全量基线集) | 675 | **674/675 有效 PASS** | | kernel L0_default_100(属性默认值等价用例) | 1 | PASS | | kernel L2 负例(tiling/InferShape 结构化拒绝) | 22 | **22/22 按预期拒绝** | | GEIR(GE 图模式) | 83 | **83/83 PASS** | ### 明细与归因 - **kernel 675 条**:VEC_ERROR 384 → **0**;NaN/Inf mismatch = **0**。其中 672 直接 PASS;L1_449/L1_450 为 TTK profiling 瞬时失败(复跑 PASS,同 L1_541 先例);原 232 条 Cst/DYN 在线编译失败(0 维输出触发 CANN 编译器缺陷 TypeError: reduce() of empty iterable,与 [asc-devkit#6931](https://gitcode.com/cann/asc-devkit/pulls/6931) 同源)按其修法本地补丁后重跑 **232/232 全 PASS**——失败 100% 归因编译器缺陷,算子侧无需改动;本地 CANN 保留该补丁。唯一非 PASS:**L1_264**(N=2.4e7, fp16, mere=0.3% 超阈值)——fp32 累加舍入随 N 增长的精度极限,非算子缺陷 - **kernel L2 负例**:22/22 按预期拒绝,含改造后的 rank=0 dim 越界用例(tiling 结构化拒绝 EZ0026);停用的 constraint_020 详见验证工作区记录 - **aclnn 适配层**(注:A5/regbase 上 aclnn 适配层调用平台 ReduceStdV2,数值段不走本算子,仅计本算子资产结果):CheckParams 负例 **21/25 结构化拒绝**(本算子 op_api 代码,错误码与声明一致)+ 4 条平台行为观察;golden 契约 591/591 生成正常;数值比较段 45 例 FAIL 均为平台路径精度/语义 + 测试设计已知分类(N≤corr 交叉实证:kernel 套件 342 例同场景全 PASS,aclnn 设备返回 nan,确证计算主体非本算子) - **UT**:现有断言全部保持(normal/empty ws=0 契约、group ws>0),tiling 行为与断言对齐;新增 FR-05 评审边界用例(受限 UB"一个对齐块都放不下"→ 拒绝;邻近对照放行) - **包构建**:build.sh --pkg --soc=ascend950 --ops=reduce_std_with_mean 通过(0 error);验证工具 clang-format / ruff / pre-commit 通过 ## 类型标签 - [x] Bug修复 - [x] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 - [x] AI辅助编写 See merge request: cann/ops-math!6691 | 13 days ago | |
fix(reduce): 修改 StdMeanCorrection 错误码并归一 ReduceSum 负轴 Co-authored-by: zhouyuanhang30083383<zhouyuanhang4@h-partners.com> # message auto-generated for no-merge-commit merge: !6953 merge fix/reduce-std-shape-and-reduce-sum-neg-dim into master fix(reduce): 修改 StdMeanCorrection 错误码并归一 ReduceSum 负轴 Created-by: m0_55003149 Commit-by: zhouyuanhang30083383 Merged-by: cann-robot Description: ## 描述 aclnnStdMeanCorrection:保持原有 shape 推导/校验逻辑不变,仅将 meanOut 拷贝失败时的返回码从 561103(ACLNN_ERR_INNER_NULLPTR)改为 161002 aclnnReduceSum:在 BOOL→INT64 的 promoteType 判断中先归一负轴,再乘归约维度,避免负索引越界导致误选 FLOAT。 ## 关联的Issue https://gitcode.com/cann/ops-math/issues/4298 https://gitcode.com/cann/ops-math/issues/4249 ## 测试 ## 文档更新 ## 类型标签 <!-- [x] 表示选中 --> - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-math!6953 | 8 days ago | |
feat: ReduceStdV2Update 和 ReduceStdWithMean 适配 ascend960 Co-authored-by: wkyan<yanwenkai@huawei.com> # message auto-generated for no-merge-commit merge: !6555 merge 1020_reduce into master feat: ReduceStdV2Update 和 ReduceStdWithMean 适配 ascend960 Created-by: wkyan Commit-by: wkyan Merged-by: cann-robot Description: ## 描述 为 ReduceStdV2Update 和 ReduceStdWithMean 增加 ascend960dt 平台支持,并补充对应的 RegBase 路径与系统 workspace 配置。 ### 改动原因 两个算子原有构建配置和 AICore 注册仅包含 ascend950、ascend350,无法按当前算子实现配置在 ascend960dt 平台使用。 ### 改动方法 1. math/reduce_std_v2_update/CMakeLists.txt:将 ascend960dt 加入 SUPPORT_COMPUTE_UNIT,并复用 arch35 tiling 目录。 2. math/reduce_std_v2_update/op_host/reduce_std_v2_update_def.cpp:为 ReduceStdV2Update 增加 ascend960dt AICore 配置。 3. math/reduce_std_v2_update/op_kernel/arch35/reduce_std_v2_update.h:将 SetLoopModePara / ResetLoopModePara 的可用架构扩展为 __NPU_ARCH__ == 3510 || __NPU_ARCH__ == 9201,并同步更新不支持平台的编译错误信息。 4. math/reduce_std_with_mean/CMakeLists.txt:将 ascend960dt 加入 SUPPORT_COMPUTE_UNIT,并复用 arch35 tiling 目录。 5. math/reduce_std_with_mean/op_host/reduce_std_with_mean_def.cpp:为 ReduceStdWithMean 增加 ascend960dt AICore 配置。 6. math/reduce_std_with_mean/op_api/reduce_std_with_mean.cpp:引入 op_api/aclnn_check.h,使用 IsRegBase() 判断 AICore 路径,并更新 950/960DT 平台说明。 ## 关联的Issue https://gitcode.com/cann/ops-math/issues/4014 ## 测试 本次 PR diff 未包含测试文件或可核验的测试结果;变更涉及 ascend960dt 编译平台注册、LoopMode 架构条件及系统 workspace 配置,需在对应平台完成编译、精度和算子泛化验证。 ## 文档更新 无 ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-math!6555 | 12 days ago | |
[reduce_std_with_mean] 算子质量加固修复 + TTK golden 资产 Co-authored-by: JasonZhang88<jason.zhangshen@huawei.com> # message auto-generated for no-merge-commit merge: !6691 merge reduceStdMin into master [reduce_std_with_mean] 算子质量加固修复 + TTK golden 资产 Created-by: JasonZhang88 Commit-by: JasonZhang88 Merged-by: cann-robot Description: ## 描述 依据 ReduceStdWithMean 算子六轮全量验证(静态检查 + ST 用例生成/评审/自验证 + 上板 TTK 675 条 kernel + 83 条 GEIR)发现的 20 项问题进行整改:算子侧修复 11 项(含 FR-15 注册后的 golden 契约补全),测试用例侧修复 4 项(FR-09/11/12/14,验证工作区完成并上板复验),其余为非缺陷定性、CANN 编译器缺陷(已实证归因并本地规避)及资料归口项。 本 PR 仅涉及 math/reduce_std_with_mean/ 目录(11 文件,+500/-11,19 个提交),不影响其他算子。 ## 变更概述 ### 1. P1 关键修复:group 模板 workspace 缺失(FR-02,连带修复 FR-03) **现象**:上板 675 条用例中 384 条(tiling key∈{1,5},group 模板)全部 VEC_ERROR(设备侧 trap,errcode 286 / subErrType 0x4),无任何输出;GEIR 通路 83 条中 43 条失败。 **定位**:17 种源码变体二分 + 关键实验(E21–E24)确认崩点为 Phase 2 从 wsGm_ 读 GM;workspace 指针改绑输入张量 x 即全部 PASS——ws[0]=usrSize 下 runtime 传递的 workspace 指针不可访问。**归因为经验性约定**(经评审降级):runtime GetUserWorkspace 语义为 base+RESERVED_WORKSPACE(=16MB),系统空间未预留时裸指针不可访问;adv_api RA ReduceSum 本身不读写 GM workspace;同仓 reduce_var / reduce_std_v2_update 同此约定(ws 含系统空间 + kernel 裸指针、不做偏移),kernel.h Phase 2 沿用裸指针、未调 SetSysWorkspace。 **修复**(op_host/arch35/reduce_std_with_mean_tiling_arch35.cpp):仅 group 模板在 usrSize 基础上追加 GetLibApiWorkSpaceSize() 系统空间(上述经验性约定);normal/empty 模板为纯 Vector kernel,保持 ws[0]=0 设计契约不变,不引入 16MB 无谓分配。 **效果**:kernel VEC_ERROR 384 → 0(FR-02 提交当轮全量 PASS 407/675,其余为 FR-10 编译失败与 NaN/Inf 数值类,与本修复无关);GEIR 43 失败 → 83/83 全 PASS 为后续轮次(P1 批量修复 + stat_rel_err 基线)结论。 ### 2. P1 数值与容量安全(FR-04/05/06/07/08) | 修复 | 文件 | 说明 | |---|---|---| | FR-04 空闲核写 0 | op_kernel/arch35/reduce_std_with_mean_kernel.h | rGroupCnt > rOuter 时空闲核直接 return,Phase 2 的 ReduceSum 会累加未初始化 GM 数据;改为清零 cacheBuf 后照常写出本行 0 | | FR-05 补位后 UB 超预算 | op_host/arch35/..._tiling_arch35.cpp | 预算按有效 R 反解,但 kernel 按 CeilAlign padded R 分配 UB;补预算校验,超出时 rUbFactor(Align) 同步降至 block 对齐上限内。评审收口:maxPadded < bsAElem 时原守卫会跳过限缩(tail-R 全载且尺寸 < bsAElem 时补齐必然超预算),补显式 tiling 结构化错误——当前平台该路径经推导不可达(aUnit 受 atmp ≤ cacheLine/dtypeSize 约束,rIMax ≥ bsAElem 恒成立),属受限 UB 环境防御性收口,UT 以 faker 小 UB 触发边界覆盖(拒绝 + 邻近放行对照) | | FR-06 cacheBuf 容量越界 | op_host/arch35/..._tiling_arch35.cpp | group 归约树 cacheCount × levelStride 可超 16KB cacheBuf;补容量校验,超出时回退 normal 模板(回退分支 usedCoreNum 补 std::max(...,1) 兜底与正常路径对齐) | | FR-07 空指针解引用 | op_api/aclnn_batch_norm_stats.cpp | l0op::Pow/FillVector 返回 nullptr 时 ViewCopy 先解引用;补 CHECK_RET(≠nullptr) 以 ACLNN_ERR_INNER_NULLPTR 上抛 | | FR-08 InferShape 校验缺失 | op_host/reduce_std_with_mean_infershape.cpp + op_graph/..._graph_infer.cpp | 补 4 项:mean shape 与 x 一致(unknown rank 跳过)、rank=0 时 dim ∈ {[], [0], [-1]}、correction 非负、x 与 mean dtype 一致 | ### 3. P1 资料修复(FR-01) 调用表补齐 aclnnStd 行、GE图模式链接改指 op_graph/reduce_std_with_mean_proto.h。 ### 4. P2 修复(FR-15/16/17/18) | 修复 | 文件 | 说明 | |---|---|---| | FR-15 golden 未注册 aclnn 通路 | tests/assets/golden.py | 显式注册 aclnnStdMeanCorrection(经 L0 调用本算子);补全注册后的插件契约:customize_inputs/golden 签名对齐 TTK aclnn 参数计划(self, dim, correction, keepdim, stdOut, meanOut);tolerance 保持声明 cross_check,本环境 GPU 三方参考不可达经运行参数 --compare stat_rel_err 规避(kernel/aclnn 两模式均支持,与全量验证既定方式一致) | | FR-16 golden 精度不足 | tests/assets/golden.py | FP16/BF16→FP32 计算,FP32→FP64(消除大 N 累加精度损失);类 docstring 陈旧"全程 FP32"表述已同步修正 | | FR-17 约束说明缺失 | README.md | 补 epsilon 非负、unbiased/correction 折算优先级、N≤corr 输出语义(+Inf 或 NaN:一般输入 +Inf、全等输入 0×Inf=NaN,与 tiling/golden/torch 实测一致)、空张量输出 NaN、动态标记 -1/-2 语义 | | FR-18 样例缺陷 | examples/(3 文件) | RunGraph 失败误返回 SUCCESS → 改 FAILED;aclDestroyIntArray(dim) 未配对释放补齐 | ### 5. Golden 测试资产 新增 tests/assets/golden.py(321 行): - 注册 Kernel/GEIR 双通路参考实现 + aclnnStdMeanCorrection aclnn 通路 - 参考计算全部由 torch 承担(FP16/BF16→FP32,FP32→FP64 升精度),NumPy 仅做数据桥接 - 延迟导入 torch(_ensure_torch()),纯 TF NPU 环境可加载注册 - 覆盖 dim/unbiased/keepdim/invert/epsilon/correction 全属性与特殊值(NaN/Inf/空张量)用例 ## 关联 Issue https://gitcode.com/cann/ops-math/issues/3992 ## 测试 ### 最终结论(2026-10-27 全量复验,HEAD d073d90bc,NPU 4 / Ascend950PR,--compare stat_rel_err) **本算子实际执行面(kernel L0 直连 + GE 图模式,共 781 例):780/781 有效通过(99.9%),算子真实缺陷 0。** | 套件 | 数量 | 结果 | |---|---|---| | kernel L0+L1(L0 直连,全量基线集) | 675 | **674/675 有效 PASS** | | kernel L0_default_100(属性默认值等价用例) | 1 | PASS | | kernel L2 负例(tiling/InferShape 结构化拒绝) | 22 | **22/22 按预期拒绝** | | GEIR(GE 图模式) | 83 | **83/83 PASS** | ### 明细与归因 - **kernel 675 条**:VEC_ERROR 384 → **0**;NaN/Inf mismatch = **0**。其中 672 直接 PASS;L1_449/L1_450 为 TTK profiling 瞬时失败(复跑 PASS,同 L1_541 先例);原 232 条 Cst/DYN 在线编译失败(0 维输出触发 CANN 编译器缺陷 TypeError: reduce() of empty iterable,与 [asc-devkit#6931](https://gitcode.com/cann/asc-devkit/pulls/6931) 同源)按其修法本地补丁后重跑 **232/232 全 PASS**——失败 100% 归因编译器缺陷,算子侧无需改动;本地 CANN 保留该补丁。唯一非 PASS:**L1_264**(N=2.4e7, fp16, mere=0.3% 超阈值)——fp32 累加舍入随 N 增长的精度极限,非算子缺陷 - **kernel L2 负例**:22/22 按预期拒绝,含改造后的 rank=0 dim 越界用例(tiling 结构化拒绝 EZ0026);停用的 constraint_020 详见验证工作区记录 - **aclnn 适配层**(注:A5/regbase 上 aclnn 适配层调用平台 ReduceStdV2,数值段不走本算子,仅计本算子资产结果):CheckParams 负例 **21/25 结构化拒绝**(本算子 op_api 代码,错误码与声明一致)+ 4 条平台行为观察;golden 契约 591/591 生成正常;数值比较段 45 例 FAIL 均为平台路径精度/语义 + 测试设计已知分类(N≤corr 交叉实证:kernel 套件 342 例同场景全 PASS,aclnn 设备返回 nan,确证计算主体非本算子) - **UT**:现有断言全部保持(normal/empty ws=0 契约、group ws>0),tiling 行为与断言对齐;新增 FR-05 评审边界用例(受限 UB"一个对齐块都放不下"→ 拒绝;邻近对照放行) - **包构建**:build.sh --pkg --soc=ascend950 --ops=reduce_std_with_mean 通过(0 error);验证工具 clang-format / ruff / pre-commit 通过 ## 类型标签 - [x] Bug修复 - [x] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 - [x] AI辅助编写 See merge request: cann/ops-math!6691 | 13 days ago |
ReduceStdWithMean
产品支持情况
| 产品 | 是否支持 |
|---|---|
| Ascend 950PR&950DT系列产品 | √ |
| Atlas A3系列产品 | √ |
| Atlas A2系列产品 | √ |
| Atlas 200I/500 A2推理产品 | √ |
| Atlas推理系列产品 | √ |
| Atlas训练系列产品 | √ |
Ascend 950PR/950DT 由本自定义算子包提供 kernel 实现(arch35);其余产品由 CANN 内置算子库支持。Ascend 950PR/950DT、Atlas A3、Atlas A2 支持 float16 / float32 / bfloat16;其余产品支持 float16 / float32。
功能说明
给定外部预计算的均值 mean,沿指定维度 dim 计算输入 x 的标准差(invert=false)或其倒数(invert=true)。是 BatchNorm/LayerNorm/GroupNorm 归一化层统计量计算的关键子步骤,以及 PyTorch torch.std/torch.std_mean/torch.batch_norm_stats 在 NPU 上的底层实现。
标准差模式(invert=false,correction 生效):
y=∑j=0N−1(xj−meanj)2max(0, N−correction)y = \sqrt{\frac{\sum_{j=0}^{N-1}(x_j - mean_j)^2}{\max(0,\; N - correction)}} y=max(0,N−correction)∑j=0N−1(xj−meanj)2
标准差倒数模式(invert=true,固定除以 N、加 epsilon,忽略 correction):
y=11N∑j=0N−1(xj−meanj)2+ϵy = \frac{1}{\sqrt{\dfrac{1}{N}\sum_{j=0}^{N-1}(x_j - mean_j)^2 + \epsilon}} y=N1∑j=0N−1(xj−meanj)2+ϵ1
其中 N=∏d∈dimshape[d]N=\prod_{d \in dim}\text{shape}[d]N=∏d∈dimshape[d] 为归约维度元素总数,correctioncorrectioncorrection 为 Bessel 校正因子(0=总体、1=样本),ϵ\epsilonϵ 为数值稳定小量。
ReduceStdWithMean 为 CANN 内部 L0 算子,被 aclnnStd、aclnnStdMeanCorrection、aclnnBatchNormStats 三个上层 aclnn 接口组合调用,不直接暴露独立 aclnn 接口。
| 上层接口 | 功能 | correction | invert | eps |
|---|---|---|---|---|
| aclnnStd | 独立标准差 | 用户传入 | false | — |
| aclnnStdMeanCorrection | 同时输出 (std, mean) | 用户传入 | false | 0.001(固定) |
| aclnnBatchNormStats | 输出 (mean, invstd) | 0(固定) | true | 用户传入 |
参数说明
| 参数名 | 输入/输出/属性 | 描述 | 数据类型 | 数据格式 |
|---|---|---|---|---|
| x | 输入 | 待计算标准差的张量。 | FLOAT16、FLOAT、BFLOAT16 | ND |
| mean | 输入 | 外部预计算均值(已广播到 x 形状),dtype 与 x 一致。 | 与 x 一致 | ND |
| y | 输出 | 输出张量,dtype 与 x 一致;shape 由 dim + keepdim 推导。 | 与 x 一致 | ND |
| dim | 可选属性 | 归约维度,范围 [-rank(x), rank(x)-1],空表示全部维度。默认 {}。 | ListInt | - |
| unbiased | 可选属性 | Bessel 校正(legacy 字段)。默认 true。 | Bool | - |
| keepdim | 可选属性 | 是否保留归约维为 size 1。默认 false。 | Bool | - |
| invert | 可选属性 | true 返回 1/sqrt(var+eps),false 返回 sqrt(var)。默认 false。 | Bool | - |
| epsilon | 可选属性 | 数值稳定项(仅 invert=true 使用),须为非负浮点数。默认 0.001。 | Float | - |
| correction | 可选属性 | 校正因子:0=总体,1=样本。默认 1。 | Int | - |
约束说明
- x 与 mean 数据类型须一致,仅支持 float16 / float32 / bfloat16;输出 dtype 与 x 一致。
- x 的 shape 维度不超过 8 维。
- 支持 rank=0 标量输入(x/mean 为 0-D):dim 为空全归约,输出为标量(keepdim=true 时输出 1-D size 1)。
- mean 的 shape 须与 x 完全一致(mean 须已广播到 x 形状)。
- dim 取值范围 [-rank(x), rank(x)-1],空表示全部维度归约,且不能包含重复轴(负数轴归一化后判重)。
- 输出 y 的 shape 须与 dim + keepdim 推导结果一致。
- correction 仅支持非负整数;invert=true 时忽略 correction,固定除以 N。
- epsilon 仅支持非负浮点数(默认 0.001),tiling 阶段对 epsilon<0 返回错误。
- unbiased 为 legacy 字段:correction 属性有值时以 correction 为准,无值时按 unbiased=true→correction=1、unbiased=false→correction=0 折算。
- 空张量(N=0)输出 NaN;N<=correction(invert=false)输出 +Inf 或 NaN(一般输入为 +Inf,全等输入为 0×Inf=NaN)。
- 输入含动态标记(-1/-2)时按动态 shape 处理,具体语义由下游框架定义。
调用说明
| 调用方式 | 样例代码 | 说明 |
|---|---|---|
| GE图模式 | test_geir_reduce_std_with_mean.cpp | 通过 GE IR 构图调用,算子 IR 原型见 op_graph/reduce_std_with_mean_proto.h |
| aclnn API | test_aclnn_std_mean_correction.cpp | 通过 aclnnStdMeanCorrection 接口方式调用ReduceStdWithMean算子。 |
| aclnn API | test_aclnn_batch_norm_stats.cpp | 通过 aclnnBatchNormStats 接口方式调用ReduceStdWithMean算子。 |
| aclnn API | test_aclnn_std.cpp | 通过 aclnnStd 接口方式调用ReduceStdWithMean算子(该接口实现在同仓 math/reduce_std_v2)。 |