| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
add_cases Co-authored-by: zhaogrug<zhaohai16@h-partners.com> # message auto-generated for no-merge-commit merge: !7583 merge add_cases into master add_cases Created-by: zhaogrug Commit-by: zhaogrug Merged-by: cann-robot Description: ## 描述 新增仓内新版ttk用例 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> ## 关联的Issue [#4223](https://gitcode.com/cann/ops-nn/issues/4223) <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> ## 测试 冒烟测试,本地验证 <!--描述进行了哪些测试来验证你的改动。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [x] 其他,请描述:用例添加 ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [ ] AI辅助编写 See merge request: cann/ops-nn!7583 | 2 个月前 | |
TF plugin 迁移2 Co-authored-by: sunchun<sunchun4@h-partners.com> # message auto-generated for no-merge-commit merge: !7586 merge nn2 into master TF plugin 迁移2 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!7586 | 2 个月前 | |
add_cases Co-authored-by: zhaogrug<zhaohai16@h-partners.com> # message auto-generated for no-merge-commit merge: !7583 merge add_cases into master add_cases Created-by: zhaogrug Commit-by: zhaogrug Merged-by: cann-robot Description: ## 描述 新增仓内新版ttk用例 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> ## 关联的Issue [#4223](https://gitcode.com/cann/ops-nn/issues/4223) <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> ## 测试 冒烟测试,本地验证 <!--描述进行了哪些测试来验证你的改动。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [x] 其他,请描述:用例添加 ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [ ] AI辅助编写 See merge request: cann/ops-nn!7583 | 2 个月前 | |
TF plugin 迁移2 Co-authored-by: sunchun<sunchun4@h-partners.com> # message auto-generated for no-merge-commit merge: !7586 merge nn2 into master TF plugin 迁移2 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!7586 | 2 个月前 | |
optim、pooling打标签 Co-authored-by: y60124828<yanglou1@h-partners.com> # message auto-generated for no-merge-commit merge: !8311 merge master into master optim、pooling打标签 Created-by: yanglu-1 Commit-by: y60124828 Merged-by: cann-robot Description: ## 描述 optim、pooling打标签 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> ## 测试 <!--描述进行了哪些测试来验证你的改动。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [ ] AI辅助编写 See merge request: cann/ops-nn!8311 | 1 个月前 | |
TF plugin 迁移2 Co-authored-by: sunchun<sunchun4@h-partners.com> # message auto-generated for no-merge-commit merge: !7586 merge nn2 into master TF plugin 迁移2 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!7586 | 2 个月前 | |
ApplyAdagrad,InplaceSub算子下一代支持;hardsigmoid 算子检视意见闭环 Co-authored-by: tianyu52<tianyu52@huawei.com> # message auto-generated for no-merge-commit merge: !8137 merge master into master ApplyAdagrad,InplaceSub算子下一代支持;hardsigmoid 算子检视意见闭环 Created-by: tianyu52 Commit-by: tianyu52 Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> ApplyAdagrad,InplaceSub算子下一代支持 hardsigmoid检视意见闭环(1.补充config,;2.修正文档描述) ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> ## 测试 <!--描述进行了哪些测试来验证你的改动。--> ApplyAdagrad:UT/ST pass ; ops-test-kit 测试900+ 用例pass InplaceSub:UT/ST pass ; ops-test-kit 测试900+ 用例pass hardsigmoid:UT/ST pass ; ops-test-kit 测试900+ 用例pass ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [x] AI辅助编写 See merge request: cann/ops-nn!8137 | 1 个月前 | |
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 | 2 个月前 | |
optim、pooling打标签 Co-authored-by: y60124828<yanglou1@h-partners.com> # message auto-generated for no-merge-commit merge: !8311 merge master into master optim、pooling打标签 Created-by: yanglu-1 Commit-by: y60124828 Merged-by: cann-robot Description: ## 描述 optim、pooling打标签 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> ## 测试 <!--描述进行了哪些测试来验证你的改动。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [ ] AI辅助编写 See merge request: cann/ops-nn!8311 | 1 个月前 | |
add_cases Co-authored-by: zhaogrug<zhaohai16@h-partners.com> # message auto-generated for no-merge-commit merge: !7583 merge add_cases into master add_cases Created-by: zhaogrug Commit-by: zhaogrug Merged-by: cann-robot Description: ## 描述 新增仓内新版ttk用例 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> ## 关联的Issue [#4223](https://gitcode.com/cann/ops-nn/issues/4223) <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> ## 测试 冒烟测试,本地验证 <!--描述进行了哪些测试来验证你的改动。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [x] 其他,请描述:用例添加 ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [ ] AI辅助编写 See merge request: cann/ops-nn!7583 | 2 个月前 | |
merge: apply_adam_v2 转测准入检查项补齐 Co-authored-by: handsomeRobot_SK<suke13@huawei.com> # message auto-generated for no-merge-commit merge: !8201 merge master into master merge: apply_adam_v2 转测准入检查项补齐 Created-by: handsomeRobot_SK Commit-by: handsomeRobot_SK Merged-by: cann-robot Description: ### 标题 feat(optim): 新增 ApplyAdamV2 和 FusedMulApplyMomentum 算子 Ascend950 实现 ### 描述 #### 变更内容 本 PR 为 Ascend950 (arch35) 平台新增两个优化器算子的完整实现: **1. ApplyAdamV2** - Adam 优化器变体,支持 adam / mbart_adam 两种模式 - 12 输入(含 2 个 Optional:max_grad_norm、step_size)/ 3 输出 - 支持 DT_FLOAT16、DT_FLOAT,FP16 内部提升至 FP32 计算 - 支持动态 shape(-1)和动态 rank(-2) **2. FusedMulApplyMomentum** - 融合梯度缩放(mul)与动量更新(apply_momentum) - 6 输入 / 2 输出(inplace 复用 var、accum) - 支持标准动量和 Nesterov 动量(use_nesterov 属性) - 支持广播 shape,最大 rank 8 #### 主要改动 | 模块 | 说明 | |------|------| | op_host/*_def.cpp | 算子注册定义(OpDef 格式),属性标记 AttrType(OPTIONAL) | | op_host/arch35/*_tiling_arch35.cpp | Tiling 实现,含维度/dtype/format 校验 | | op_graph/*_proto.h | GE IR 图构建 proto 定义 | | op_kernel/arch35/ | AscendC kernel 实现 | | common/inc/op_graph/op_nn_proto_extend.h | 移除旧 REG_OP(ApplyAdamV2) 定义,迁移至 OpDef 格式 | | examples/arch35/ | GEIR 静态/动态/异常用例(本地保留,暂不入库) | #### Tiling 校验项 - 维度数 ≤ 8(MAX_DIM_NUM) - dtype 仅支持 DT_FLOAT16、DT_FLOAT - format 仅支持 FORMAT_ND - 输入间 dtype 一致性校验 - 广播 shape 兼容性校验 #### 提交记录 | Commit | 说明 | |--------|------| | a18138bfa | feat(optim): add apply_adam_v2 operator (Ascend950, arch35) | | ae5c7ae52 | feat(optim): fused_mul_apply_momentum | | f5b882236 | feat(optim): add apply_adam_v2 operator | | ca43328b0 | feat(fused_mul_apply_momentum): add tiling exception checks | | 2325929ee | feat(apply_adam_v2): 补齐转测准入检查项 | | 38bea1cdc | merge: apply_adam_v2 转测准入检查项补齐 | | a77f1cd6d | feat(optim): 对齐校验格式(OP_LOGE 统一风格) | | e345b1414 | chore: 从远端移除 example 测试文件(本地保留) | --- See merge request: cann/ops-nn!8201 | 1 个月前 | |
optim、pooling打标签 Co-authored-by: y60124828<yanglou1@h-partners.com> # message auto-generated for no-merge-commit merge: !8311 merge master into master optim、pooling打标签 Created-by: yanglu-1 Commit-by: y60124828 Merged-by: cann-robot Description: ## 描述 optim、pooling打标签 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> ## 测试 <!--描述进行了哪些测试来验证你的改动。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [ ] AI辅助编写 See merge request: cann/ops-nn!8311 | 1 个月前 | |
optim、pooling打标签 Co-authored-by: y60124828<yanglou1@h-partners.com> # message auto-generated for no-merge-commit merge: !8311 merge master into master optim、pooling打标签 Created-by: yanglu-1 Commit-by: y60124828 Merged-by: cann-robot Description: ## 描述 optim、pooling打标签 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> ## 测试 <!--描述进行了哪些测试来验证你的改动。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [ ] AI辅助编写 See merge request: cann/ops-nn!8311 | 1 个月前 | |
optim、pooling打标签 Co-authored-by: y60124828<yanglou1@h-partners.com> # message auto-generated for no-merge-commit merge: !8311 merge master into master optim、pooling打标签 Created-by: yanglu-1 Commit-by: y60124828 Merged-by: cann-robot Description: ## 描述 optim、pooling打标签 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> ## 测试 <!--描述进行了哪些测试来验证你的改动。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [ ] AI辅助编写 See merge request: cann/ops-nn!8311 | 1 个月前 | |
TF plugin 迁移2 Co-authored-by: sunchun<sunchun4@h-partners.com> # message auto-generated for no-merge-commit merge: !7586 merge nn2 into master TF plugin 迁移2 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!7586 | 2 个月前 | |
TF plugin 迁移2 Co-authored-by: sunchun<sunchun4@h-partners.com> # message auto-generated for no-merge-commit merge: !7586 merge nn2 into master TF plugin 迁移2 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!7586 | 2 个月前 | |
TF plugin 迁移2 Co-authored-by: sunchun<sunchun4@h-partners.com> # message auto-generated for no-merge-commit merge: !7586 merge nn2 into master TF plugin 迁移2 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!7586 | 2 个月前 | |
TF plugin 迁移2 Co-authored-by: sunchun<sunchun4@h-partners.com> # message auto-generated for no-merge-commit merge: !7586 merge nn2 into master TF plugin 迁移2 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!7586 | 2 个月前 | |
optim、pooling打标签 Co-authored-by: y60124828<yanglou1@h-partners.com> # message auto-generated for no-merge-commit merge: !8311 merge master into master optim、pooling打标签 Created-by: yanglu-1 Commit-by: y60124828 Merged-by: cann-robot Description: ## 描述 optim、pooling打标签 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> ## 测试 <!--描述进行了哪些测试来验证你的改动。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [ ] AI辅助编写 See merge request: cann/ops-nn!8311 | 1 个月前 | |
TF plugin 迁移2 Co-authored-by: sunchun<sunchun4@h-partners.com> # message auto-generated for no-merge-commit merge: !7586 merge nn2 into master TF plugin 迁移2 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!7586 | 2 个月前 | |
[CANNBot]: 修正README参数说明与算子定义一致 Co-authored-by: chen_chenn<chenchen167@huawei.com> # message auto-generated for no-merge-commit merge: !7867 merge applyKerasMomentum into master [CANNBot]: 修正README参数说明与算子定义一致 Created-by: chen_chenn Commit-by: chen_chenn Merged-by: cann-robot Description: ## 描述 修正README参数说明与算子定义一致 ## 关联的Issue https://gitcode.com/cann/ops-nn/issues/4274 ## 测试 ## 文档更新 https://gitcode.com/cann/ops-nn/blob/master/optim/apply_keras_momentum/README.md ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 - [x] AI辅助编写 See merge request: cann/ops-nn!7867 | 2 个月前 | |
TF plugin 迁移2 Co-authored-by: sunchun<sunchun4@h-partners.com> # message auto-generated for no-merge-commit merge: !7586 merge nn2 into master TF plugin 迁移2 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!7586 | 2 个月前 | |
TF plugin 迁移2 Co-authored-by: sunchun<sunchun4@h-partners.com> # message auto-generated for no-merge-commit merge: !7586 merge nn2 into master TF plugin 迁移2 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!7586 | 2 个月前 | |
fix: def-driven dtype + InferDataType separation for Celu/DataFormatDimMap/ApplyProximalGradientDescent Changes per operator (Celu, DataFormatDimMap, ApplyProximalGradientDescent): 1. def-driven dtype (item 7): - tiling_key.h: ASCENDC_TPL_DATATYPE_DECL → ASCENDC_TPL_UINT_DECL - kernel .cpp/_apt.cpp: template <typename D_T> → template <int MODE>, use DTYPE_<INPUT> macro - tiling_arch35.cpp/tiling.cpp: ASCENDC_TPL_SEL_PARAM no longer passes dtype value 2. InferShape/InferDataType separation (item 8): - Delete op_host/*_infershape.cpp (InferShape reused from canndev runtime) - Create op_graph/*_graph_infer.cpp with IMPL_OP().InferDataType() registration - InferDataType logic: output dtype = input[0] dtype 3. Celu dynamic GEIR example added (item 5) Reference: ops-cv PR 1126, acts_ulq_input_grad pattern | 1 个月前 | |
TF plugin 迁移2 Co-authored-by: sunchun<sunchun4@h-partners.com> # message auto-generated for no-merge-commit merge: !7586 merge nn2 into master TF plugin 迁移2 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!7586 | 2 个月前 | |
feat: add verification on FusedMulApplyKerasMomentum Co-authored-by: niukang_hw<niukang1@huawei.com> # message auto-generated for no-merge-commit merge: !8268 merge dev_fused_mul_apply_keras_momentum into master feat: add verification on FusedMulApplyKerasMomentum Created-by: niukang_hw Commit-by: niukang_hw Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> ## 测试 <!--描述进行了哪些测试来验证你的改动。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [x] AI辅助编写 See merge request: cann/ops-nn!8268 | 1 个月前 | |
merge: apply_adam_v2 转测准入检查项补齐 Co-authored-by: handsomeRobot_SK<suke13@huawei.com> # message auto-generated for no-merge-commit merge: !8201 merge master into master merge: apply_adam_v2 转测准入检查项补齐 Created-by: handsomeRobot_SK Commit-by: handsomeRobot_SK Merged-by: cann-robot Description: ### 标题 feat(optim): 新增 ApplyAdamV2 和 FusedMulApplyMomentum 算子 Ascend950 实现 ### 描述 #### 变更内容 本 PR 为 Ascend950 (arch35) 平台新增两个优化器算子的完整实现: **1. ApplyAdamV2** - Adam 优化器变体,支持 adam / mbart_adam 两种模式 - 12 输入(含 2 个 Optional:max_grad_norm、step_size)/ 3 输出 - 支持 DT_FLOAT16、DT_FLOAT,FP16 内部提升至 FP32 计算 - 支持动态 shape(-1)和动态 rank(-2) **2. FusedMulApplyMomentum** - 融合梯度缩放(mul)与动量更新(apply_momentum) - 6 输入 / 2 输出(inplace 复用 var、accum) - 支持标准动量和 Nesterov 动量(use_nesterov 属性) - 支持广播 shape,最大 rank 8 #### 主要改动 | 模块 | 说明 | |------|------| | op_host/*_def.cpp | 算子注册定义(OpDef 格式),属性标记 AttrType(OPTIONAL) | | op_host/arch35/*_tiling_arch35.cpp | Tiling 实现,含维度/dtype/format 校验 | | op_graph/*_proto.h | GE IR 图构建 proto 定义 | | op_kernel/arch35/ | AscendC kernel 实现 | | common/inc/op_graph/op_nn_proto_extend.h | 移除旧 REG_OP(ApplyAdamV2) 定义,迁移至 OpDef 格式 | | examples/arch35/ | GEIR 静态/动态/异常用例(本地保留,暂不入库) | #### Tiling 校验项 - 维度数 ≤ 8(MAX_DIM_NUM) - dtype 仅支持 DT_FLOAT16、DT_FLOAT - format 仅支持 FORMAT_ND - 输入间 dtype 一致性校验 - 广播 shape 兼容性校验 #### 提交记录 | Commit | 说明 | |--------|------| | a18138bfa | feat(optim): add apply_adam_v2 operator (Ascend950, arch35) | | ae5c7ae52 | feat(optim): fused_mul_apply_momentum | | f5b882236 | feat(optim): add apply_adam_v2 operator | | ca43328b0 | feat(fused_mul_apply_momentum): add tiling exception checks | | 2325929ee | feat(apply_adam_v2): 补齐转测准入检查项 | | 38bea1cdc | merge: apply_adam_v2 转测准入检查项补齐 | | a77f1cd6d | feat(optim): 对齐校验格式(OP_LOGE 统一风格) | | e345b1414 | chore: 从远端移除 example 测试文件(本地保留) | --- See merge request: cann/ops-nn!8201 | 1 个月前 | |
feat: FusedMulApplyMomentumExtern is supported on Ascend950 Co-authored-by: niukang_hw<niukang1@huawei.com> # message auto-generated for no-merge-commit merge: !7533 merge dev_fused_mul_apply_momentum_extern into master feat: FusedMulApplyMomentumExtern is supported on Ascend950 Created-by: niukang_hw Commit-by: niukang_hw Merged-by: cann-robot Description: ## 描述 - **算子功能**:CANN 图模式融合训练算子,将梯度缩放(Mul)与带动量的参数更新(ApplyMomentum)融合为单次逐元素更新,并**原地**更新主权重 var、动量缓冲 accum 及低精度权重副本 var_copy(inplace 语义)。由 momentum_lossscale_fusion_pass 融合 PASS 产生,对标 TensorFlow ApplyMomentum 的加号动量语义。use_nesterov=True 时采用 Nesterov 动量。 - **计算公式**: $$ \begin{aligned} grad &= x1 \times x2 \\ accum_{t} &= accum \times momentum + grad \end{aligned} $$ - 若 use_nesterov = False(标准动量): $$ \Delta v = accum_{t} \times lr $$ - 若 use_nesterov = True(Nesterov 动量): $$ \Delta v = grad \times lr + accum_{t} \times momentum \times lr $$ - 参数更新: $$ \begin{aligned} var_{t} &= var - \Delta v \\ var\_copy_{t} &= var\_copy - \text{Cast}(\Delta v) \\ accum\_out &= \text{Cast}(accum_{t}) \end{aligned} $$ 其中 x2 为 LossScale 倒数缩放标量。主权重 var 恒为 FLOAT(FP32)全程高精度更新;低精度副本 var_copy 独立同步更新(减去 Cast(Δv) 而非 Cast(var_out),避免二次精度损失)。低精度通路(FP16/BF16)内部升 FP32 计算,输出 Cast 回原低精度。 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> ## 测试 | 数据类型 | 精度标准 (rtol/atol) | 用例数 | 通过 | 失败 | 通过率 | | -------- | -------------------- | ------ | ---- | ---- | ------ | | FP32 | 1e-4 / 1e-4 | 88 | 88 | 0 | 100% | | FP16 | 1e-3 / 1e-3 | 61 | 61 | 0 | 100% | | BF16 | 4e-3 / 4e-3 | 48 | 48 | 0 | 100% | | 合计 | — | 197 | 197 | 0 | 100% | ## 文档更新 新增 optim/fused_mul_apply_momentum_extern/README.md ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [x] AI辅助编写 See merge request: cann/ops-nn!7533 | 2 个月前 | |
optim、pooling打标签 Co-authored-by: y60124828<yanglou1@h-partners.com> # message auto-generated for no-merge-commit merge: !8311 merge master into master optim、pooling打标签 Created-by: yanglu-1 Commit-by: y60124828 Merged-by: cann-robot Description: ## 描述 optim、pooling打标签 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> ## 测试 <!--描述进行了哪些测试来验证你的改动。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [ ] AI辅助编写 See merge request: cann/ops-nn!8311 | 1 个月前 | |
[CANNBOT]SoftMarginLossGrad, threshold_grad_v2_d ,acts_ulq_input_grad算子异常拦截和golden补充 Co-authored-by: gcw_YBIAEfqJ<wangweidong15@huawei.com> # message auto-generated for no-merge-commit merge: !8158 merge ThresholdGradV2D into master [CANNBOT]SoftMarginLossGrad, threshold_grad_v2_d ,acts_ulq_input_grad算子异常拦截和golden补充 Created-by: gcw_YBIAEfqJ Commit-by: gcw_YBIAEfqJ Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> SoftMarginLossGrad, threshold_grad_v2_d ,acts_ulq_input_grad算子异常拦截和golden补充 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> https://gitcode.com/cann/ops-nn/issues/4500 ## 测试 <!--描述进行了哪些测试来验证你的改动。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [ ] AI辅助编写 See merge request: cann/ops-nn!8158 | 1 个月前 | |
fix(inplace_apply_adagrad_da): 收紧 dtype 组合对齐 CANNDEV,删除 README 维度限制 Co-authored-by: zhongheng<m202474569@hust.edu.cn> # message auto-generated for no-merge-commit merge: !8055 merge fix/inplace_apply_adagrad_da_dtype_validation into master fix(inplace_apply_adagrad_da): 收紧 dtype 组合对齐 CANNDEV,删除 README 维度限制 Created-by: zhongheng Commit-by: zhongheng Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> 对齐 CANNDEV ApplyAdagradDAD(apply_adagrad_da_d.py)的 dtype 校验逻辑,修复测试反馈的校验缺口。 1. def.cpp 收紧 tensor dtype 组合(修复场景 02/17) - 10 个 tensor(var/gradient_accumulator/gradient_squared_accumulator/grad/lr/l1/l2 + 3 output)的 DataType 从 4 元组 {DT_FLOAT, DT_FLOAT16, DT_FLOAT, DT_FLOAT16} 收为 2 元组 {DT_FLOAT, DT_FLOAT16} - Format/UnknownShapeFormat 同步收为 2 元组 - 效果:框架层强制所有 tensor dtype 一致,等价于 CANNDEV compare_tensor_dict_key 校验,从图编译期拦截 var=fp32+grad=fp16 等 dtype 不一致场景 2. def.cpp 收紧 global_step dtype 配对(修复场景 10) - global_step 的 DataType 从 4 元组 {DT_INT32, DT_INT32, DT_INT64, DT_INT64} 收为 2 元组 {DT_INT32, DT_INT64} - 效果:对齐 README 声明(float32 配 int32, float16 配 int64) 3. README 删除维度上限(修复场景 09) - 「支持 0~8 维输入」→「支持任意维 ND 输入」,对齐 CANNDEV 无限制 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> https://gitcode.com/cann/ops-nn/issues/4406 ## 测试 <!--描述进行了哪些测试来验证你的改动。--> - ✅ 编译验证通过(Ascend950,build.sh --soc=ascend950 --ops=inplace_apply_adagrad_da) - ✅ kernel binary 从 4 个减为 2 个(2 组合:fp32+int32, fp16+int64) - ✅ binary.json dtype 组合确认 2 组 - ✅ op_info 注册名 InplaceApplyAdagradDA 正确 ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> - README.md:维度限制描述更新 ## 类型标签 <!-- [x] 表示选中 --> - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [x] AI辅助编写 See merge request: cann/ops-nn!8055 | 2 个月前 | |
[CANNBot]名称修改: ApplyAdagradV2D → InplaceApplyAdagradV2(目录 apply_adagrad_v2d/ → inplace_apply_adagrad_v2/) Co-authored-by: zhongheng<m202474569@hust.edu.cn> # message auto-generated for no-merge-commit merge: !7776 merge feat/inplace_apply_adagrad_v2 into master [CANNBot]名称修改: ApplyAdagradV2D → InplaceApplyAdagradV2(目录 apply_adagrad_v2d/ → inplace_apply_adagrad_v2/) Created-by: zhongheng Commit-by: zhongheng Merged-by: cann-robot Description: ## 描述 名称修改: ApplyAdagradV2D → InplaceApplyAdagradV2(目录 apply_adagrad_v2d/ → inplace_apply_adagrad_v2/) 改动原因:算子命名规范化,与同仓已合入的 InplaceApplyAdagradDA(原 ApplyAdagradDAD)改名保持一致的命名风格,统一用 Inplace 前缀标识 inplace 语义算子。本次为纯算子改名,代码逻辑零改动,继续对标 CANNDEV ApplyAdagradV2D(2 输出 inplace 语义)。 命名转换闭环验证(CANN _camel_to_snake + 测试框架 str.title()): - _camel_to_snake("InplaceApplyAdagradV2") = inplace_apply_adagrad_v2 ← 与目录名一致 - str.title("inplace_apply_adagrad_v2") = InplaceApplyAdagradV2 ← 与 OpType 一致 两个转换算法均能正确闭环,末尾 V2(数字结尾)比原 V2D(数字+字母拆分陷阱)更安全,无 _camel_to_snake 数字拆分风险。 改动范围: - 目录 apply_adagrad_v2d/ → inplace_apply_adagrad_v2/(git mv,保留 history,similarity 73%~100%) - 11 个源文件改名(proto.h / def.cpp / infershape.cpp / tiling_arch35.cpp / kernel .cpp/.h / tiling_data.h / tiling_key.h / examples / 2 个 UT) - 4 类符号全局替换: - ApplyAdagradV2D → InplaceApplyAdagradV2(OpType/类名/命名空间/aclnn 接口,~84 处) - apply_adagrad_v2d → inplace_apply_adagrad_v2(snake_case 目录名/kernel_name,~26 处) - APPLY_ADAGRAD_V2D → INPLACE_APPLY_ADAGRAD_V2(宏名/include guard,~15 处) - NsApplyAdagradV2D → NsInplaceApplyAdagradV2(命名空间前缀,3 处) - 全局文件 docs/zh/op_list.md 算子条目更新 - 保留 CANNDEV 对标声明(README/proto.h 中"对标 CANNDEV ApplyAdagradV2D"保持不变,CANNDEV 标准名不随本仓改名而变) <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> https://gitcode.com/cann/ops-nn/issues/4214 ## 测试 <!--描述进行了哪些测试来验证你的改动。--> 在 Ascend950DT_9582(arch35 / DAV_3510)平台完成全通路验证,CANN 9.2.0 + TTK e559b7f: | 验证项 | 用例数 | 结果 | 说明 | |--------|--------|------|------| | 编译验证 | — | ✅ SUCCESS | kernel binary InplaceApplyAdagradV2_*.o 正常生成 | | op_info 注册 | — | ✅ 正确 | aic-ascend950-ops-info.json 中算子名为 InplaceApplyAdagradV2 | | binary config | — | ✅ 正确 | simplifiedKey 为 InplaceApplyAdagradV2/... | | TTK kernel | 208 | ✅ 208/208 PASS | 双千双万精度标准(0.001, 0.001) | | TTK aclnn | 208 | ✅ 208/208 PASS | --proc-no-reuse 防 epsilon 缓存碰撞 | | GE IR example | 1 | ✅ PASS | Run graph success + 2 输出 (DT_FLOAT) + Finalize success | | Torch 通路 | 1 | ✅ PASS | torch.optim.Adagrad 3 步训练 loss 下降(2.091 → 1.404) | 验证结论:改名前后代码逻辑零改动,纯命名变更。 ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> - docs/zh/op_list.md:apply_adagrad_v2d → inplace_apply_adagrad_v2 条目更新 - README.md:算子名更新,保留 CANNDEV 对标声明 ## 类型标签 <!-- [x] 表示选中 --> - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [x] AI辅助编写 See merge request: cann/ops-nn!7776 | 2 个月前 | |
[CANNBot]新增InplaceApplyCenteredRMSProp算子支持Ascend950 Co-authored-by: chen_chenn<chenchen167@huawei.com> # message auto-generated for no-merge-commit merge: !7834 merge InplaceApplyCenteredRMSProp into master [CANNBot]新增InplaceApplyCenteredRMSProp算子支持Ascend950 Created-by: chen_chenn Commit-by: chen_chenn Merged-by: cann-robot Description: ## 描述 新增InplaceApplyCenteredRMSProp算子支持Ascend950 ## 关联的Issue https://gitcode.com/cann/ops-nn/issues/4247 ## 测试 TTK obp冒烟:23670 david冒烟:7898 ## 文档更新 ## 类型标签 - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 - [x] AI辅助编写 See merge request: cann/ops-nn!7834 | 2 个月前 | |
fix: inplace_apply_keras_momentum/lp_norm_update 属性标记为 OPTIONAL 与 REG_OP 行为对齐 Co-authored-by: Davon14272<liuwenda4@huawei.com> # message auto-generated for no-merge-commit merge: !8161 merge proto into master fix: inplace_apply_keras_momentum/lp_norm_update 属性标记为 OPTIONAL 与 REG_OP 行为对齐 Created-by: Davon14272 Commit-by: Davon14272 Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> 将inplace_apply_keras_momentum/lp_norm_update 算子的kernel定义文件与proto文件中的属性定义不一致,需要和proto文件对齐,改为可选属性 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> [#4498](https://gitcode.com/cann/ops-nn/issues/4498) ## 测试 <!--描述进行了哪些测试来验证你的改动。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [ ] AI辅助编写 See merge request: cann/ops-nn!8161 | 1 个月前 | |
feat: InplaceApplyMomentum is supported on Ascend950 Co-authored-by: niukang_hw<niukang1@huawei.com> # message auto-generated for no-merge-commit merge: !7992 merge dev_inplace_apply_momentum into master feat: InplaceApplyMomentum is supported on Ascend950 Created-by: niukang_hw Commit-by: niukang_hw Merged-by: cann-robot Description: ## 描述 - 算子功能: 根据动量方案更新变量"var"。若设置use_nesterov=True,则使用Nesterov动量。 - 计算公式: $$ accum = accum \times momentum + grad $$ - 若use_nesterov = True: $$ var = var - (grad \times lr + accum \times momentum \times lr) $$ - 若use_nesterov = False: $$ var = var - lr \times accum $$ ## 关联的Issue https://gitcode.com/cann/ops-nn/issues/4361 ## 测试 | 数据类型 | 精度标准 (rtol/atol) | 用例数 | 通过 | 失败 | 通过率 | | -------- | -------------------- | ------ | ---- | ---- | ------ | | FP32 | 1e-4 / 1e-4 | 88 | 88 | 0 | 100% | | FP16 | 1e-3 / 1e-3 | 61 | 61 | 0 | 100% | | BF16 | 4e-3 / 4e-3 | 48 | 48 | 0 | 100% | | 合计 | — | 197 | 197 | 0 | 100% | ## 文档更新 新增 optim/fused_mul_apply_momentum_extern/README.md ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [x] AI辅助编写 See merge request: cann/ops-nn!7992 | 2 个月前 | |
feat: InplaceApplyPowerSign is supported on Ascend950 Co-authored-by: niukang_hw<niukang1@huawei.com> # message auto-generated for no-merge-commit merge: !7409 merge dev_inplace_apply_power_sign into master feat: InplaceApplyPowerSign is supported on Ascend950 Created-by: niukang_hw Commit-by: niukang_hw Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> 新增 InplaceApplyPowerSign 算子到 ops-nn/optim/ 目录,实现 PowerSign 优化器的核心参数更新功能。 ### 算子功能 InplaceApplyPowerSign 是 PowerSign 优化器(源自论文 "Dissecting Adam", ICML 2018)的参数更新算子,将 Adam 的更新机制显式解耦为"方向"(sign(m))和"幅度"(指数因子),实现不依赖二阶矩的自适应学习率方案。核心公式: m_new = beta * m + (1 - beta) * grad sign_gm = sign(m_new) * sign(grad) var_out = var - lr * exp(logbase * sign_decay * sign_gm) * grad ### 支持规格 芯片平台: Ascend 950PR/950DT 支持规格: float16 , bfloat16, float32 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> ## 测试 <!--描述进行了哪些测试来验证你的改动。--> ### 1、UT 测试 ophost tiling:PASS ophost infershape :PASS opkernel: PASS ### 2、通路验证(E2E) GE IR 通路:PASS ### 3、白盒测试(TTK Kernel 模式 + 双千双万精度标准) | 数据类型 | 精度标准 (rtol/atol) | 用例数 | 通过 | 失败 | 通过率 | | -------- | -------------------- | ------ | ---- | ---- | ------ | | FP32 | 1e-4 / 1e-4 | 88 | 88 | 0 | 100% | | FP16 | 1e-3 / 1e-3 | 61 | 61 | 0 | 100% | | BF16 | 4e-3 / 4e-3 | 48 | 48 | 0 | 100% | | 合计 | — | 197 | 197 | 0 | 100% | ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> 新增 optim/apply_power_sign/README.md:算子功能说明、计算公式、参数说明、产品支持情况、性能摘要 ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-nn!7409 | 2 个月前 | |
foreach/lamb/scatter类部分算子补齐A5输入校验和资料说明 Co-authored-by: tangpingchuan<tangpingchuan@huawei.com> # message auto-generated for no-merge-commit merge: !7419 merge master into master foreach/lamb/scatter类部分算子补齐A5输入校验和资料说明 Created-by: zl_hw Commit-by: tangpingchuan Merged-by: cann-robot Description: ## 描述 foreach/lamb/scatter类部分算子资料描述不清晰,补齐A5输入校验和资料说明 ## 关联的Issue https://gitcode.com/cann/ops-nn/issues/4075 ## 测试 不涉及 ## 文档更新 foreach/lamb/scatter类部分算子README文件 ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [x] AI辅助编写 See merge request: cann/ops-nn!7419 | 2 个月前 | |
fix: 补齐 4 算子 ascend950 binary.json 注册配置,修正 GroupNormSiluQuant 动态 rank 推导与 23 个算子 golden 参照失真 Co-authored-by: tangpingchuan<tangpingchuan@huawei.com> # message auto-generated for no-merge-commit merge: !8112 merge fix/op-binary-json-missing into master fix: 补齐 4 算子 ascend950 binary.json 注册配置,修正 GroupNormSiluQuant 动态 rank 推导与 23 个算子 golden 参照失真 Created-by: zl_hw Commit-by: tangpingchuan Merged-by: cann-robot Description: ## 描述 本 PR 修复三类「已声明的能力与实际产物不一致」的缺陷:注册配置缺失、动态 rank 推导缺失、测试参照(golden)与算子实现不一致。 ### 一、4 个算子在 ascend950 上缺失 binary.json 注册配置 NonZeroWithValue、MultilabelMarginLoss、PoissonNllLoss、MultiAddRmsNormDynamicQuant 的 *_def.cpp 均已执行 this->AICore().AddConfig("ascend950", ...),但 op_host/config/ascend950/*_binary.json 缺失(前 3 个算子 op_host/config/ 目录整体为空,MultiAddRmsNormDynamicQuant 仅有 ascend910b/、ascend910_93/)。 **改动原因**(依据仓库构建脚本,非推断): - cmake/custom_kernel.cmake:17-23:add_custom_kernel_library 以 if(EXISTS ${binary_json}) 为进入门槛,配置缺失时该算子被整体 continue 跳过,ascend950 kernel 不进入编译与打包; - cmake/func.cmake:656-666:拿不到 binary.json 时退化为 get_op_type_from_op_name 按算子名推断 op_type; - cmake/ut.cmake:459-476:numFiles EQUAL 0 分支同样退化为「下划线切分 + 首字母大写」推断 opType,与 OP_ADD() 注册的真实 op_type 不再有强绑定。 **改动方法**:逐算子按其 _def.cpp 的 DataType / Format 注册列表对齐补齐配置文件,bin 数与 dtype 组合严格一一对应: | 算子 | 新增配置文件 | bin 数 | dtype 组合依据 | |------|-------------|:------:|---------------| | NonZeroWithValue | index/non_zero_with_value/op_host/config/ascend950/non_zero_with_value_binary.json | 12 | non_zero_with_value_def.cpp 中 xDataType 的 12 类:double / float / float16 / int8 / uint8 / int16 / uint16 / int32 / uint32 / int64 / uint64 / bool;value 跟随 x,index / count 恒 int32(与 indexDataType、countDataType 一致)。attr:transpose(bool) / dtype(int) | | MultilabelMarginLoss | loss/multilabel_margin_loss/op_host/config/ascend950/multilabel_margin_loss_binary.json | 6 | multilabel_margin_loss_def.cpp 中 ascend950 独立的 regbaseConfig(xy6 / tgt6 / ist6):x、y ∈ {float32, float16, bfloat16},is_target 前 3 组保持 GE 原型的 int32、后 3 组跟随 self(对应 _v2 后缀 bin) | | PoissonNllLoss | loss/poisson_nll_loss/op_host/config/ascend950/poisson_nll_loss_binary.json | 2 | poisson_nll_loss_def.cpp 中 {DT_FLOAT16, DT_FLOAT};attr:log_input(true) / full(false) / eps(1e-8) / reduction("mean") | | MultiAddRmsNormDynamicQuant | norm/multi_add_rms_norm_dynamic_quant/op_host/config/ascend950/multi_add_rms_norm_dynamic_quant_binary.json | 2 | float16 / bfloat16 两组;x1 为 dynamic 输入,smooth_scale1 / smooth_scale2 为 optional,输出 y1/y2 int8、x/y 跟随输入、scale1/scale2 float32;optional_input_mode: gen_placeholder 与同算子既有 ascend910b / ascend910_93 配置保持一致 | ### 二、GroupNormSiluQuant:补齐 -2 动态 rank 推导,资料补空 Tensor 支持声明 **改动原因**:group_norm_silu_quant_def.cpp:67 的 ascend950 config_regbase 已声明 DynamicRankSupportFlag(true),但 group_norm_silu_quant_infershape.cpp 中无对应分支。x 为 UNKNOWN_RANK(-2)时,x_shape->GetDim(0) 取到的是 -2 这个标记值本身,mean / rstd 被推成非法的 (-2, num_groups)。 **改动方法**: - op_host/group_norm_silu_quant_infershape.cpp:引入 util/shape_util.h,在取 num_groups 之前插入 Ops::Base::IsUnknownRank(*x_shape) 判断,命中则对 y / mean / rstd 三个输出统一 Ops::Base::SetUnknownRank() 后直接返回 GRAPH_SUCCESS。 - tests/ut/op_host/arch35/test_group_norm_silu_quant_infershape.cpp:新增 2 个用例。 - infershape_unknown_rank_x:x = {-2},断言三个输出均为 {-2}; - infershape_empty_tensor_each_axis:逐轴各一例(N 轴 {0,320,16,16}、C 轴 {4,0,16,16}、HW 轴 {4,320,0,16}),断言 y 与 x 同形、mean/rstd 为 (dims[0], 32)。 ### 三、23 个算子 golden.py 改用竞品 torch 算子拼接,并修正与算子实现不一致之处 **改动原因**:golden 红线 R3 要求 golden 只能由「竞品接口实现」或「竞品算子拼接实现」,禁止 numpy 纯公式——纯公式与被测 kernel 容易犯同一类错误,用与 kernel 一样有损的参照去比对,会把精度短板伪装成达标。 **改动方法**:23 个 tests/assets/golden.py 中,21 个新增 import torch 并改为 torch 张量算子拼接(numpy 仅保留 I/O 与 dtype 转换);foreach_a_cos_inplace、foreach_log_inplace 原本已是 torch 实现,本次仅做内存优化。除改用 torch 外,同步修正了以下与算子实现不一致之处(均为参照失真,会掩盖或误报 kernel 问题): - **标量一律落在 float32**:Python float 是 fp64,标量运算会把整条链路抬到双精度,而算子在 fp32 上算(A2 的 TBE compute 里 dtype='float32',arch35 DAG 计算类型 U = float)。 - **foreach_addcmul_list 整数分支**:改用未经 float32 抹位的原始整数标量——1564714939 过一道 fp32 会变成 1564714880。 - **foreach_addcmul_list 三因子结合序**:改为 (x2*x3) 先乘、再乘标量。数学上乘积与结合序无关,但 fp32 中间量下不等价:scalars 取极值(如 3.35e38)时 (x2*scalars) 先冲破 fp32 上限变成 inf,而 x2*x3 为小量、再乘 scalars 并不溢出。 - **lamb_update_with_lr 的 clip**:改用 torch.minimum / torch.maximum——内核走 Vec::Min / Vec::Max 硬件指令、传播 NaN,而 Python 内置 min/max 是比较语义、会静默丢弃 NaN。 - **lamb_apply_weight_assign 运算序列**:改为 ratio*(update*lr),与 A2 的 vmul(update,lr) 再 vmul(ratio,·) 及 arch35 DAG 一致;README.md 公式同步加括号标明结合顺序(原写法在 update 与 lr 同时较大时会先溢出成 inf)。 - **lamb_apply_weight_assign / foreach_addcdiv_list 的除法**:补 Subnormal 归零。A2 的 Div 无 config 参数、只有单指令一条路,arch35 默认 DivAlgo::INTRINSIC 亦对 Subnormal 做 FTZ;golden 在 CPU 上默认保留 Subnormal 会给出算子不会产出的值。 - **lamb_apply_optimizer_assign 偏差校正**:改用 exp(log(b)*steps),与 arch35 DAG 的 Log / Mul / Exp 三条指令一致,不再用 Python 幂运算。 - **scatter_list 散射写入**:按平坦偏移下发,不使用 Tensor.index_copy_。算子把 indice 直接当线性偏移用、不做边界检查也无负索引回绕语义(README「indice值域:不支持索引越界」),而 index_copy_ 只接受 [0, axis_size) 的索引、遇负索引直接抛异常中断整轮用例;原 numpy 花式索引则会把 [-size,-1] 静默回绕到尾部,给出算子不会产出的结果。同时工作 dtype 改用原生 dtype 而非一律转 float32:ScatterList 是纯拷贝算子、输出应与输入逐位相同,而 def 注册了 DT_INT32 / DT_INT64,fp32 尾数只有 24 位装不下 2^30 量级整数(实测 2^30+100 经 float32 中转变成 2^30+128,静默丢 28);仅 bfloat16 因 numpy 无原生类型走 fp32 桥接(拷贝无损)。 - **group_norm_silu_quant 刻意不用 F.group_norm**:该层级 API 带 BN 系列的训练态保护(Expected more than 1 value per channel when training),每通道只剩 1 个元素时直接拒收(2 维输入 (N,C) 且 group=C 即触发,实测 case00608 崩),而算子本身 elemNum=1 合法。改用 torch.var_mean / torch.rsqrt / torch.addcmul / F.silu / torch.round+torch.clamp 拼接,语义等价且不带该限制,同样满足红线 R3。 - **foreach 系 fp32 提升不再无谓复制缓冲**:astype(np.float32, copy=False)。单份 GB 级的大用例(32 张量、5.37 亿元素)无谓复制会把进程推向 OOM;下游 torch 算子均非原地、不改写输入,复用安全。 ## 关联的Issue 关联Issue #4483 https://gitcode.com/cann/ops-nn/issues/4483 ## 测试 - **新增 UT**:norm/group_norm_silu_quant/tests/ut/op_host/arch35/test_group_norm_silu_quant_infershape.cpp 新增 infershape_unknown_rank_x、infershape_empty_tensor_each_axis 两个用例,覆盖 -2 动态 rank 与 N/C/HW 三个轴各自为 0 的空 Tensor 场景。 - **golden 回归**:23 个算子的 tests/assets/golden.py 变更由各自 TTK 用例集回归验证。作者记录:foreach_addcmul_list 修正三因子结合序后,此前因 fp32 中间量溢出成 inf 而失败的 bf16 用例集(8192 个元素中 7361 个 |x2*scalars| 超 fp32 上限)达到 100/100 通过。 - **binary.json**:4 份新增配置的 bin 数与 dtype / format / attr 组合均与对应 _def.cpp 的注册列表逐项核对一致(12 / 6 / 2 / 2)。 ## 文档更新 - norm/group_norm_silu_quant/README.md、norm/group_norm_silu_quant/docs/aclnnGroupNormSiluQuant.md:self 参数的约束列由 - 补充为「支持空Tensor(任意维度为0)。此时out为空,meanOut填充为0,rstdOut填充为NAN。」 - optim/lamb_apply_weight_assign/README.md:计算公式由 $input\_param - input2 \times ratio \times input3$ 改为 $input\_param - ratio \times (input3 \times input2)$,加括号标明与算子实现一致的结合顺序。 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 - [x] AI辅助编写 See merge request: cann/ops-nn!8112 | 2 个月前 | |
fix: 补齐 4 算子 ascend950 binary.json 注册配置,修正 GroupNormSiluQuant 动态 rank 推导与 23 个算子 golden 参照失真 Co-authored-by: tangpingchuan<tangpingchuan@huawei.com> # message auto-generated for no-merge-commit merge: !8112 merge fix/op-binary-json-missing into master fix: 补齐 4 算子 ascend950 binary.json 注册配置,修正 GroupNormSiluQuant 动态 rank 推导与 23 个算子 golden 参照失真 Created-by: zl_hw Commit-by: tangpingchuan Merged-by: cann-robot Description: ## 描述 本 PR 修复三类「已声明的能力与实际产物不一致」的缺陷:注册配置缺失、动态 rank 推导缺失、测试参照(golden)与算子实现不一致。 ### 一、4 个算子在 ascend950 上缺失 binary.json 注册配置 NonZeroWithValue、MultilabelMarginLoss、PoissonNllLoss、MultiAddRmsNormDynamicQuant 的 *_def.cpp 均已执行 this->AICore().AddConfig("ascend950", ...),但 op_host/config/ascend950/*_binary.json 缺失(前 3 个算子 op_host/config/ 目录整体为空,MultiAddRmsNormDynamicQuant 仅有 ascend910b/、ascend910_93/)。 **改动原因**(依据仓库构建脚本,非推断): - cmake/custom_kernel.cmake:17-23:add_custom_kernel_library 以 if(EXISTS ${binary_json}) 为进入门槛,配置缺失时该算子被整体 continue 跳过,ascend950 kernel 不进入编译与打包; - cmake/func.cmake:656-666:拿不到 binary.json 时退化为 get_op_type_from_op_name 按算子名推断 op_type; - cmake/ut.cmake:459-476:numFiles EQUAL 0 分支同样退化为「下划线切分 + 首字母大写」推断 opType,与 OP_ADD() 注册的真实 op_type 不再有强绑定。 **改动方法**:逐算子按其 _def.cpp 的 DataType / Format 注册列表对齐补齐配置文件,bin 数与 dtype 组合严格一一对应: | 算子 | 新增配置文件 | bin 数 | dtype 组合依据 | |------|-------------|:------:|---------------| | NonZeroWithValue | index/non_zero_with_value/op_host/config/ascend950/non_zero_with_value_binary.json | 12 | non_zero_with_value_def.cpp 中 xDataType 的 12 类:double / float / float16 / int8 / uint8 / int16 / uint16 / int32 / uint32 / int64 / uint64 / bool;value 跟随 x,index / count 恒 int32(与 indexDataType、countDataType 一致)。attr:transpose(bool) / dtype(int) | | MultilabelMarginLoss | loss/multilabel_margin_loss/op_host/config/ascend950/multilabel_margin_loss_binary.json | 6 | multilabel_margin_loss_def.cpp 中 ascend950 独立的 regbaseConfig(xy6 / tgt6 / ist6):x、y ∈ {float32, float16, bfloat16},is_target 前 3 组保持 GE 原型的 int32、后 3 组跟随 self(对应 _v2 后缀 bin) | | PoissonNllLoss | loss/poisson_nll_loss/op_host/config/ascend950/poisson_nll_loss_binary.json | 2 | poisson_nll_loss_def.cpp 中 {DT_FLOAT16, DT_FLOAT};attr:log_input(true) / full(false) / eps(1e-8) / reduction("mean") | | MultiAddRmsNormDynamicQuant | norm/multi_add_rms_norm_dynamic_quant/op_host/config/ascend950/multi_add_rms_norm_dynamic_quant_binary.json | 2 | float16 / bfloat16 两组;x1 为 dynamic 输入,smooth_scale1 / smooth_scale2 为 optional,输出 y1/y2 int8、x/y 跟随输入、scale1/scale2 float32;optional_input_mode: gen_placeholder 与同算子既有 ascend910b / ascend910_93 配置保持一致 | ### 二、GroupNormSiluQuant:补齐 -2 动态 rank 推导,资料补空 Tensor 支持声明 **改动原因**:group_norm_silu_quant_def.cpp:67 的 ascend950 config_regbase 已声明 DynamicRankSupportFlag(true),但 group_norm_silu_quant_infershape.cpp 中无对应分支。x 为 UNKNOWN_RANK(-2)时,x_shape->GetDim(0) 取到的是 -2 这个标记值本身,mean / rstd 被推成非法的 (-2, num_groups)。 **改动方法**: - op_host/group_norm_silu_quant_infershape.cpp:引入 util/shape_util.h,在取 num_groups 之前插入 Ops::Base::IsUnknownRank(*x_shape) 判断,命中则对 y / mean / rstd 三个输出统一 Ops::Base::SetUnknownRank() 后直接返回 GRAPH_SUCCESS。 - tests/ut/op_host/arch35/test_group_norm_silu_quant_infershape.cpp:新增 2 个用例。 - infershape_unknown_rank_x:x = {-2},断言三个输出均为 {-2}; - infershape_empty_tensor_each_axis:逐轴各一例(N 轴 {0,320,16,16}、C 轴 {4,0,16,16}、HW 轴 {4,320,0,16}),断言 y 与 x 同形、mean/rstd 为 (dims[0], 32)。 ### 三、23 个算子 golden.py 改用竞品 torch 算子拼接,并修正与算子实现不一致之处 **改动原因**:golden 红线 R3 要求 golden 只能由「竞品接口实现」或「竞品算子拼接实现」,禁止 numpy 纯公式——纯公式与被测 kernel 容易犯同一类错误,用与 kernel 一样有损的参照去比对,会把精度短板伪装成达标。 **改动方法**:23 个 tests/assets/golden.py 中,21 个新增 import torch 并改为 torch 张量算子拼接(numpy 仅保留 I/O 与 dtype 转换);foreach_a_cos_inplace、foreach_log_inplace 原本已是 torch 实现,本次仅做内存优化。除改用 torch 外,同步修正了以下与算子实现不一致之处(均为参照失真,会掩盖或误报 kernel 问题): - **标量一律落在 float32**:Python float 是 fp64,标量运算会把整条链路抬到双精度,而算子在 fp32 上算(A2 的 TBE compute 里 dtype='float32',arch35 DAG 计算类型 U = float)。 - **foreach_addcmul_list 整数分支**:改用未经 float32 抹位的原始整数标量——1564714939 过一道 fp32 会变成 1564714880。 - **foreach_addcmul_list 三因子结合序**:改为 (x2*x3) 先乘、再乘标量。数学上乘积与结合序无关,但 fp32 中间量下不等价:scalars 取极值(如 3.35e38)时 (x2*scalars) 先冲破 fp32 上限变成 inf,而 x2*x3 为小量、再乘 scalars 并不溢出。 - **lamb_update_with_lr 的 clip**:改用 torch.minimum / torch.maximum——内核走 Vec::Min / Vec::Max 硬件指令、传播 NaN,而 Python 内置 min/max 是比较语义、会静默丢弃 NaN。 - **lamb_apply_weight_assign 运算序列**:改为 ratio*(update*lr),与 A2 的 vmul(update,lr) 再 vmul(ratio,·) 及 arch35 DAG 一致;README.md 公式同步加括号标明结合顺序(原写法在 update 与 lr 同时较大时会先溢出成 inf)。 - **lamb_apply_weight_assign / foreach_addcdiv_list 的除法**:补 Subnormal 归零。A2 的 Div 无 config 参数、只有单指令一条路,arch35 默认 DivAlgo::INTRINSIC 亦对 Subnormal 做 FTZ;golden 在 CPU 上默认保留 Subnormal 会给出算子不会产出的值。 - **lamb_apply_optimizer_assign 偏差校正**:改用 exp(log(b)*steps),与 arch35 DAG 的 Log / Mul / Exp 三条指令一致,不再用 Python 幂运算。 - **scatter_list 散射写入**:按平坦偏移下发,不使用 Tensor.index_copy_。算子把 indice 直接当线性偏移用、不做边界检查也无负索引回绕语义(README「indice值域:不支持索引越界」),而 index_copy_ 只接受 [0, axis_size) 的索引、遇负索引直接抛异常中断整轮用例;原 numpy 花式索引则会把 [-size,-1] 静默回绕到尾部,给出算子不会产出的结果。同时工作 dtype 改用原生 dtype 而非一律转 float32:ScatterList 是纯拷贝算子、输出应与输入逐位相同,而 def 注册了 DT_INT32 / DT_INT64,fp32 尾数只有 24 位装不下 2^30 量级整数(实测 2^30+100 经 float32 中转变成 2^30+128,静默丢 28);仅 bfloat16 因 numpy 无原生类型走 fp32 桥接(拷贝无损)。 - **group_norm_silu_quant 刻意不用 F.group_norm**:该层级 API 带 BN 系列的训练态保护(Expected more than 1 value per channel when training),每通道只剩 1 个元素时直接拒收(2 维输入 (N,C) 且 group=C 即触发,实测 case00608 崩),而算子本身 elemNum=1 合法。改用 torch.var_mean / torch.rsqrt / torch.addcmul / F.silu / torch.round+torch.clamp 拼接,语义等价且不带该限制,同样满足红线 R3。 - **foreach 系 fp32 提升不再无谓复制缓冲**:astype(np.float32, copy=False)。单份 GB 级的大用例(32 张量、5.37 亿元素)无谓复制会把进程推向 OOM;下游 torch 算子均非原地、不改写输入,复用安全。 ## 关联的Issue 关联Issue #4483 https://gitcode.com/cann/ops-nn/issues/4483 ## 测试 - **新增 UT**:norm/group_norm_silu_quant/tests/ut/op_host/arch35/test_group_norm_silu_quant_infershape.cpp 新增 infershape_unknown_rank_x、infershape_empty_tensor_each_axis 两个用例,覆盖 -2 动态 rank 与 N/C/HW 三个轴各自为 0 的空 Tensor 场景。 - **golden 回归**:23 个算子的 tests/assets/golden.py 变更由各自 TTK 用例集回归验证。作者记录:foreach_addcmul_list 修正三因子结合序后,此前因 fp32 中间量溢出成 inf 而失败的 bf16 用例集(8192 个元素中 7361 个 |x2*scalars| 超 fp32 上限)达到 100/100 通过。 - **binary.json**:4 份新增配置的 bin 数与 dtype / format / attr 组合均与对应 _def.cpp 的注册列表逐项核对一致(12 / 6 / 2 / 2)。 ## 文档更新 - norm/group_norm_silu_quant/README.md、norm/group_norm_silu_quant/docs/aclnnGroupNormSiluQuant.md:self 参数的约束列由 - 补充为「支持空Tensor(任意维度为0)。此时out为空,meanOut填充为0,rstdOut填充为NAN。」 - optim/lamb_apply_weight_assign/README.md:计算公式由 $input\_param - input2 \times ratio \times input3$ 改为 $input\_param - ratio \times (input3 \times input2)$,加括号标明与算子实现一致的结合顺序。 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 - [x] AI辅助编写 See merge request: cann/ops-nn!8112 | 2 个月前 | |
fix: 补齐 4 算子 ascend950 binary.json 注册配置,修正 GroupNormSiluQuant 动态 rank 推导与 23 个算子 golden 参照失真 Co-authored-by: tangpingchuan<tangpingchuan@huawei.com> # message auto-generated for no-merge-commit merge: !8112 merge fix/op-binary-json-missing into master fix: 补齐 4 算子 ascend950 binary.json 注册配置,修正 GroupNormSiluQuant 动态 rank 推导与 23 个算子 golden 参照失真 Created-by: zl_hw Commit-by: tangpingchuan Merged-by: cann-robot Description: ## 描述 本 PR 修复三类「已声明的能力与实际产物不一致」的缺陷:注册配置缺失、动态 rank 推导缺失、测试参照(golden)与算子实现不一致。 ### 一、4 个算子在 ascend950 上缺失 binary.json 注册配置 NonZeroWithValue、MultilabelMarginLoss、PoissonNllLoss、MultiAddRmsNormDynamicQuant 的 *_def.cpp 均已执行 this->AICore().AddConfig("ascend950", ...),但 op_host/config/ascend950/*_binary.json 缺失(前 3 个算子 op_host/config/ 目录整体为空,MultiAddRmsNormDynamicQuant 仅有 ascend910b/、ascend910_93/)。 **改动原因**(依据仓库构建脚本,非推断): - cmake/custom_kernel.cmake:17-23:add_custom_kernel_library 以 if(EXISTS ${binary_json}) 为进入门槛,配置缺失时该算子被整体 continue 跳过,ascend950 kernel 不进入编译与打包; - cmake/func.cmake:656-666:拿不到 binary.json 时退化为 get_op_type_from_op_name 按算子名推断 op_type; - cmake/ut.cmake:459-476:numFiles EQUAL 0 分支同样退化为「下划线切分 + 首字母大写」推断 opType,与 OP_ADD() 注册的真实 op_type 不再有强绑定。 **改动方法**:逐算子按其 _def.cpp 的 DataType / Format 注册列表对齐补齐配置文件,bin 数与 dtype 组合严格一一对应: | 算子 | 新增配置文件 | bin 数 | dtype 组合依据 | |------|-------------|:------:|---------------| | NonZeroWithValue | index/non_zero_with_value/op_host/config/ascend950/non_zero_with_value_binary.json | 12 | non_zero_with_value_def.cpp 中 xDataType 的 12 类:double / float / float16 / int8 / uint8 / int16 / uint16 / int32 / uint32 / int64 / uint64 / bool;value 跟随 x,index / count 恒 int32(与 indexDataType、countDataType 一致)。attr:transpose(bool) / dtype(int) | | MultilabelMarginLoss | loss/multilabel_margin_loss/op_host/config/ascend950/multilabel_margin_loss_binary.json | 6 | multilabel_margin_loss_def.cpp 中 ascend950 独立的 regbaseConfig(xy6 / tgt6 / ist6):x、y ∈ {float32, float16, bfloat16},is_target 前 3 组保持 GE 原型的 int32、后 3 组跟随 self(对应 _v2 后缀 bin) | | PoissonNllLoss | loss/poisson_nll_loss/op_host/config/ascend950/poisson_nll_loss_binary.json | 2 | poisson_nll_loss_def.cpp 中 {DT_FLOAT16, DT_FLOAT};attr:log_input(true) / full(false) / eps(1e-8) / reduction("mean") | | MultiAddRmsNormDynamicQuant | norm/multi_add_rms_norm_dynamic_quant/op_host/config/ascend950/multi_add_rms_norm_dynamic_quant_binary.json | 2 | float16 / bfloat16 两组;x1 为 dynamic 输入,smooth_scale1 / smooth_scale2 为 optional,输出 y1/y2 int8、x/y 跟随输入、scale1/scale2 float32;optional_input_mode: gen_placeholder 与同算子既有 ascend910b / ascend910_93 配置保持一致 | ### 二、GroupNormSiluQuant:补齐 -2 动态 rank 推导,资料补空 Tensor 支持声明 **改动原因**:group_norm_silu_quant_def.cpp:67 的 ascend950 config_regbase 已声明 DynamicRankSupportFlag(true),但 group_norm_silu_quant_infershape.cpp 中无对应分支。x 为 UNKNOWN_RANK(-2)时,x_shape->GetDim(0) 取到的是 -2 这个标记值本身,mean / rstd 被推成非法的 (-2, num_groups)。 **改动方法**: - op_host/group_norm_silu_quant_infershape.cpp:引入 util/shape_util.h,在取 num_groups 之前插入 Ops::Base::IsUnknownRank(*x_shape) 判断,命中则对 y / mean / rstd 三个输出统一 Ops::Base::SetUnknownRank() 后直接返回 GRAPH_SUCCESS。 - tests/ut/op_host/arch35/test_group_norm_silu_quant_infershape.cpp:新增 2 个用例。 - infershape_unknown_rank_x:x = {-2},断言三个输出均为 {-2}; - infershape_empty_tensor_each_axis:逐轴各一例(N 轴 {0,320,16,16}、C 轴 {4,0,16,16}、HW 轴 {4,320,0,16}),断言 y 与 x 同形、mean/rstd 为 (dims[0], 32)。 ### 三、23 个算子 golden.py 改用竞品 torch 算子拼接,并修正与算子实现不一致之处 **改动原因**:golden 红线 R3 要求 golden 只能由「竞品接口实现」或「竞品算子拼接实现」,禁止 numpy 纯公式——纯公式与被测 kernel 容易犯同一类错误,用与 kernel 一样有损的参照去比对,会把精度短板伪装成达标。 **改动方法**:23 个 tests/assets/golden.py 中,21 个新增 import torch 并改为 torch 张量算子拼接(numpy 仅保留 I/O 与 dtype 转换);foreach_a_cos_inplace、foreach_log_inplace 原本已是 torch 实现,本次仅做内存优化。除改用 torch 外,同步修正了以下与算子实现不一致之处(均为参照失真,会掩盖或误报 kernel 问题): - **标量一律落在 float32**:Python float 是 fp64,标量运算会把整条链路抬到双精度,而算子在 fp32 上算(A2 的 TBE compute 里 dtype='float32',arch35 DAG 计算类型 U = float)。 - **foreach_addcmul_list 整数分支**:改用未经 float32 抹位的原始整数标量——1564714939 过一道 fp32 会变成 1564714880。 - **foreach_addcmul_list 三因子结合序**:改为 (x2*x3) 先乘、再乘标量。数学上乘积与结合序无关,但 fp32 中间量下不等价:scalars 取极值(如 3.35e38)时 (x2*scalars) 先冲破 fp32 上限变成 inf,而 x2*x3 为小量、再乘 scalars 并不溢出。 - **lamb_update_with_lr 的 clip**:改用 torch.minimum / torch.maximum——内核走 Vec::Min / Vec::Max 硬件指令、传播 NaN,而 Python 内置 min/max 是比较语义、会静默丢弃 NaN。 - **lamb_apply_weight_assign 运算序列**:改为 ratio*(update*lr),与 A2 的 vmul(update,lr) 再 vmul(ratio,·) 及 arch35 DAG 一致;README.md 公式同步加括号标明结合顺序(原写法在 update 与 lr 同时较大时会先溢出成 inf)。 - **lamb_apply_weight_assign / foreach_addcdiv_list 的除法**:补 Subnormal 归零。A2 的 Div 无 config 参数、只有单指令一条路,arch35 默认 DivAlgo::INTRINSIC 亦对 Subnormal 做 FTZ;golden 在 CPU 上默认保留 Subnormal 会给出算子不会产出的值。 - **lamb_apply_optimizer_assign 偏差校正**:改用 exp(log(b)*steps),与 arch35 DAG 的 Log / Mul / Exp 三条指令一致,不再用 Python 幂运算。 - **scatter_list 散射写入**:按平坦偏移下发,不使用 Tensor.index_copy_。算子把 indice 直接当线性偏移用、不做边界检查也无负索引回绕语义(README「indice值域:不支持索引越界」),而 index_copy_ 只接受 [0, axis_size) 的索引、遇负索引直接抛异常中断整轮用例;原 numpy 花式索引则会把 [-size,-1] 静默回绕到尾部,给出算子不会产出的结果。同时工作 dtype 改用原生 dtype 而非一律转 float32:ScatterList 是纯拷贝算子、输出应与输入逐位相同,而 def 注册了 DT_INT32 / DT_INT64,fp32 尾数只有 24 位装不下 2^30 量级整数(实测 2^30+100 经 float32 中转变成 2^30+128,静默丢 28);仅 bfloat16 因 numpy 无原生类型走 fp32 桥接(拷贝无损)。 - **group_norm_silu_quant 刻意不用 F.group_norm**:该层级 API 带 BN 系列的训练态保护(Expected more than 1 value per channel when training),每通道只剩 1 个元素时直接拒收(2 维输入 (N,C) 且 group=C 即触发,实测 case00608 崩),而算子本身 elemNum=1 合法。改用 torch.var_mean / torch.rsqrt / torch.addcmul / F.silu / torch.round+torch.clamp 拼接,语义等价且不带该限制,同样满足红线 R3。 - **foreach 系 fp32 提升不再无谓复制缓冲**:astype(np.float32, copy=False)。单份 GB 级的大用例(32 张量、5.37 亿元素)无谓复制会把进程推向 OOM;下游 torch 算子均非原地、不改写输入,复用安全。 ## 关联的Issue 关联Issue #4483 https://gitcode.com/cann/ops-nn/issues/4483 ## 测试 - **新增 UT**:norm/group_norm_silu_quant/tests/ut/op_host/arch35/test_group_norm_silu_quant_infershape.cpp 新增 infershape_unknown_rank_x、infershape_empty_tensor_each_axis 两个用例,覆盖 -2 动态 rank 与 N/C/HW 三个轴各自为 0 的空 Tensor 场景。 - **golden 回归**:23 个算子的 tests/assets/golden.py 变更由各自 TTK 用例集回归验证。作者记录:foreach_addcmul_list 修正三因子结合序后,此前因 fp32 中间量溢出成 inf 而失败的 bf16 用例集(8192 个元素中 7361 个 |x2*scalars| 超 fp32 上限)达到 100/100 通过。 - **binary.json**:4 份新增配置的 bin 数与 dtype / format / attr 组合均与对应 _def.cpp 的注册列表逐项核对一致(12 / 6 / 2 / 2)。 ## 文档更新 - norm/group_norm_silu_quant/README.md、norm/group_norm_silu_quant/docs/aclnnGroupNormSiluQuant.md:self 参数的约束列由 - 补充为「支持空Tensor(任意维度为0)。此时out为空,meanOut填充为0,rstdOut填充为NAN。」 - optim/lamb_apply_weight_assign/README.md:计算公式由 $input\_param - input2 \times ratio \times input3$ 改为 $input\_param - ratio \times (input3 \times input2)$,加括号标明与算子实现一致的结合顺序。 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 - [x] AI辅助编写 See merge request: cann/ops-nn!8112 | 2 个月前 | |
fix: 补齐 4 算子 ascend950 binary.json 注册配置,修正 GroupNormSiluQuant 动态 rank 推导与 23 个算子 golden 参照失真 Co-authored-by: tangpingchuan<tangpingchuan@huawei.com> # message auto-generated for no-merge-commit merge: !8112 merge fix/op-binary-json-missing into master fix: 补齐 4 算子 ascend950 binary.json 注册配置,修正 GroupNormSiluQuant 动态 rank 推导与 23 个算子 golden 参照失真 Created-by: zl_hw Commit-by: tangpingchuan Merged-by: cann-robot Description: ## 描述 本 PR 修复三类「已声明的能力与实际产物不一致」的缺陷:注册配置缺失、动态 rank 推导缺失、测试参照(golden)与算子实现不一致。 ### 一、4 个算子在 ascend950 上缺失 binary.json 注册配置 NonZeroWithValue、MultilabelMarginLoss、PoissonNllLoss、MultiAddRmsNormDynamicQuant 的 *_def.cpp 均已执行 this->AICore().AddConfig("ascend950", ...),但 op_host/config/ascend950/*_binary.json 缺失(前 3 个算子 op_host/config/ 目录整体为空,MultiAddRmsNormDynamicQuant 仅有 ascend910b/、ascend910_93/)。 **改动原因**(依据仓库构建脚本,非推断): - cmake/custom_kernel.cmake:17-23:add_custom_kernel_library 以 if(EXISTS ${binary_json}) 为进入门槛,配置缺失时该算子被整体 continue 跳过,ascend950 kernel 不进入编译与打包; - cmake/func.cmake:656-666:拿不到 binary.json 时退化为 get_op_type_from_op_name 按算子名推断 op_type; - cmake/ut.cmake:459-476:numFiles EQUAL 0 分支同样退化为「下划线切分 + 首字母大写」推断 opType,与 OP_ADD() 注册的真实 op_type 不再有强绑定。 **改动方法**:逐算子按其 _def.cpp 的 DataType / Format 注册列表对齐补齐配置文件,bin 数与 dtype 组合严格一一对应: | 算子 | 新增配置文件 | bin 数 | dtype 组合依据 | |------|-------------|:------:|---------------| | NonZeroWithValue | index/non_zero_with_value/op_host/config/ascend950/non_zero_with_value_binary.json | 12 | non_zero_with_value_def.cpp 中 xDataType 的 12 类:double / float / float16 / int8 / uint8 / int16 / uint16 / int32 / uint32 / int64 / uint64 / bool;value 跟随 x,index / count 恒 int32(与 indexDataType、countDataType 一致)。attr:transpose(bool) / dtype(int) | | MultilabelMarginLoss | loss/multilabel_margin_loss/op_host/config/ascend950/multilabel_margin_loss_binary.json | 6 | multilabel_margin_loss_def.cpp 中 ascend950 独立的 regbaseConfig(xy6 / tgt6 / ist6):x、y ∈ {float32, float16, bfloat16},is_target 前 3 组保持 GE 原型的 int32、后 3 组跟随 self(对应 _v2 后缀 bin) | | PoissonNllLoss | loss/poisson_nll_loss/op_host/config/ascend950/poisson_nll_loss_binary.json | 2 | poisson_nll_loss_def.cpp 中 {DT_FLOAT16, DT_FLOAT};attr:log_input(true) / full(false) / eps(1e-8) / reduction("mean") | | MultiAddRmsNormDynamicQuant | norm/multi_add_rms_norm_dynamic_quant/op_host/config/ascend950/multi_add_rms_norm_dynamic_quant_binary.json | 2 | float16 / bfloat16 两组;x1 为 dynamic 输入,smooth_scale1 / smooth_scale2 为 optional,输出 y1/y2 int8、x/y 跟随输入、scale1/scale2 float32;optional_input_mode: gen_placeholder 与同算子既有 ascend910b / ascend910_93 配置保持一致 | ### 二、GroupNormSiluQuant:补齐 -2 动态 rank 推导,资料补空 Tensor 支持声明 **改动原因**:group_norm_silu_quant_def.cpp:67 的 ascend950 config_regbase 已声明 DynamicRankSupportFlag(true),但 group_norm_silu_quant_infershape.cpp 中无对应分支。x 为 UNKNOWN_RANK(-2)时,x_shape->GetDim(0) 取到的是 -2 这个标记值本身,mean / rstd 被推成非法的 (-2, num_groups)。 **改动方法**: - op_host/group_norm_silu_quant_infershape.cpp:引入 util/shape_util.h,在取 num_groups 之前插入 Ops::Base::IsUnknownRank(*x_shape) 判断,命中则对 y / mean / rstd 三个输出统一 Ops::Base::SetUnknownRank() 后直接返回 GRAPH_SUCCESS。 - tests/ut/op_host/arch35/test_group_norm_silu_quant_infershape.cpp:新增 2 个用例。 - infershape_unknown_rank_x:x = {-2},断言三个输出均为 {-2}; - infershape_empty_tensor_each_axis:逐轴各一例(N 轴 {0,320,16,16}、C 轴 {4,0,16,16}、HW 轴 {4,320,0,16}),断言 y 与 x 同形、mean/rstd 为 (dims[0], 32)。 ### 三、23 个算子 golden.py 改用竞品 torch 算子拼接,并修正与算子实现不一致之处 **改动原因**:golden 红线 R3 要求 golden 只能由「竞品接口实现」或「竞品算子拼接实现」,禁止 numpy 纯公式——纯公式与被测 kernel 容易犯同一类错误,用与 kernel 一样有损的参照去比对,会把精度短板伪装成达标。 **改动方法**:23 个 tests/assets/golden.py 中,21 个新增 import torch 并改为 torch 张量算子拼接(numpy 仅保留 I/O 与 dtype 转换);foreach_a_cos_inplace、foreach_log_inplace 原本已是 torch 实现,本次仅做内存优化。除改用 torch 外,同步修正了以下与算子实现不一致之处(均为参照失真,会掩盖或误报 kernel 问题): - **标量一律落在 float32**:Python float 是 fp64,标量运算会把整条链路抬到双精度,而算子在 fp32 上算(A2 的 TBE compute 里 dtype='float32',arch35 DAG 计算类型 U = float)。 - **foreach_addcmul_list 整数分支**:改用未经 float32 抹位的原始整数标量——1564714939 过一道 fp32 会变成 1564714880。 - **foreach_addcmul_list 三因子结合序**:改为 (x2*x3) 先乘、再乘标量。数学上乘积与结合序无关,但 fp32 中间量下不等价:scalars 取极值(如 3.35e38)时 (x2*scalars) 先冲破 fp32 上限变成 inf,而 x2*x3 为小量、再乘 scalars 并不溢出。 - **lamb_update_with_lr 的 clip**:改用 torch.minimum / torch.maximum——内核走 Vec::Min / Vec::Max 硬件指令、传播 NaN,而 Python 内置 min/max 是比较语义、会静默丢弃 NaN。 - **lamb_apply_weight_assign 运算序列**:改为 ratio*(update*lr),与 A2 的 vmul(update,lr) 再 vmul(ratio,·) 及 arch35 DAG 一致;README.md 公式同步加括号标明结合顺序(原写法在 update 与 lr 同时较大时会先溢出成 inf)。 - **lamb_apply_weight_assign / foreach_addcdiv_list 的除法**:补 Subnormal 归零。A2 的 Div 无 config 参数、只有单指令一条路,arch35 默认 DivAlgo::INTRINSIC 亦对 Subnormal 做 FTZ;golden 在 CPU 上默认保留 Subnormal 会给出算子不会产出的值。 - **lamb_apply_optimizer_assign 偏差校正**:改用 exp(log(b)*steps),与 arch35 DAG 的 Log / Mul / Exp 三条指令一致,不再用 Python 幂运算。 - **scatter_list 散射写入**:按平坦偏移下发,不使用 Tensor.index_copy_。算子把 indice 直接当线性偏移用、不做边界检查也无负索引回绕语义(README「indice值域:不支持索引越界」),而 index_copy_ 只接受 [0, axis_size) 的索引、遇负索引直接抛异常中断整轮用例;原 numpy 花式索引则会把 [-size,-1] 静默回绕到尾部,给出算子不会产出的结果。同时工作 dtype 改用原生 dtype 而非一律转 float32:ScatterList 是纯拷贝算子、输出应与输入逐位相同,而 def 注册了 DT_INT32 / DT_INT64,fp32 尾数只有 24 位装不下 2^30 量级整数(实测 2^30+100 经 float32 中转变成 2^30+128,静默丢 28);仅 bfloat16 因 numpy 无原生类型走 fp32 桥接(拷贝无损)。 - **group_norm_silu_quant 刻意不用 F.group_norm**:该层级 API 带 BN 系列的训练态保护(Expected more than 1 value per channel when training),每通道只剩 1 个元素时直接拒收(2 维输入 (N,C) 且 group=C 即触发,实测 case00608 崩),而算子本身 elemNum=1 合法。改用 torch.var_mean / torch.rsqrt / torch.addcmul / F.silu / torch.round+torch.clamp 拼接,语义等价且不带该限制,同样满足红线 R3。 - **foreach 系 fp32 提升不再无谓复制缓冲**:astype(np.float32, copy=False)。单份 GB 级的大用例(32 张量、5.37 亿元素)无谓复制会把进程推向 OOM;下游 torch 算子均非原地、不改写输入,复用安全。 ## 关联的Issue 关联Issue #4483 https://gitcode.com/cann/ops-nn/issues/4483 ## 测试 - **新增 UT**:norm/group_norm_silu_quant/tests/ut/op_host/arch35/test_group_norm_silu_quant_infershape.cpp 新增 infershape_unknown_rank_x、infershape_empty_tensor_each_axis 两个用例,覆盖 -2 动态 rank 与 N/C/HW 三个轴各自为 0 的空 Tensor 场景。 - **golden 回归**:23 个算子的 tests/assets/golden.py 变更由各自 TTK 用例集回归验证。作者记录:foreach_addcmul_list 修正三因子结合序后,此前因 fp32 中间量溢出成 inf 而失败的 bf16 用例集(8192 个元素中 7361 个 |x2*scalars| 超 fp32 上限)达到 100/100 通过。 - **binary.json**:4 份新增配置的 bin 数与 dtype / format / attr 组合均与对应 _def.cpp 的注册列表逐项核对一致(12 / 6 / 2 / 2)。 ## 文档更新 - norm/group_norm_silu_quant/README.md、norm/group_norm_silu_quant/docs/aclnnGroupNormSiluQuant.md:self 参数的约束列由 - 补充为「支持空Tensor(任意维度为0)。此时out为空,meanOut填充为0,rstdOut填充为NAN。」 - optim/lamb_apply_weight_assign/README.md:计算公式由 $input\_param - input2 \times ratio \times input3$ 改为 $input\_param - ratio \times (input3 \times input2)$,加括号标明与算子实现一致的结合顺序。 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 - [x] AI辅助编写 See merge request: cann/ops-nn!8112 | 2 个月前 | |
fix: 补齐 4 算子 ascend950 binary.json 注册配置,修正 GroupNormSiluQuant 动态 rank 推导与 23 个算子 golden 参照失真 Co-authored-by: tangpingchuan<tangpingchuan@huawei.com> # message auto-generated for no-merge-commit merge: !8112 merge fix/op-binary-json-missing into master fix: 补齐 4 算子 ascend950 binary.json 注册配置,修正 GroupNormSiluQuant 动态 rank 推导与 23 个算子 golden 参照失真 Created-by: zl_hw Commit-by: tangpingchuan Merged-by: cann-robot Description: ## 描述 本 PR 修复三类「已声明的能力与实际产物不一致」的缺陷:注册配置缺失、动态 rank 推导缺失、测试参照(golden)与算子实现不一致。 ### 一、4 个算子在 ascend950 上缺失 binary.json 注册配置 NonZeroWithValue、MultilabelMarginLoss、PoissonNllLoss、MultiAddRmsNormDynamicQuant 的 *_def.cpp 均已执行 this->AICore().AddConfig("ascend950", ...),但 op_host/config/ascend950/*_binary.json 缺失(前 3 个算子 op_host/config/ 目录整体为空,MultiAddRmsNormDynamicQuant 仅有 ascend910b/、ascend910_93/)。 **改动原因**(依据仓库构建脚本,非推断): - cmake/custom_kernel.cmake:17-23:add_custom_kernel_library 以 if(EXISTS ${binary_json}) 为进入门槛,配置缺失时该算子被整体 continue 跳过,ascend950 kernel 不进入编译与打包; - cmake/func.cmake:656-666:拿不到 binary.json 时退化为 get_op_type_from_op_name 按算子名推断 op_type; - cmake/ut.cmake:459-476:numFiles EQUAL 0 分支同样退化为「下划线切分 + 首字母大写」推断 opType,与 OP_ADD() 注册的真实 op_type 不再有强绑定。 **改动方法**:逐算子按其 _def.cpp 的 DataType / Format 注册列表对齐补齐配置文件,bin 数与 dtype 组合严格一一对应: | 算子 | 新增配置文件 | bin 数 | dtype 组合依据 | |------|-------------|:------:|---------------| | NonZeroWithValue | index/non_zero_with_value/op_host/config/ascend950/non_zero_with_value_binary.json | 12 | non_zero_with_value_def.cpp 中 xDataType 的 12 类:double / float / float16 / int8 / uint8 / int16 / uint16 / int32 / uint32 / int64 / uint64 / bool;value 跟随 x,index / count 恒 int32(与 indexDataType、countDataType 一致)。attr:transpose(bool) / dtype(int) | | MultilabelMarginLoss | loss/multilabel_margin_loss/op_host/config/ascend950/multilabel_margin_loss_binary.json | 6 | multilabel_margin_loss_def.cpp 中 ascend950 独立的 regbaseConfig(xy6 / tgt6 / ist6):x、y ∈ {float32, float16, bfloat16},is_target 前 3 组保持 GE 原型的 int32、后 3 组跟随 self(对应 _v2 后缀 bin) | | PoissonNllLoss | loss/poisson_nll_loss/op_host/config/ascend950/poisson_nll_loss_binary.json | 2 | poisson_nll_loss_def.cpp 中 {DT_FLOAT16, DT_FLOAT};attr:log_input(true) / full(false) / eps(1e-8) / reduction("mean") | | MultiAddRmsNormDynamicQuant | norm/multi_add_rms_norm_dynamic_quant/op_host/config/ascend950/multi_add_rms_norm_dynamic_quant_binary.json | 2 | float16 / bfloat16 两组;x1 为 dynamic 输入,smooth_scale1 / smooth_scale2 为 optional,输出 y1/y2 int8、x/y 跟随输入、scale1/scale2 float32;optional_input_mode: gen_placeholder 与同算子既有 ascend910b / ascend910_93 配置保持一致 | ### 二、GroupNormSiluQuant:补齐 -2 动态 rank 推导,资料补空 Tensor 支持声明 **改动原因**:group_norm_silu_quant_def.cpp:67 的 ascend950 config_regbase 已声明 DynamicRankSupportFlag(true),但 group_norm_silu_quant_infershape.cpp 中无对应分支。x 为 UNKNOWN_RANK(-2)时,x_shape->GetDim(0) 取到的是 -2 这个标记值本身,mean / rstd 被推成非法的 (-2, num_groups)。 **改动方法**: - op_host/group_norm_silu_quant_infershape.cpp:引入 util/shape_util.h,在取 num_groups 之前插入 Ops::Base::IsUnknownRank(*x_shape) 判断,命中则对 y / mean / rstd 三个输出统一 Ops::Base::SetUnknownRank() 后直接返回 GRAPH_SUCCESS。 - tests/ut/op_host/arch35/test_group_norm_silu_quant_infershape.cpp:新增 2 个用例。 - infershape_unknown_rank_x:x = {-2},断言三个输出均为 {-2}; - infershape_empty_tensor_each_axis:逐轴各一例(N 轴 {0,320,16,16}、C 轴 {4,0,16,16}、HW 轴 {4,320,0,16}),断言 y 与 x 同形、mean/rstd 为 (dims[0], 32)。 ### 三、23 个算子 golden.py 改用竞品 torch 算子拼接,并修正与算子实现不一致之处 **改动原因**:golden 红线 R3 要求 golden 只能由「竞品接口实现」或「竞品算子拼接实现」,禁止 numpy 纯公式——纯公式与被测 kernel 容易犯同一类错误,用与 kernel 一样有损的参照去比对,会把精度短板伪装成达标。 **改动方法**:23 个 tests/assets/golden.py 中,21 个新增 import torch 并改为 torch 张量算子拼接(numpy 仅保留 I/O 与 dtype 转换);foreach_a_cos_inplace、foreach_log_inplace 原本已是 torch 实现,本次仅做内存优化。除改用 torch 外,同步修正了以下与算子实现不一致之处(均为参照失真,会掩盖或误报 kernel 问题): - **标量一律落在 float32**:Python float 是 fp64,标量运算会把整条链路抬到双精度,而算子在 fp32 上算(A2 的 TBE compute 里 dtype='float32',arch35 DAG 计算类型 U = float)。 - **foreach_addcmul_list 整数分支**:改用未经 float32 抹位的原始整数标量——1564714939 过一道 fp32 会变成 1564714880。 - **foreach_addcmul_list 三因子结合序**:改为 (x2*x3) 先乘、再乘标量。数学上乘积与结合序无关,但 fp32 中间量下不等价:scalars 取极值(如 3.35e38)时 (x2*scalars) 先冲破 fp32 上限变成 inf,而 x2*x3 为小量、再乘 scalars 并不溢出。 - **lamb_update_with_lr 的 clip**:改用 torch.minimum / torch.maximum——内核走 Vec::Min / Vec::Max 硬件指令、传播 NaN,而 Python 内置 min/max 是比较语义、会静默丢弃 NaN。 - **lamb_apply_weight_assign 运算序列**:改为 ratio*(update*lr),与 A2 的 vmul(update,lr) 再 vmul(ratio,·) 及 arch35 DAG 一致;README.md 公式同步加括号标明结合顺序(原写法在 update 与 lr 同时较大时会先溢出成 inf)。 - **lamb_apply_weight_assign / foreach_addcdiv_list 的除法**:补 Subnormal 归零。A2 的 Div 无 config 参数、只有单指令一条路,arch35 默认 DivAlgo::INTRINSIC 亦对 Subnormal 做 FTZ;golden 在 CPU 上默认保留 Subnormal 会给出算子不会产出的值。 - **lamb_apply_optimizer_assign 偏差校正**:改用 exp(log(b)*steps),与 arch35 DAG 的 Log / Mul / Exp 三条指令一致,不再用 Python 幂运算。 - **scatter_list 散射写入**:按平坦偏移下发,不使用 Tensor.index_copy_。算子把 indice 直接当线性偏移用、不做边界检查也无负索引回绕语义(README「indice值域:不支持索引越界」),而 index_copy_ 只接受 [0, axis_size) 的索引、遇负索引直接抛异常中断整轮用例;原 numpy 花式索引则会把 [-size,-1] 静默回绕到尾部,给出算子不会产出的结果。同时工作 dtype 改用原生 dtype 而非一律转 float32:ScatterList 是纯拷贝算子、输出应与输入逐位相同,而 def 注册了 DT_INT32 / DT_INT64,fp32 尾数只有 24 位装不下 2^30 量级整数(实测 2^30+100 经 float32 中转变成 2^30+128,静默丢 28);仅 bfloat16 因 numpy 无原生类型走 fp32 桥接(拷贝无损)。 - **group_norm_silu_quant 刻意不用 F.group_norm**:该层级 API 带 BN 系列的训练态保护(Expected more than 1 value per channel when training),每通道只剩 1 个元素时直接拒收(2 维输入 (N,C) 且 group=C 即触发,实测 case00608 崩),而算子本身 elemNum=1 合法。改用 torch.var_mean / torch.rsqrt / torch.addcmul / F.silu / torch.round+torch.clamp 拼接,语义等价且不带该限制,同样满足红线 R3。 - **foreach 系 fp32 提升不再无谓复制缓冲**:astype(np.float32, copy=False)。单份 GB 级的大用例(32 张量、5.37 亿元素)无谓复制会把进程推向 OOM;下游 torch 算子均非原地、不改写输入,复用安全。 ## 关联的Issue 关联Issue #4483 https://gitcode.com/cann/ops-nn/issues/4483 ## 测试 - **新增 UT**:norm/group_norm_silu_quant/tests/ut/op_host/arch35/test_group_norm_silu_quant_infershape.cpp 新增 infershape_unknown_rank_x、infershape_empty_tensor_each_axis 两个用例,覆盖 -2 动态 rank 与 N/C/HW 三个轴各自为 0 的空 Tensor 场景。 - **golden 回归**:23 个算子的 tests/assets/golden.py 变更由各自 TTK 用例集回归验证。作者记录:foreach_addcmul_list 修正三因子结合序后,此前因 fp32 中间量溢出成 inf 而失败的 bf16 用例集(8192 个元素中 7361 个 |x2*scalars| 超 fp32 上限)达到 100/100 通过。 - **binary.json**:4 份新增配置的 bin 数与 dtype / format / attr 组合均与对应 _def.cpp 的注册列表逐项核对一致(12 / 6 / 2 / 2)。 ## 文档更新 - norm/group_norm_silu_quant/README.md、norm/group_norm_silu_quant/docs/aclnnGroupNormSiluQuant.md:self 参数的约束列由 - 补充为「支持空Tensor(任意维度为0)。此时out为空,meanOut填充为0,rstdOut填充为NAN。」 - optim/lamb_apply_weight_assign/README.md:计算公式由 $input\_param - input2 \times ratio \times input3$ 改为 $input\_param - ratio \times (input3 \times input2)$,加括号标明与算子实现一致的结合顺序。 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 - [x] AI辅助编写 See merge request: cann/ops-nn!8112 | 2 个月前 | |
fix: 补齐 4 算子 ascend950 binary.json 注册配置,修正 GroupNormSiluQuant 动态 rank 推导与 23 个算子 golden 参照失真 Co-authored-by: tangpingchuan<tangpingchuan@huawei.com> # message auto-generated for no-merge-commit merge: !8112 merge fix/op-binary-json-missing into master fix: 补齐 4 算子 ascend950 binary.json 注册配置,修正 GroupNormSiluQuant 动态 rank 推导与 23 个算子 golden 参照失真 Created-by: zl_hw Commit-by: tangpingchuan Merged-by: cann-robot Description: ## 描述 本 PR 修复三类「已声明的能力与实际产物不一致」的缺陷:注册配置缺失、动态 rank 推导缺失、测试参照(golden)与算子实现不一致。 ### 一、4 个算子在 ascend950 上缺失 binary.json 注册配置 NonZeroWithValue、MultilabelMarginLoss、PoissonNllLoss、MultiAddRmsNormDynamicQuant 的 *_def.cpp 均已执行 this->AICore().AddConfig("ascend950", ...),但 op_host/config/ascend950/*_binary.json 缺失(前 3 个算子 op_host/config/ 目录整体为空,MultiAddRmsNormDynamicQuant 仅有 ascend910b/、ascend910_93/)。 **改动原因**(依据仓库构建脚本,非推断): - cmake/custom_kernel.cmake:17-23:add_custom_kernel_library 以 if(EXISTS ${binary_json}) 为进入门槛,配置缺失时该算子被整体 continue 跳过,ascend950 kernel 不进入编译与打包; - cmake/func.cmake:656-666:拿不到 binary.json 时退化为 get_op_type_from_op_name 按算子名推断 op_type; - cmake/ut.cmake:459-476:numFiles EQUAL 0 分支同样退化为「下划线切分 + 首字母大写」推断 opType,与 OP_ADD() 注册的真实 op_type 不再有强绑定。 **改动方法**:逐算子按其 _def.cpp 的 DataType / Format 注册列表对齐补齐配置文件,bin 数与 dtype 组合严格一一对应: | 算子 | 新增配置文件 | bin 数 | dtype 组合依据 | |------|-------------|:------:|---------------| | NonZeroWithValue | index/non_zero_with_value/op_host/config/ascend950/non_zero_with_value_binary.json | 12 | non_zero_with_value_def.cpp 中 xDataType 的 12 类:double / float / float16 / int8 / uint8 / int16 / uint16 / int32 / uint32 / int64 / uint64 / bool;value 跟随 x,index / count 恒 int32(与 indexDataType、countDataType 一致)。attr:transpose(bool) / dtype(int) | | MultilabelMarginLoss | loss/multilabel_margin_loss/op_host/config/ascend950/multilabel_margin_loss_binary.json | 6 | multilabel_margin_loss_def.cpp 中 ascend950 独立的 regbaseConfig(xy6 / tgt6 / ist6):x、y ∈ {float32, float16, bfloat16},is_target 前 3 组保持 GE 原型的 int32、后 3 组跟随 self(对应 _v2 后缀 bin) | | PoissonNllLoss | loss/poisson_nll_loss/op_host/config/ascend950/poisson_nll_loss_binary.json | 2 | poisson_nll_loss_def.cpp 中 {DT_FLOAT16, DT_FLOAT};attr:log_input(true) / full(false) / eps(1e-8) / reduction("mean") | | MultiAddRmsNormDynamicQuant | norm/multi_add_rms_norm_dynamic_quant/op_host/config/ascend950/multi_add_rms_norm_dynamic_quant_binary.json | 2 | float16 / bfloat16 两组;x1 为 dynamic 输入,smooth_scale1 / smooth_scale2 为 optional,输出 y1/y2 int8、x/y 跟随输入、scale1/scale2 float32;optional_input_mode: gen_placeholder 与同算子既有 ascend910b / ascend910_93 配置保持一致 | ### 二、GroupNormSiluQuant:补齐 -2 动态 rank 推导,资料补空 Tensor 支持声明 **改动原因**:group_norm_silu_quant_def.cpp:67 的 ascend950 config_regbase 已声明 DynamicRankSupportFlag(true),但 group_norm_silu_quant_infershape.cpp 中无对应分支。x 为 UNKNOWN_RANK(-2)时,x_shape->GetDim(0) 取到的是 -2 这个标记值本身,mean / rstd 被推成非法的 (-2, num_groups)。 **改动方法**: - op_host/group_norm_silu_quant_infershape.cpp:引入 util/shape_util.h,在取 num_groups 之前插入 Ops::Base::IsUnknownRank(*x_shape) 判断,命中则对 y / mean / rstd 三个输出统一 Ops::Base::SetUnknownRank() 后直接返回 GRAPH_SUCCESS。 - tests/ut/op_host/arch35/test_group_norm_silu_quant_infershape.cpp:新增 2 个用例。 - infershape_unknown_rank_x:x = {-2},断言三个输出均为 {-2}; - infershape_empty_tensor_each_axis:逐轴各一例(N 轴 {0,320,16,16}、C 轴 {4,0,16,16}、HW 轴 {4,320,0,16}),断言 y 与 x 同形、mean/rstd 为 (dims[0], 32)。 ### 三、23 个算子 golden.py 改用竞品 torch 算子拼接,并修正与算子实现不一致之处 **改动原因**:golden 红线 R3 要求 golden 只能由「竞品接口实现」或「竞品算子拼接实现」,禁止 numpy 纯公式——纯公式与被测 kernel 容易犯同一类错误,用与 kernel 一样有损的参照去比对,会把精度短板伪装成达标。 **改动方法**:23 个 tests/assets/golden.py 中,21 个新增 import torch 并改为 torch 张量算子拼接(numpy 仅保留 I/O 与 dtype 转换);foreach_a_cos_inplace、foreach_log_inplace 原本已是 torch 实现,本次仅做内存优化。除改用 torch 外,同步修正了以下与算子实现不一致之处(均为参照失真,会掩盖或误报 kernel 问题): - **标量一律落在 float32**:Python float 是 fp64,标量运算会把整条链路抬到双精度,而算子在 fp32 上算(A2 的 TBE compute 里 dtype='float32',arch35 DAG 计算类型 U = float)。 - **foreach_addcmul_list 整数分支**:改用未经 float32 抹位的原始整数标量——1564714939 过一道 fp32 会变成 1564714880。 - **foreach_addcmul_list 三因子结合序**:改为 (x2*x3) 先乘、再乘标量。数学上乘积与结合序无关,但 fp32 中间量下不等价:scalars 取极值(如 3.35e38)时 (x2*scalars) 先冲破 fp32 上限变成 inf,而 x2*x3 为小量、再乘 scalars 并不溢出。 - **lamb_update_with_lr 的 clip**:改用 torch.minimum / torch.maximum——内核走 Vec::Min / Vec::Max 硬件指令、传播 NaN,而 Python 内置 min/max 是比较语义、会静默丢弃 NaN。 - **lamb_apply_weight_assign 运算序列**:改为 ratio*(update*lr),与 A2 的 vmul(update,lr) 再 vmul(ratio,·) 及 arch35 DAG 一致;README.md 公式同步加括号标明结合顺序(原写法在 update 与 lr 同时较大时会先溢出成 inf)。 - **lamb_apply_weight_assign / foreach_addcdiv_list 的除法**:补 Subnormal 归零。A2 的 Div 无 config 参数、只有单指令一条路,arch35 默认 DivAlgo::INTRINSIC 亦对 Subnormal 做 FTZ;golden 在 CPU 上默认保留 Subnormal 会给出算子不会产出的值。 - **lamb_apply_optimizer_assign 偏差校正**:改用 exp(log(b)*steps),与 arch35 DAG 的 Log / Mul / Exp 三条指令一致,不再用 Python 幂运算。 - **scatter_list 散射写入**:按平坦偏移下发,不使用 Tensor.index_copy_。算子把 indice 直接当线性偏移用、不做边界检查也无负索引回绕语义(README「indice值域:不支持索引越界」),而 index_copy_ 只接受 [0, axis_size) 的索引、遇负索引直接抛异常中断整轮用例;原 numpy 花式索引则会把 [-size,-1] 静默回绕到尾部,给出算子不会产出的结果。同时工作 dtype 改用原生 dtype 而非一律转 float32:ScatterList 是纯拷贝算子、输出应与输入逐位相同,而 def 注册了 DT_INT32 / DT_INT64,fp32 尾数只有 24 位装不下 2^30 量级整数(实测 2^30+100 经 float32 中转变成 2^30+128,静默丢 28);仅 bfloat16 因 numpy 无原生类型走 fp32 桥接(拷贝无损)。 - **group_norm_silu_quant 刻意不用 F.group_norm**:该层级 API 带 BN 系列的训练态保护(Expected more than 1 value per channel when training),每通道只剩 1 个元素时直接拒收(2 维输入 (N,C) 且 group=C 即触发,实测 case00608 崩),而算子本身 elemNum=1 合法。改用 torch.var_mean / torch.rsqrt / torch.addcmul / F.silu / torch.round+torch.clamp 拼接,语义等价且不带该限制,同样满足红线 R3。 - **foreach 系 fp32 提升不再无谓复制缓冲**:astype(np.float32, copy=False)。单份 GB 级的大用例(32 张量、5.37 亿元素)无谓复制会把进程推向 OOM;下游 torch 算子均非原地、不改写输入,复用安全。 ## 关联的Issue 关联Issue #4483 https://gitcode.com/cann/ops-nn/issues/4483 ## 测试 - **新增 UT**:norm/group_norm_silu_quant/tests/ut/op_host/arch35/test_group_norm_silu_quant_infershape.cpp 新增 infershape_unknown_rank_x、infershape_empty_tensor_each_axis 两个用例,覆盖 -2 动态 rank 与 N/C/HW 三个轴各自为 0 的空 Tensor 场景。 - **golden 回归**:23 个算子的 tests/assets/golden.py 变更由各自 TTK 用例集回归验证。作者记录:foreach_addcmul_list 修正三因子结合序后,此前因 fp32 中间量溢出成 inf 而失败的 bf16 用例集(8192 个元素中 7361 个 |x2*scalars| 超 fp32 上限)达到 100/100 通过。 - **binary.json**:4 份新增配置的 bin 数与 dtype / format / attr 组合均与对应 _def.cpp 的注册列表逐项核对一致(12 / 6 / 2 / 2)。 ## 文档更新 - norm/group_norm_silu_quant/README.md、norm/group_norm_silu_quant/docs/aclnnGroupNormSiluQuant.md:self 参数的约束列由 - 补充为「支持空Tensor(任意维度为0)。此时out为空,meanOut填充为0,rstdOut填充为NAN。」 - optim/lamb_apply_weight_assign/README.md:计算公式由 $input\_param - input2 \times ratio \times input3$ 改为 $input\_param - ratio \times (input3 \times input2)$,加括号标明与算子实现一致的结合顺序。 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 - [x] AI辅助编写 See merge request: cann/ops-nn!8112 | 2 个月前 | |
fix: 补齐 4 算子 ascend950 binary.json 注册配置,修正 GroupNormSiluQuant 动态 rank 推导与 23 个算子 golden 参照失真 Co-authored-by: tangpingchuan<tangpingchuan@huawei.com> # message auto-generated for no-merge-commit merge: !8112 merge fix/op-binary-json-missing into master fix: 补齐 4 算子 ascend950 binary.json 注册配置,修正 GroupNormSiluQuant 动态 rank 推导与 23 个算子 golden 参照失真 Created-by: zl_hw Commit-by: tangpingchuan Merged-by: cann-robot Description: ## 描述 本 PR 修复三类「已声明的能力与实际产物不一致」的缺陷:注册配置缺失、动态 rank 推导缺失、测试参照(golden)与算子实现不一致。 ### 一、4 个算子在 ascend950 上缺失 binary.json 注册配置 NonZeroWithValue、MultilabelMarginLoss、PoissonNllLoss、MultiAddRmsNormDynamicQuant 的 *_def.cpp 均已执行 this->AICore().AddConfig("ascend950", ...),但 op_host/config/ascend950/*_binary.json 缺失(前 3 个算子 op_host/config/ 目录整体为空,MultiAddRmsNormDynamicQuant 仅有 ascend910b/、ascend910_93/)。 **改动原因**(依据仓库构建脚本,非推断): - cmake/custom_kernel.cmake:17-23:add_custom_kernel_library 以 if(EXISTS ${binary_json}) 为进入门槛,配置缺失时该算子被整体 continue 跳过,ascend950 kernel 不进入编译与打包; - cmake/func.cmake:656-666:拿不到 binary.json 时退化为 get_op_type_from_op_name 按算子名推断 op_type; - cmake/ut.cmake:459-476:numFiles EQUAL 0 分支同样退化为「下划线切分 + 首字母大写」推断 opType,与 OP_ADD() 注册的真实 op_type 不再有强绑定。 **改动方法**:逐算子按其 _def.cpp 的 DataType / Format 注册列表对齐补齐配置文件,bin 数与 dtype 组合严格一一对应: | 算子 | 新增配置文件 | bin 数 | dtype 组合依据 | |------|-------------|:------:|---------------| | NonZeroWithValue | index/non_zero_with_value/op_host/config/ascend950/non_zero_with_value_binary.json | 12 | non_zero_with_value_def.cpp 中 xDataType 的 12 类:double / float / float16 / int8 / uint8 / int16 / uint16 / int32 / uint32 / int64 / uint64 / bool;value 跟随 x,index / count 恒 int32(与 indexDataType、countDataType 一致)。attr:transpose(bool) / dtype(int) | | MultilabelMarginLoss | loss/multilabel_margin_loss/op_host/config/ascend950/multilabel_margin_loss_binary.json | 6 | multilabel_margin_loss_def.cpp 中 ascend950 独立的 regbaseConfig(xy6 / tgt6 / ist6):x、y ∈ {float32, float16, bfloat16},is_target 前 3 组保持 GE 原型的 int32、后 3 组跟随 self(对应 _v2 后缀 bin) | | PoissonNllLoss | loss/poisson_nll_loss/op_host/config/ascend950/poisson_nll_loss_binary.json | 2 | poisson_nll_loss_def.cpp 中 {DT_FLOAT16, DT_FLOAT};attr:log_input(true) / full(false) / eps(1e-8) / reduction("mean") | | MultiAddRmsNormDynamicQuant | norm/multi_add_rms_norm_dynamic_quant/op_host/config/ascend950/multi_add_rms_norm_dynamic_quant_binary.json | 2 | float16 / bfloat16 两组;x1 为 dynamic 输入,smooth_scale1 / smooth_scale2 为 optional,输出 y1/y2 int8、x/y 跟随输入、scale1/scale2 float32;optional_input_mode: gen_placeholder 与同算子既有 ascend910b / ascend910_93 配置保持一致 | ### 二、GroupNormSiluQuant:补齐 -2 动态 rank 推导,资料补空 Tensor 支持声明 **改动原因**:group_norm_silu_quant_def.cpp:67 的 ascend950 config_regbase 已声明 DynamicRankSupportFlag(true),但 group_norm_silu_quant_infershape.cpp 中无对应分支。x 为 UNKNOWN_RANK(-2)时,x_shape->GetDim(0) 取到的是 -2 这个标记值本身,mean / rstd 被推成非法的 (-2, num_groups)。 **改动方法**: - op_host/group_norm_silu_quant_infershape.cpp:引入 util/shape_util.h,在取 num_groups 之前插入 Ops::Base::IsUnknownRank(*x_shape) 判断,命中则对 y / mean / rstd 三个输出统一 Ops::Base::SetUnknownRank() 后直接返回 GRAPH_SUCCESS。 - tests/ut/op_host/arch35/test_group_norm_silu_quant_infershape.cpp:新增 2 个用例。 - infershape_unknown_rank_x:x = {-2},断言三个输出均为 {-2}; - infershape_empty_tensor_each_axis:逐轴各一例(N 轴 {0,320,16,16}、C 轴 {4,0,16,16}、HW 轴 {4,320,0,16}),断言 y 与 x 同形、mean/rstd 为 (dims[0], 32)。 ### 三、23 个算子 golden.py 改用竞品 torch 算子拼接,并修正与算子实现不一致之处 **改动原因**:golden 红线 R3 要求 golden 只能由「竞品接口实现」或「竞品算子拼接实现」,禁止 numpy 纯公式——纯公式与被测 kernel 容易犯同一类错误,用与 kernel 一样有损的参照去比对,会把精度短板伪装成达标。 **改动方法**:23 个 tests/assets/golden.py 中,21 个新增 import torch 并改为 torch 张量算子拼接(numpy 仅保留 I/O 与 dtype 转换);foreach_a_cos_inplace、foreach_log_inplace 原本已是 torch 实现,本次仅做内存优化。除改用 torch 外,同步修正了以下与算子实现不一致之处(均为参照失真,会掩盖或误报 kernel 问题): - **标量一律落在 float32**:Python float 是 fp64,标量运算会把整条链路抬到双精度,而算子在 fp32 上算(A2 的 TBE compute 里 dtype='float32',arch35 DAG 计算类型 U = float)。 - **foreach_addcmul_list 整数分支**:改用未经 float32 抹位的原始整数标量——1564714939 过一道 fp32 会变成 1564714880。 - **foreach_addcmul_list 三因子结合序**:改为 (x2*x3) 先乘、再乘标量。数学上乘积与结合序无关,但 fp32 中间量下不等价:scalars 取极值(如 3.35e38)时 (x2*scalars) 先冲破 fp32 上限变成 inf,而 x2*x3 为小量、再乘 scalars 并不溢出。 - **lamb_update_with_lr 的 clip**:改用 torch.minimum / torch.maximum——内核走 Vec::Min / Vec::Max 硬件指令、传播 NaN,而 Python 内置 min/max 是比较语义、会静默丢弃 NaN。 - **lamb_apply_weight_assign 运算序列**:改为 ratio*(update*lr),与 A2 的 vmul(update,lr) 再 vmul(ratio,·) 及 arch35 DAG 一致;README.md 公式同步加括号标明结合顺序(原写法在 update 与 lr 同时较大时会先溢出成 inf)。 - **lamb_apply_weight_assign / foreach_addcdiv_list 的除法**:补 Subnormal 归零。A2 的 Div 无 config 参数、只有单指令一条路,arch35 默认 DivAlgo::INTRINSIC 亦对 Subnormal 做 FTZ;golden 在 CPU 上默认保留 Subnormal 会给出算子不会产出的值。 - **lamb_apply_optimizer_assign 偏差校正**:改用 exp(log(b)*steps),与 arch35 DAG 的 Log / Mul / Exp 三条指令一致,不再用 Python 幂运算。 - **scatter_list 散射写入**:按平坦偏移下发,不使用 Tensor.index_copy_。算子把 indice 直接当线性偏移用、不做边界检查也无负索引回绕语义(README「indice值域:不支持索引越界」),而 index_copy_ 只接受 [0, axis_size) 的索引、遇负索引直接抛异常中断整轮用例;原 numpy 花式索引则会把 [-size,-1] 静默回绕到尾部,给出算子不会产出的结果。同时工作 dtype 改用原生 dtype 而非一律转 float32:ScatterList 是纯拷贝算子、输出应与输入逐位相同,而 def 注册了 DT_INT32 / DT_INT64,fp32 尾数只有 24 位装不下 2^30 量级整数(实测 2^30+100 经 float32 中转变成 2^30+128,静默丢 28);仅 bfloat16 因 numpy 无原生类型走 fp32 桥接(拷贝无损)。 - **group_norm_silu_quant 刻意不用 F.group_norm**:该层级 API 带 BN 系列的训练态保护(Expected more than 1 value per channel when training),每通道只剩 1 个元素时直接拒收(2 维输入 (N,C) 且 group=C 即触发,实测 case00608 崩),而算子本身 elemNum=1 合法。改用 torch.var_mean / torch.rsqrt / torch.addcmul / F.silu / torch.round+torch.clamp 拼接,语义等价且不带该限制,同样满足红线 R3。 - **foreach 系 fp32 提升不再无谓复制缓冲**:astype(np.float32, copy=False)。单份 GB 级的大用例(32 张量、5.37 亿元素)无谓复制会把进程推向 OOM;下游 torch 算子均非原地、不改写输入,复用安全。 ## 关联的Issue 关联Issue #4483 https://gitcode.com/cann/ops-nn/issues/4483 ## 测试 - **新增 UT**:norm/group_norm_silu_quant/tests/ut/op_host/arch35/test_group_norm_silu_quant_infershape.cpp 新增 infershape_unknown_rank_x、infershape_empty_tensor_each_axis 两个用例,覆盖 -2 动态 rank 与 N/C/HW 三个轴各自为 0 的空 Tensor 场景。 - **golden 回归**:23 个算子的 tests/assets/golden.py 变更由各自 TTK 用例集回归验证。作者记录:foreach_addcmul_list 修正三因子结合序后,此前因 fp32 中间量溢出成 inf 而失败的 bf16 用例集(8192 个元素中 7361 个 |x2*scalars| 超 fp32 上限)达到 100/100 通过。 - **binary.json**:4 份新增配置的 bin 数与 dtype / format / attr 组合均与对应 _def.cpp 的注册列表逐项核对一致(12 / 6 / 2 / 2)。 ## 文档更新 - norm/group_norm_silu_quant/README.md、norm/group_norm_silu_quant/docs/aclnnGroupNormSiluQuant.md:self 参数的约束列由 - 补充为「支持空Tensor(任意维度为0)。此时out为空,meanOut填充为0,rstdOut填充为NAN。」 - optim/lamb_apply_weight_assign/README.md:计算公式由 $input\_param - input2 \times ratio \times input3$ 改为 $input\_param - ratio \times (input3 \times input2)$,加括号标明与算子实现一致的结合顺序。 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 - [x] AI辅助编写 See merge request: cann/ops-nn!8112 | 2 个月前 | |
fix(lars_v2_update): add dtype and rank validation in TilingFunc Co-authored-by: Miao_Haifeng<miaohaifeng@huawei.com> # message auto-generated for no-merge-commit merge: !8209 merge fix-lars-v2-update-tiling-exception into master fix(lars_v2_update): add dtype and rank validation in TilingFunc Created-by: Almost_CANN Commit-by: Miao_Haifeng Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> 增加LarsV2Update算子的dtype和dim检查 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> ## 测试 <!--描述进行了哪些测试来验证你的改动。--> TTK、UT ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> NA ## 类型标签 <!-- [x] 表示选中 --> - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [ ] AI辅助编写 See merge request: cann/ops-nn!8209 | 1 个月前 | |
feat(sgd): 新增SGD优化器算子arch35实现(Ascend 950PR/950DT,GE图模式) Co-authored-by: raoliang_sac<raoliang4@huawei.com> # message auto-generated for no-merge-commit merge: !8155 merge SGD-810 into master feat(sgd): 新增SGD优化器算子arch35实现(Ascend 950PR/950DT,GE图模式) Created-by: raoliang_sac Commit-by: raoliang_sac Merged-by: cann-robot Description: ## 描述 本 PR 为 optim/sgd 新增 **SGD(带动量的随机梯度下降)优化器算子**在 <term>Ascend 950PR/Ascend 950DT</term>(arch35 / DAV_3510 / regbase)上的 Ascend C 实现,共 22 个文件、+2719 行,**纯新增,不修改任何存量文件**(唯一的非新增改动是在 docs/zh/op_list.md 中追加一行算子登记)。 ### 改动原因 optim 目录下已有 fused_sgd,但那是语义不同的另一个算子;本仓此前**不存在** SGD 算子,Ascend 950 上缺失该优化器的 Ascend C 实现。910B/910C 上 SGD 由 CANN 内置的 TBE 实现承载,Ascend 950 需要在本仓补齐。 ### 改动方法 **1. 计算语义** —— 与 910B/910C 基线(canndev nn_training_ops.h 的 REG_OP(SGD) 与 aic-ascend910b-ops-info.ini 的 [SGD] 段)逐字对齐: grad = (wd != 0) ? gradient + parameters * wd : gradient accum_t = accum * m + grad // 无条件计算 accum_t -= (d != 0) ? grad * (1 - stat) * d : 0 parameters -= nesterov ? (grad * lr + accum_t * m * lr) : (accum_t * lr) if (m != 0) { accum = accum_t; stat = 0; } // 回写掩码 - 六输入 parameters / gradient / learning_rate / accum / momentum / stat,图上**只声明一个输出** parameters —— accum 与 stat 靠覆写输入 GM **原地回写**,与 A2 形态一致(A2 的 TBE 实现声明 reuse=('accum','parameters','stat'))。 - momentum == 0(含 -0.0)时 accum / stat **完全不写**、逐位保持输入值;parameters 照常更新。 - 与 PyTorch 的**真实分歧**已在 sgd_proto.h 与 README 显式记录:PyTorch 把 dampening 放在 momentum 块**内部**,本算子(同 A2)放在**外部**,故 m==0 && d>0 && stat==0 时结果差 (1-d) 倍。这是对齐 A2 的有意选择,不是缺陷。 **2. Kernel 实现** —— op_kernel/arch35/,基于 ATVOSS DAG + ElementwiseSch: - sgd_dag.h 用算子级 DAG 描述上述公式;sgd.cpp 在运行期按 momentum == 0 选择两套 DAG(**该掩码不是 TilingKey 维度**:momentum 是 Device 侧 [1] 张量,Host Tiling 阶段拿不到其数值,只能做运行期分支,binary 数量不变)。 - TilingKey 四维模板参数 schMode / useNesterov / hasWeightDecay / hasDampening。非法组合 nesterov==1 && dampening!=0 由 ASCENDC_TPL_SEL 两组 ARGS_SEL 在编译期剪除,**不生成对应 binary**;Host 侧 InferShape 与 Tiling 亦对该组合报 attribute_value_out_of_range。 - 组合数:业务模板 2×2×2 − 2 = 6(K0~K5)→ TPL_SEL 展开 12 → binary 12 × 3 dtype = 36。 **3. Host 实现** —— op_host/: - sgd_def.cpp:dtype FLOAT / FLOAT16 / BFLOAT16,format 仅 ND,DynamicShapeSupportFlag(true) / DynamicRankSupportFlag(true) / PrecisionReduceFlag(false)(对齐 A2 precision_reduce.flag=false);**只 AddConfig("ascend950"),不触碰任何 A2 配置**。format 只做 ND 是跟随本仓 arch35 全族 optim 算子(apply_momentum / apply_ftrl / apply_adam_w_v2 / apply_adamax / apply_centered_rms_prop)的既定约定 —— 这些算子的 def.cpp 一律只声明 ge::FORMAT_ND,无一例声明私有 format。 - sgd_infershape.cpp:校验 nesterov==true 时 dampening 必须为 0、weight_decay >= 0;rank 限 [1,8](rank-0 拒绝);空 tensor(任一轴为 0)拒绝为 null_input;-1(UNKNOWN_DIM)支持、-2(UNKNOWN_RANK)透传。 - arch35/sgd_tiling.cpp:基于 ElewiseBaseTiling。 **4. 交付形态:GE 图模式,不提供 aclnn 接口。** sgd_def.cpp 保持 ACLNNTYPE aclnn_exclude。依据:CANN 9.1.0 的 include/aclnnop/ 无 aclnn_sgd.h、libopapi.so 未导出任何 aclnnSgd* 符号(阴性对照:同库确实导出 aclnnFusedSgd,证明查法有效)、canndev 全仓无 aclnn_sgd 定义 —— SGD 在上游本就是纯图模式算子,本算子与之对齐。故 docs/zh/op_list.md 中 op_api 列填 ✗,docs/zh/op_api_list.md 不涉及。 ## 关联的Issue 关联Issue #4554 —— https://gitcode.com/cann/ops-nn/issues/4554 ## 测试 全部在 Ascend950PR 真机 + CANN 9.1.0 上实测,合计 **1081 项、0 失败**: | 测试腿 | 规模 | 结果 | |---|---|---| | 功能泛化(TTK kernel 模式) | 800 例 | **800/800 PASS**;bin_precision 100.0%、memory_oob_status 全 PASS;6 个 tilingKey × 3 dtype 零缺失 | | 三方精度对比 | 50 例 | **50/50 PASS**;NPU vs CPU-fp64 golden vs A100-GPU 三方比对,ratio_mare 恒为 1.000,最大 MERE 1.553e-03 | | Host UT | 31 例 | **31/31 PASS**(infershape 11 + arch35 tiling 20) | | GE 图模式冒烟 | 2 分支 | examples/test_geir_sgd.cpp,accum / stat 两条回写分支各 **60/60 元素**逐一核对 | | 性能对标 A100 | 200 例 | **200/200 NPU 更快** | **边界覆盖**:空 tensor(1D [0]、2D [0,C]/[N,0]、多轴 [0,0]、高 rank 混合)逐形态拒绝;rank-0 与 rank-9 两端拒绝;-2 动态 rank 透传;inf/nan 按 IEEE 语义无条件传播(判定方式是按 NaN/+Inf/-Inf 三张掩码逐位 array_equal,不套相对误差)。 **性能判据说明(供评审取用)**:按仓内 verification.md §7.1「mean ≥ 1.2 且 min ≥ 0.5」口径为 200/200 PASS;按测试侧 test-bot-dev 的芯片对阈值((950PR, A100) = 0.5,逐例 npu/gpu ≤ 0.5)为 191/200,9 条超阈值全部落在 numel = 4M 档、其中 7 条是 momentum == 0。成因是**访存量不对等而非实现慢**:m == 0 时 torch 不需要 momentum buffer,而本算子的契约要求无条件读 accum;最差的一条 NPU 搬运 1.67 倍数据、耗时反而更短,按达成带宽折算 NPU/GPU = 2.03x。对等访存量下 NPU 仍显著更快。 **本地 CI 复现**:单算子包 @ascend950、910b、910_93、整仓 JIT(默认 soc,2144 targets)、整仓 A5@950(2527 targets)共 5 项编译全过、0 error。其中 910b 一项专门验证 sgd_infershape.cpp 在 A2 上仍参与编译(kernel/tiling 由 On [ascend910b], [sgd] not supported. 排除,infershape 不排除),确认未引入会破坏 A2 的 arch35-only 头文件。 ## 文档更新 - 新增 optim/sgd/README.md(185 行):产品支持情况、计算公式、参数说明、约束与注意事项。产品支持表按 SGD 在各产品形态上的**可得性**填写,并在表下显式声明「本仓的 Ascend C 实现只适配 Ascend 950PR/950DT,其余形态由 CANN 内置 TBE 实现提供」。 - docs/zh/op_list.md 新增一行 optim / sgd 登记,op_kernel ✓ / op_host ✓ / op_api ✗ / op_graph ✓。 - docs/zh/op_api_list.md 不涉及(本算子不提供 aclnn 接口)。 ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [x] AI辅助编写 See merge request: cann/ops-nn!8155 | 1 个月前 | |
perf(sparse_apply_adadelta): 优化线程分布策略 Co-authored-by: guankarl<guanhongwei3@huawei.com> # message auto-generated for no-merge-commit merge: !7846 merge perf/sparse-apply-adadelta-optimize-tiling into master perf(sparse_apply_adadelta): 优化线程分布策略 Created-by: guankarl Commit-by: guankarl Merged-by: cann-robot Description: ## 优化内容 将 sparse_apply_adadelta 算子的线程分布从遍历 totalRows 改为 K×rowSize grid-stride ### 性能测试结果 - 平均加速比: 4206.82x - 最大加速比: 9393.57x - 35个用例保持PASS且全部性能提升 - 11个用例从FAIL改进为PASS ### 计算顺序验证 ✅ 计算顺序不变,无竞态 See merge request: cann/ops-nn!7846 | 2 个月前 | |
SparseApplyAdagradV2 add tiling checks Co-authored-by: rsj007<renshuojian@huawei.com> # message auto-generated for no-merge-commit merge: !8024 merge master into master SparseApplyAdagradV2 add tiling checks Created-by: rsj007 Commit-by: rsj007 Merged-by: cann-robot Description: ## 描述 SparseApplyAdagradV2需要在tiling里增加dtype和dim的校验 ## 关联的Issue https://gitcode.com/cann/ops-nn/issues/4395 ## 测试 冒烟、用例测试 ## 文档更新 不涉及 ## 类型标签 <!-- [x] 表示选中 --> - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [ ] AI辅助编写 See merge request: cann/ops-nn!8024 | 2 个月前 | |
添加长尾算子SparseApplyFtrl算子tiling校验/infershap校验/example/golden/ut Co-authored-by: surezz<zhangyuwei31@huawei.com> # message auto-generated for no-merge-commit merge: !8031 merge SparseApplyFtrl into master 添加长尾算子SparseApplyFtrl算子tiling校验/infershap校验/example/golden/ut Created-by: surezz Commit-by: surezz Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> 补充长尾算子SparseApplyFtrl算子相关交付件,添加算子相关tiling校验与算子约束条件 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> https://gitcode.com/cann/ops-nn/issues/4405 ## 测试 <!--描述进行了哪些测试来验证你的改动。--> david冒烟、二级冒烟、tilingut验证 ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> 更新了SparseApplyFtrl的README.md ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [ ] AI辅助编写 See merge request: cann/ops-nn!8031 | 2 个月前 | |
TF plugin 迁移2 Co-authored-by: sunchun<sunchun4@h-partners.com> # message auto-generated for no-merge-commit merge: !7586 merge nn2 into master TF plugin 迁移2 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!7586 | 2 个月前 | |
TF plugin 迁移2 Co-authored-by: sunchun<sunchun4@h-partners.com> # message auto-generated for no-merge-commit merge: !7586 merge nn2 into master TF plugin 迁移2 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!7586 | 2 个月前 | |
TF plugin 迁移2 Co-authored-by: sunchun<sunchun4@h-partners.com> # message auto-generated for no-merge-commit merge: !7586 merge nn2 into master TF plugin 迁移2 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!7586 | 2 个月前 | |
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 个月前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 2 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 1 个月前 | ||
| 2 个月前 | ||
| 1 个月前 | ||
| 2 个月前 | ||
| 1 个月前 | ||
| 2 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 1 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 1 个月前 | ||
| 2 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 2 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 1 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 9 个月前 |