| fix(arch35): GroupNormSiluQuant/MultilabelMarginLoss/L2NormalizeGrad算子功能修复 Co-authored-by: tangpingchuan<tangpingchuan@huawei.com> # message auto-generated for no-merge-commit merge: !9017 merge fix/issue-batch-0820 into master fix(arch35): GroupNormSiluQuant/MultilabelMarginLoss/L2NormalizeGrad算子功能修复 Created-by: zl_hw Commit-by: tangpingchuan Merged-by: cann-robot Description: ## 描述 修复测试问题单 #21 / #31 / #32 暴露的三个算子的内核与 tiling 缺陷,并整改 0820 批次核对出的资料与实现不一致项。 ### 一、GroupNormSiluQuant —— UB 记账越界(issue #21) 现象:geir 动静态双腿 7 例全崩(MTE2 写越界 82 / VEC 访存越界 341 / scalar 越界 263),其中 3 例入参完全合法。四处缺陷: 1. SetPartialFallback 的 ubSize - meanAndRstd - gamma - beta - quantScale **无下溢保护**。实测 C=5408396 时 ubRemain 下溢成 2^64-21380096,processSize 被算成 2^61 级。 2. 同函数用 isLargeChannel && hasOptional 决定走 1120 还是 1100,而 quantScale 是否整段常驻**只取决于 C**:大 C 且无 gamma/beta 时被错选进 1100。判据改为「整段常驻装不装得下」。 3. MaybeSetSplitReduce 覆盖成 1140 时不做 UB 预算校验,而 1140 内核按「本核通道数」常驻 gamma/beta(每通道 12B,且无 gamma/beta 时也照开)。新增 SplitReduceFitsUb(与内核 InitUbBuffers 逐项对应),内核侧改为按 hasGamma/hasBeta 条件分配。 4. host 的 couldFold 漏了 kernel isFold = hwNum <= NDDMA_SIZE || (!hasGamma && !hasBeta) 的后半个条件,导致「无 gamma/beta + 大 hwNum」档 kernel 按 fold 布局写 451KB 而 host 只预留 shapeC 个 fp32。 另加防御:generalized 环两处减法加下溢保护;两处 DownAlign 为 0 时直接返回;tiling 出口统一校验——凡靠 processSize 驱动搬运的 key 解不出正值一律 GRAPH_FAILED,不把 0/下溢值下发给内核。 ### 二、MultilabelMarginLoss —— 支持面窄于 A2(issue #32) 原实现七块 buffer 全部随 C 线性增长且不参与分块,UB 253952B 直接换算出 C≈8000 上限,超过即 tiling 主动 GRAPH_FAILED(实测 C<=2842 全过、C>=195万 全败),而 A2 由 TBE DSL 承担切分对 C 无上限。 - tiling 新增 cFactor:整行装得下时 == C(走原全行路径,行为不变),装不下时解出分块长度(解时先给行方向分块 buffer 留 TILE_MIN 份,否则 ubFactor 会解出 0)。 - kernel 新增 C 分块路径:逐段在 UB 内建掩码并产出 is_target,标签分批缓存(每批至多 cFactor 个,连 x[k] 一并取回),每批对全部 x 段各做一次向量累加。复杂度与全行路径同为 O(P*C)。 - 三处同步缺陷(均由「同一用例跑两遍结果不同」暴露):DeQue 只给 MTE2→V,标量读 target 段需自补 MTE2→S;EnQue 只给 V→MTE3,标量写的缓冲搬出前需自补 S→MTE3;类内固定 EVENT_ID0 的 PipeBarrier 在本路径会与队列/LocalReduceSum 的同 ID 事件互踩,改用独立事件 ID。 ### 三、L2NormalizeGrad —— SPLIT_D 累加槽位写穿(issue #31 的超大 D 档) kernel 的 accum 缓冲固定 SPLIT_D_MAX_CHUNKS(=256) 槽,而 FormerProcess 按 numChunks_ 直接 Duplicate/写槽。1 维 D=1.51e8 需约 3.7 万槽,当场写穿 → errcode 341,host 侧无守卫。改为分组累加(组内向量规约 + 组间标量累加),D 不再有上限。 ### 四、GroupNormSiluQuant —— 空 Tensor 的 meanOut 语义两条通路不一致 资料两处(README.md:73、docs/aclnnGroupNormSiluQuant.md:112)与手写 aclnn 都规定「空 Tensor 时 meanOut 填 0、rstdOut 填 NAN」:op_host/op_api/aclnn_group_norm_silu_quant.cpp:251 的 IsEmpty() 分支显式 FillScalar(meanOut, 0) + FillScalar(rstdOut, NAN) 后直接返回,不下发内核。 而 arch35 内核的 empty 分支调 ProcessMeanAndRstd 时,该函数把填充值写死成 NAN,mean/rstd 都填 NAN——走 GE 图通路(aclnn 不参与)时 meanOut 变成 NaN,违反算子自己的契约。修法:把填充值提成入参,mean 传 0、rstd 传 NAN。 (对照:同族 GroupNormSilu 的 aclnn 对 regbase 显式跳过 FillScalar、把空张量交给内核,两条通路自洽;本算子的 aclnn 是无条件填充,所以只有本算子存在通路间不一致。) ### 五、GroupNormSiluQuant golden 补两档 + 判据显式声明 新配额用例集暴露:可选输入缺省(gamma/beta 传 None)与空张量在 golden 里判不了(15 例 GOLDEN_FAILURE),而「可选输入不给」正是 issue #21 中 L1_014 的画像——该档此前从设计上就没被验证过。按内核语义补缺省(1.0/0.0),空张量短路按上述契约取 mean=0 / rstd=NaN。 并把每个输出的判据显式声明到 Spec.tolerance,不再依赖 CLI 传什么: - int8 输出声明 quant —— 否则 TTK 把 int8 硬路由到 binary_equal,量化舍入的 ±1 LSB 被大面积误判(26 例「失败」实测最大 |diff| 全为 1)。 - mean/rstd 三种浮点 dtype 声明 CANN 开源标准 stat_rel_err(mere < th 且 mare < 10*th)。此前未声明,落到 TTK 默认的 isclose(atol=1e-8),该地板低于 bf16/fp32 在常见量级上的分辨率。实测 case00603_rg(2,5120,7) bf16:2560 个 mean 元素里 10 个不相等,**每个恰好差 1 ULP**(--dump 取原始数组算得 ULP 倍数 max=1.0000,超 1 ULP 的 0 个)——内核 fp32 累加后舍入到 bf16 与 torch 求和次序不同,边界值差一格,任何实现都做不到更好。 ### 六、0820 批次资料与实现一致性(issue #36~#49) 判据:aclnn 是手写还是自动生成(前者看 l0op::Contiguous/ViewCopy 的实际调用,后者看 OpDef 的 AutoContiguous,依据 cmake/func.cmake:502 有无 op_api/*.cpp 分流);再看参数是输入、ref(输入/输出复用)还是纯输出——自动生成路径下只有输入与 ref 有非连续支持,纯输出没有这一说。 - 6 个 foreach inplace 的第一参数(ref,输入侧已声明 AutoContiguous):资料 × → √(#38/#39/#44/#45/#46/#47) - ForeachAddcdivList / ForeachAddcmulList:def + arch35 内核 + config/ascend950 三层齐备,资料「A5 不支持」→ 支持(#40/#42) - DeepNorm / DeepNormGrad 的 7 个纯输出:资料 √ → ×(#36/#37) - FusedCrossEntropyLossWithMaxSum:inputOptional/weightOptional 的「非连续Tensor」列 √ → -(不涉及)(#48)。这两个参数当前只支持空指针(资料使用说明已写明),且实现中完全未被使用:aclnn 的 CheckParams 将其标为 [[maybe_unused]],kernel 的 GM_ADDR gmTensor[6] 张量列表也不含它们。既然不可能传入张量,「支持非连续」对其为空谈,正确整改是把该列标为不涉及,而不是给一个永不使用的入参补 l0op::Contiguous。 ## 关联的Issue https://gitcode.com/cann/ops-nn/issues/4994 ## 测试 全部为 Ascend950PR 真机实测(TTK geir 通路 + op_host UT)。 **issue 原始用例** | 项 | 结果 | |---|---| | #21 原始 7 例 | **7/7 PASS**(修复前 7/7 崩) | | #31 超大 D(1.51 亿元素)2 例 | 由 errcode 341 转 **PASS** | | #32 C 轴切分专项 57 例(旧全行路径 33 + 新 C 分块路径 24) | **57/57 PASS** | **回归与泛化** | 算子 | 交付回归集 | 配额集(七条硬约束派生) | 改动路径专项 | |---|---|---|---| | MultilabelMarginLoss | **1098/1098** | **113/113** | 57/57 | | L2NormalizeGrad | **1018/1018** | 79/81 | fp32 精度 13/13 | | GroupNormSiluQuant | 前 158 例 **158/158** | **211/211** | 空张量 **44/44**、改动路径集 **779/779** | 说明: - L2G 配额集余 2 例是 TTK 建图侧问题(rank==1 且属性 dim 缺省时,生成的图把输入 dtype 写错一档),算子对 DT_DOUBLE 正确拒收,该用例未测到算子;同一档由 fp16 那例以正确的 EZ0026 拒收覆盖。 - GNSQ 改动路径集按「本次改动真正生效的条件」筛选(大 C 路由/下溢保护区 + 空张量),未改动路径不重复验证。过程中 6 例 PROFILE_CRASH 退出码为 -9(宿主 OOM,容器 32G 上限),降并发单进程复跑 **6/6 PASS**。 - L2G fp32 13 例按算子自己声明的 cross_check L1 三方比对复判全 PASS:mare 比值 1.0~1.11(阈值 5.0)、mere 0.0036(阈值 1.5),NPU 误差与 GPU 竞品同量级。 ## 文档更新 10 个资料文件的一致性订正(详见「六、0820 批次资料与实现一致性」): - foreach/*/docs/aclnnForeach{ACos,AddList,MulList,MulScalar,SubList,SubScalar}Inplace.md - foreach/*/docs/aclnnForeach{Addcdiv,Addcmul}List.md - norm/deep_norm/docs/aclnnDeepNorm.md、norm/deep_norm_grad/docs/aclnnDeepNormGrad.md - loss/fused_cross_entropy_loss_with_max_sum/docs/aclnnFusedCrossEntropyLossWithMaxSum.md ## 类型标签 <!-- [x] 表示选中 --> - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [x] AI辅助编写 See merge request: cann/ops-nn!9017 | 23 天前 |
| 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(op_graph): 30 个算子原型头补 OPS_PROTO_DEF 隔离宏 Co-authored-by: tangpingchuan<tangpingchuan@huawei.com> # message auto-generated for no-merge-commit merge: !9218 merge fix/proto-isolation-macro into master fix(op_graph): 30 个算子原型头补 OPS_PROTO_DEF 隔离宏 Created-by: zl_hw Commit-by: tangpingchuan Merged-by: cann-robot Description: ## 描述 **改动原因** op_graph/*_proto.h 中的 REG_OP 会被 scripts/util/merge_proto.py 合并进 ops_proto_nn.h/.cpp,再编成内置 op_proto 库(cmake/gen_ops_info.cmake 的 merge_graph_headers → cmake/symbol.cmake 的 gen_opgraph_symbol)。当同名算子在 canndev 侧的遗留原型头(nn_norm_ops.h、reduce_ops.h、ops_proto_legacy.h 等)也有 REG_OP 注册时,两份定义进入同一编译单元会重复定义。 仓库既有范式是在 REG_OP 外层加条件编译隔离宏,merge_proto.py 的匹配式会把该宏一并带入合并产物。本仓已有 activation/relu6_d、optim/sgd、norm/in_training_reduce_v2、vfusion/normalize_bbox 等先例,但本批 30 个算子的原型头遗漏了该保护。检视意见整改。 **改动方法** 对 30 个算子的 op_graph/*_proto.h,在 REG_OP 外层补 #ifndef/#define OPS_PROTO_DEF_<OPTYPE> … #endif: c #ifndef OPS_PROTO_DEF_DEEPNORM #define OPS_PROTO_DEF_DEEPNORM REG_OP(DeepNorm) ... .OP_END_FACTORY_REG(DeepNorm) #endif // OPS_PROTO_DEF_DEEPNORM 宏名取 OPS_PROTO_DEF_ + 算子名大写去下划线,与发布包 opp/built-in/op_graph/inc 中已有 967 个同类隔离宏的拼法一致。位置严格贴在 REG_OP 前、OP_END_FACTORY_REG 后一行——merge_proto.py 的正则要求 guard 与 REG_OP 相邻,位置写偏宏会被丢弃。 **涉及算子(30 个)** ApplyAdagrad、BatchNormExt2、BN3DTrainingUpdate、BNInfer、BNTrainingUpdateV2、BNTrainingUpdateV3、ChamferDistance、ClippedSwiglu、CosineEmbeddingLoss、DeepNorm、DeepNormGrad、DynamicQuantUpdateScatter、DynamicQuantUpdateScatterV2、GemmaRmsNorm、GroupNormSiluQuant、HardSigmoid、HardSwishGradV2、INInferV2、InplaceApplyRMSProp、InplaceSub、InstanceNormGrad、INTrainingUpdateGrad、L2NormalizeGrad、MultiAddRmsNormDynamicQuant、MultilabelMarginLoss、NonZeroWithValue、PoissonNllLoss、Relu6Grad、SoftmaxFocalLoss、SoftmaxFocalLossGrad **顺带修复**:deep_norm、deep_norm_grad、gemma_rms_norm、multi_add_rms_norm_dynamic_quant、dynamic_quant_update_scatter_v2 这 5 个原型头文件末尾缺换行,属存量问题;pre-commit 的 end-of-file-fixer 钩子只扫改动文件,一旦改动即会被拦,故一并补齐。 **变更范围**:30 个文件,+95 −5,改动全部为条件编译指令与文件末尾换行,不改动任何 IR 的输入/输出/属性/dtype 定义,无功能与支持面变化。未改动 common/inc/op_graph/op_nn_proto_extend.h——merge_proto.py 会按算子名把聚合头中的重复项去重,改它不会进入合并产物。 ## 关联的Issue 关联 Issue #5170 ## 测试 1. **合并产物验证**:对 30 个改动文件跑 python3 scripts/util/merge_proto.py,合并产物中 REG_OP 30 个、#ifndef OPS_PROTO_DEF_ 30 个,隔离宏 30/30 全部正确带出。 2. **宏名配对验证**:与发布包 cann-9.2.0/opp/built-in/op_graph/inc/*.h 中同名算子的既有隔离宏逐个比对,宏名不一致项 0 处。 3. **重名检查**:30 个新增宏在三仓范围内无跨文件重名,每个文件内 OPS_PROTO_DEF_ 宏数恰为 1(无嵌套/重复保护)。 4. **格式与合规门禁**:按 .pre-commit-config.yaml 逐钩子本地复现 —— clang-format 18.1.8 --style=file --dry-run -Werror 整文件检查 30/30 通过、OAT 许可头 30/30 合规、trailing-whitespace / end-of-file-fixer / check-merge-conflict / detect-private-key / check-added-large-files 全部通过。 ## 文档更新 无。本 PR 不涉及文档变更。 ## 类型标签 <!-- [x] 表示选中 --> - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [x] AI辅助编写 <!-- 关联 Issue: https://gitcode.com/cann/ops-nn/issues/5170 --> See merge request: cann/ops-nn!9218 | 19 天前 |
| [cleancode] norm类算子C++语言规则告警整改 Co-authored-by: runqi_zhang<zhangrunqi2@huawei.com> # message auto-generated for no-merge-commit merge: !10000 merge test/codecheck-norm2 into master [cleancode] norm类算子C++语言规则告警整改 Created-by: runqi_zhang Commit-by: runqi_zhang Merged-by: cann-robot Description: ## 描述 仓内norm类算子存在大量C++语言规则类告警,对相应文件进行整改。 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> ## 测试 <!--描述进行了哪些测试来验证你的改动。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [ ] AI辅助编写 See merge request: cann/ops-nn!10000 | 6 天前 |
| 将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 | 18 天前 |
| test: 更新7个算子golden测试数据 Co-authored-by: tianqiguang<tianqiguang@huawei.com> # message auto-generated for no-merge-commit merge: !8510 merge master into master test: 更新7个算子golden测试数据 Created-by: tianqiguang Commit-by: tianqiguang Merged-by: cann-robot Description: ## 描述 更新 7 个算子的 golden(准确度基准)测试数据,同步最新参考值。 | 模块 | 算子 | 文件 | 变化 | |------|------|------|------| | loss | cosine_embedding_loss | golden.py | +56 | | loss | fused_cross_entropy_loss_with_max_sum | golden.py | +145 | | norm | deep_norm | golden.py | +59 | | norm | deep_norm_grad | golden.py | +77 | | optim | apply_adam_w_quant | golden.py | +68 | | quant | dynamic_quant_update_scatter | golden.py | +54 | | quant | dynamic_quant_update_scatter_v2 | golden.py | +56 | ## 测试 - CI golden 数据一致性验证 ## 类型标签 - [x] 测试 ## 关联的Issue - #4683 See merge request: cann/ops-nn!8510 | 1 个月前 |
| Format update: Adjusted the license description format in all relevant files. Co-authored-by: jiangqi<jiangqi47@h-partners.com> # message auto-generated for no-merge-commit merge: !365 merge license5 into master Format update: Adjusted the license description format in all relevant files. Created-by: jiangqi2025 Commit-by: jiangqi Merged-by: turing_project1 Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #123--> <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-nn!365 | 9 个月前 |
| docs: 完善 deep_norm、deep_norm_grad、dynamic_quant_update_scatter 算子的约束说明 Co-authored-by: tianqiguang<tianqiguang@huawei.com> # message auto-generated for no-merge-commit merge: !9576 merge deliver/cosine-deepnorm-docs into master docs: 完善 deep_norm、deep_norm_grad、dynamic_quant_update_scatter 算子的约束说明 Created-by: tianqiguang Commit-by: tianqiguang Merged-by: cann-robot Description: ## 描述 完善三个算子的 README 文档约束说明: - deep_norm/README.md:补充约束说明(x 维度 2-8、dtype 仅 FLOAT32/FLOAT16/BFLOAT16、mean/rstd 固定 FLOAT32、tiling 范围检查、full-load/partial-load 路径切换等)。 - deep_norm_grad/README.md:补充约束说明(dy/x/gx 等 shape 一致、dtype 约束、tiling 溢出检查、small-D 分支需要额外 workspace 等)。 - dynamic_quant_update_scatter/README.md:更新 axis 属性说明(支持负数取值并归一化)、细化约束说明(updates/var_scale/smooth_scales 约束、尾轴 32B 对齐、axis 内层轴要求等)。 ## 关联的Issue 无 ## 测试 文档变更,无需测试。 ## 文档更新 - norm/deep_norm/README.md - norm/deep_norm_grad/README.md - quant/dynamic_quant_update_scatter/README.md ## 类型标签 - [x] 文档更新 ## AI/Agent生成声明 - [ ] AI辅助编写 See merge request: cann/ops-nn!9576 | 14 天前 |