| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
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 | 3 个月前 | |
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 | 1 个月前 | |
feat(quant): support Ascend950 dynamic quant update scatter Co-authored-by: daiwei18<daiwei18@huawei.com> # message auto-generated for no-merge-commit merge: !8164 merge 930-quant into master feat(quant): support Ascend950 dynamic quant update scatter Created-by: daiwei18 Commit-by: daiwei18 Merged-by: cann-robot Description: ## 描述 本PR补齐DynamicQuantUpdateScatter和DynamicQuantUpdateScatterV2在Ascend950(A5/arch35)上的交付能力。 主要改动: - DynamicQuantUpdateScatter调整arch35 RegBase实现,补充reduce取值兼容说明,更新golden与arch35 ST用例。 - DynamicQuantUpdateScatterV2放开Ascend950融合pass,完善arch35 tiling形状校验、UB容量校验和多核切分,更新kernel/tiling data/base路径。 - 补充DynamicQuantUpdateScatterV2融合UT、arch35 tiling UT、golden和arch35 ST用例。 - 保持A2/arch22既有行为不变,未引入A2侧bug修复。 ## 关联的Issue 关联Issue #4491 ## 测试 - pre-commit run --files $(git diff --cached --name-only):Passed - DynamicQuantUpdateScatterV2 arch35 op_host UT:11/11 PASS - DynamicQuantUpdateScatterV2 fusion UT:3/3 PASS - DynamicQuantUpdateScatterV2泛化验证:100/100 PASS - git diff --check:Passed ## 文档更新 已更新: - quant/dynamic_quant_update_scatter/README.md - quant/dynamic_quant_update_scatter_v2/README.md ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [x] AI辅助编写 See merge request: cann/ops-nn!8164 | 2 个月前 | |
将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 | 1 个月前 | |
fix: 修复 10 算子 TTK golden 参考实现的输出 dtype 与 fp64 精度处理缺陷 Co-authored-by: tianqiguang<tianqiguang@huawei.com> # message auto-generated for no-merge-commit merge: !11042 merge goldenMod into master fix: 修复 10 算子 TTK golden 参考实现的输出 dtype 与 fp64 精度处理缺陷 Created-by: tianqiguang Commit-by: tianqiguang Merged-by: cann-robot Description: ## 描述 本 MR 修正 loss / norm / optim / quant 共 10 个算子的 TTK golden 参考实现( <算子>/tests/assets/golden.py),使 golden 严格按用例声明的输出 dtype(output_dtypes)生成真值,并在 TTK Promote 提供 fp64 时保留 fp64 计算精度。仅修改测试参考实现(纯 Python,numpy/torch 计算),不涉及 kernel / op_host 代码。 ### 改动原因 1. **忽略用例声明的输出 dtype(output_dtypes)**:次级输出被硬编码为 float32,不看声明。典型如 norm/deep_norm/tests/assets/golden.py:旧实现 _compute_deep_norm 直接将 mean/rstd 强制 .to(torch.float32),deep_norm_golden 只从 output_dtypes[2] 取 y 的 dtype,output_dtypes[0]/[1](mean/rstd 声明)被忽略;norm/batch_norm3_d、norm/batch_norm3_d_grad、norm/batch_norm_grad_ext2 的 batch_mean/saved_var/saved_rstd/dscale/doffset、optim/apply_adam_w_quant 的 absmax_m/absmax_v、quant/dynamic_quant_update_scatter(_v2) 的 scale/offset 同样被强制 float32。 2. **把 TTK Promote 的 fp64 精度截回 fp32**:golden 内部一律经 astype(np.float32) / .to(torch.float32)(_to_f32 / _to_torch_float32 / _to_numpy_float32 及一系列 dtype=np.float32 的归约助手),TTK Promote 送入的 fp64 输入被降为 fp32,cross_check 真值被截回 fp32(修复后代码注释对应 "retaining fp64 (TTK Promote) so the true value is not cut back to fp32")。 ### 改动方法 - **统一计算 dtype 入口**:_to_f32 → _to_compute(apply_adam_w_quant / apply_came_part4)、_to_torch_float32/_to_numpy_float32 → _to_torch_compute/_to_numpy_compute(deep_norm_grad)、_to_torch(x, dtype=float32) 改为保持输入自身 dtype(dynamic_quant_update_scatter)。语义:fp64 原样保留,fp16/bf16 提升到 fp32。 - **归约/累加助手改为输入 dtype 驱动**:batch_norm3_d_grad / batch_norm_grad_ext2 的 _sum_fp32、_sum_seq_fp32、_binary_fold_sum、_ra_split_r_channel_sum、_sum_pairwise_fp32、_chunk32_pair_channel_sum、_chunk_channel_sum、_ascend_like_channel_sum 由 np.float32 改为 x.dtype;deep_norm_grad 的 _reduce_sum_vl、_reduce_sum_regbase(_1d)、_reduce_sum_rows、_reduce_sum_rows_fp64 改为 values.dtype 驱动;新增 _compute_dtype() 判定(fp64 输入 → 全程 fp64,否则 fp32)。 - **按声明输出 dtype 生成输出**:新增 _output_dtype(kwargs, index, default) 从 TTK 传入的 output_dtypes 取声明 dtype(缺省 float32)。应用于 mean/rstd(deep_norm、deep_norm_grad)、batch_mean/saved_var/saved_rstd(batch_norm3_d)、dscale/doffset(batch_norm3_d_grad、batch_norm_grad_ext2)、dbeta/dgamma(deep_norm_grad)、absmax_m/absmax_v(apply_adam_w_quant,改为保持计算 dtype)、scale(dynamic_quant_update_scatter,改用 var_scale 实际 dtype)、out_scale/out_offset(_v2,保持原 dtype,去掉 np.float32 强制转换)。 - **常量与超参对齐计算 dtype**:apply_adam_w_quant 的 one/lr/beta1/beta2/weight_decay/eps/gnorm_scale、dynamic_quant_update_scatter 的 QUANT_MAX、_v2 的 INT4_SCALE_RANGE/INT4_QUANT_MAX/QUANT_EPSILON、batch_norm*_grad 的 reduce_count/epsilon 标量等改用 compute dtype。 - **cosine_embedding_loss**:计算 dtype 用 torch.promote_types(torch.float32, a.dtype) 并再与声明输出 dtype 提升;整数输入经 _to_compute_tensor 提升到计算 dtype;归约不再强制 dtype=torch.float32;reduction 结果按 out_dtype 输出。 - **batch_norm3_d**:__spec__ / __golden__ 增加算子名别名 batch_norm3_d(原仅注册 batch_norm3d)。 - **apply_came_part4**:_dtype_of 支持 float64;customize_inputs 增加 **kwargs 并使返回顺序与函数签名一致(sum_r 移至 sum_u_rc 之后);移除 __input__ 注册。 - **dynamic_quant_update_scatter / _v2**:_compute_dtype 由输入与声明输出 dtype 联合提升;量化写回不再经 np.float32 截断。 | # | 算子 | 文件 | +/− | |---|------|------|-----| | 1 | loss/cosine_embedding_loss | tests/assets/golden.py | +54/−18 | | 2 | norm/batch_norm3_d | tests/assets/golden.py | +36/−6 | | 3 | norm/batch_norm3_d_grad | tests/assets/golden.py | +53/−29 | | 4 | norm/batch_norm_grad_ext2 | tests/assets/golden.py | +53/−29 | | 5 | norm/deep_norm | tests/assets/golden.py | +7/−3 | | 6 | norm/deep_norm_grad | tests/assets/golden.py | +82/−55 | | 7 | optim/apply_adam_w_quant | tests/assets/golden.py | +45/−19 | | 8 | optim/apply_came_part4 | tests/assets/golden.py | +29/−21 | | 9 | quant/dynamic_quant_update_scatter | tests/assets/golden.py | +41/−10 | | 10 | quant/dynamic_quant_update_scatter_v2 | tests/assets/golden.py | +30/−13 | | | **合计** | **10 个文件** | **+430/−203** | ## 关联的Issue - #6449 ## 测试 本 MR 仅修改 TTK golden 参考实现(纯 Python,numpy/torch 计算,无 kernel / op_host 代码变更),建议按仓库 TTK ST 流程验证(需 Linux + CANN + Ascend 环境): bash cd /path/to/ops-test-kit REPO=/path/to/ops-nn # 仓内已提供用例的 3 个算子 python3 -m ttk kernel -i "$REPO/norm/deep_norm/tests/st/arch35/ttk_kernel_deep_norm_generalization.csv" \ --plugin "$REPO/norm/deep_norm/tests/assets/golden.py" python3 -m ttk kernel -i "$REPO/quant/dynamic_quant_update_scatter/tests/st/arch35/ttk_kernel_dynamic_quant_update_scatter_st.csv" \ --plugin "$REPO/quant/dynamic_quant_update_scatter/tests/assets/golden.py" python3 -m ttk kernel -i "$REPO/quant/dynamic_quant_update_scatter_v2/tests/st/arch35/ttk_kernel_dynamic_quant_update_scatter_v2_st.csv" \ --plugin "$REPO/quant/dynamic_quant_update_scatter_v2/tests/assets/golden.py" 检查点: - 各输出 dtype 与用例 output_dtypes 声明一致(如 deep_norm fp16 用例 ('float32','float32','float16')); - fp64 Promote 用例的 cross_check 真值保持 fp64,不被截回 fp32; - 既有 float16/bfloat16 用例的容差与判定不变。 ## 文档更新 本 MR 未包含文档修改。 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 - [ ] AI辅助编写 See merge request: cann/ops-nn!11042 | 3 天前 | |
fix multi_add_rms_norm_dynamic_quant gamma_dim check, add ut Co-authored-by: liu-zihao35<liuzihao35@h-partners.com> # message auto-generated for no-merge-commit merge: !5883 merge add_fusion_pass_marndq_dqusv2 into master fix multi_add_rms_norm_dynamic_quant gamma_dim check, add ut Created-by: liu-zihao35 Commit-by: liu-zihao35 Merged-by: cann-robot Description: ## 描述 multi_add_rms_norm_dynamic_quant 融合规则补充 gamma_dim 检查和 dtype检查 修复缺少 gamma_dim 检查导致的错误融合 排查其他参数检查规则并增加ut看护 1. MultiAdd fusion pass — 补充 dtype/shape 检查 - 文件:norm/.../multi_add_rms_norm_dynamic_quant_fusion_pass.cpp - 新增 IsInputDtypeValid:检查 x1 必须 FP16/BF16,所有 Add 和 AddRmsNorm x2 输入 dtype 一致,smooth_scales dtype 与 x1 匹配 - 新增 IsGammaShapeValid:检查 gamma 必须是 1 维 tensor - 在 MeetRequirements 中 IsMaxSubGraph 之后调用这两个检查 2. MultiAdd UT — 3 个反向用例 - test_wrong_dtype:输入使用 DT_FLOAT → 期望不融合 - test_gamma_wrong_shape:gamma 使用 2D shape → 期望不融合 - test_wrong_platform:设置 Ascend310P 平台 → 期望不融合 3. DQUSv2 UT — 1 个反向用例 - test_wrong_x_dtype:x 使用 DT_FLOAT → 期望不融合 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> ## 关联的Issue [#3203](https://gitcode.com/cann/ops-nn/issues/3203) <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> ## 测试 graph_ut、新增异常用例、泛化st、整网用例 <!--描述进行了哪些测试来验证你的改动。--> ## 文档更新 不涉及 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-nn!5883 | 3 个月前 | |
修改产品名 Co-authored-by: fwx1169505<fengying27@h-partners.com> # message auto-generated for no-merge-commit merge: !11017 merge master into master 修改产品名 Created-by: fengying555682 Commit-by: fwx1169505 Merged-by: cann-robot Description: ## 描述 修改quant和activation文件夹中的md文档涉及的产品名称 ## 关联的Issue [#6056](https://gitcode.com/cann/ops-nn/issues/6056) ## 测试 已经完成文档语法和链接一致性检测 ## 文档更新 quant和activation文件夹中的md文档 ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [x ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [ ] AI辅助编写 See merge request: cann/ops-nn!11017 | 21 天前 |
DynamicQuantUpdateScatterV2
产品支持情况
| 产品 | 是否支持 |
|---|---|
| Ascend 950PR&950DT系列产品 | √ |
| Atlas A3系列产品 | × |
| Atlas A2系列产品 | √ |
| kirin X90处理器系列产品 | √ |
| kirin 9030处理器系列产品 | √ |
功能说明
- 算子功能:将DynamicQuantV2和ScatterUpdate单算子自动融合为DynamicQuantUpdateScatterV2融合算子,以实现INT4类型的非对称量化。
- 过程描述:原始数据x首先经过DynamicQuantV2算子处理,将其转化为INT4类型,并输出对应的缩放因子scale和偏移量offset。随后,三个不同的ScatterUpdate以插入索引indices、三个初始数据(var,var_scale和var_offset)和DynamicQuantV2算子的三个输出(即量化后的数据,scale和offset)作为输入按指定位置执行写入更新操作,最终得到三个原地更新输出var,var_scale和var_offset,分别对应量化更新后的数据及其对应的量化参数。
参数说明
| 参数名 | 输入/输出/属性 | 描述 | 数据类型 | 数据格式 |
|---|---|---|---|---|
| x | 输入 | 量化输入,对应过程描述中的"x"。不支持空Tensor。 | FLOAT16、BFLOAT16 | ND |
| indices | 输入 | 量化数据更新索引,对应过程描述中的"indices"。不支持空Tensor。 | INT32 | ND |
| var | 输入/输出 | 需要更新的量化结果,对应过程描述中的"var"。不支持空Tensor。 | INT4 | ND |
| var_scale | 输入/输出 | 需要更新的量化scale因子,对应过程描述中的"var_scale"。不支持空Tensor。 | FLOAT | ND |
| var_offset | 输入/输出 | 需要更新的量化offset因子,对应过程描述中的"var_offset"。不支持空Tensor。 | FLOAT | ND |
- Kirin X90/kirin 9030处理器系列产品:不支持BFLOAT16。
约束说明
- 量化方式支持非对称量化,量化数据类型支持INT4。
- 量化不支持smooth_scale输入。
- INT4量化情况下,输入x的尾轴要能被2整除。
- 输入x的shape为(B, 1, H),var的shape为(B, S, 1, H),var_scale和var_offset的shape为(B, S)。
- 自动融合场景要求H能被8整除且H不超过14960。
- DynamicQuantV2的output0为INT4类型,output1为FLOAT类型,output2为FLOAT类型。
- DynamicQuantV2的输入dtype必须为FLOAT16或者BFLOAT16。input1如果存在,且input2如果不存在,input1的shape必须是1维,且等于input0的最后一维;若input2存在,input1是两维,第一维大小是专家数,不超过1024,第二维大小等于input0的最后一维。
调用说明
| 调用方式 | 调用样例 | 说明 |
|---|---|---|
| 图模式调用 | test_geir_dynamic_quant_update_scatter_v2 | 通过算子IR构图方式调用DynamicQuantUpdateScatterV2算子。 |