| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
产品名称修改 Co-authored-by: y60124828<yanglou1@h-partners.com> # message auto-generated for no-merge-commit merge: !11292 merge master into master 产品名称修改 Created-by: yanglu-1 Commit-by: y60124828 Merged-by: cann-robot Description: ## 描述 产品名称修改 ## 关联的Issue 关联Issue [#6089](https://gitcode.com/cann/ops-nn/issues/6089) ## 测试 <!--描述进行了哪些测试来验证你的改动。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [ ] AI辅助编写 See merge request: cann/ops-nn!11292 | 4 天前 | |
产品名称修改 Co-authored-by: y60124828<yanglou1@h-partners.com> # message auto-generated for no-merge-commit merge: !11292 merge master into master 产品名称修改 Created-by: yanglu-1 Commit-by: y60124828 Merged-by: cann-robot Description: ## 描述 产品名称修改 ## 关联的Issue 关联Issue [#6089](https://gitcode.com/cann/ops-nn/issues/6089) ## 测试 <!--描述进行了哪些测试来验证你的改动。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [ ] AI辅助编写 See merge request: cann/ops-nn!11292 | 4 天前 | |
feat(rnn): 新增 BlockLstm 算子(对标 tf.raw_ops.BlockLstm V1/V2) Co-authored-by: eternityk<taoyikun@huawei.com> # message auto-generated for no-merge-commit merge: !9170 merge BlockLSTM into master feat(rnn): 新增 BlockLstm 算子(对标 tf.raw_ops.BlockLstm V1/V2) Created-by: eternityk Commit-by: eternityk Merged-by: cann-robot Description: ## 描述 长尾 RNN 系网络广泛使用 TensorFlow 的 tf.raw_ops.BlockLSTM(V1,gate_order=icfo)与 tf.raw_ops.BlockLSTMV2(V2,gate_order=ifco)作为 LSTM 层的 block 形式前向算子。该算子把整个时间步循环收进**一次 kernel launch**(block 语义:不逐步暴露中间状态给框架),迁移到 Ascend 950 平台时缺失对应算子,网络无法下沉 NPU 执行。 当前缺口: - PyTorch 无同名 block 形式公开算子(torch.nn.LSTM 不暴露逐门输出,无 peephole),无现成对标实现 - CANN 现有 RNN 族(如 DynamicRNN)为逐步展开路径,与 TF BlockLSTM 语义/接口不匹配 ## 关联的Issue [#6204](https://gitcode.com/cann/ops-nn/issues/6204) ## 测试 构造geir/e2e通路测试用例各500+条,测试通过。 ## 文档更新 新增了README.md文件。 ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [x] AI辅助编写 See merge request: cann/ops-nn!9170 | 3 天前 | |
feat(rnn): 新增 BlockLstmGrad 算子(对标 tf.raw_ops.BlockLstmGrad V1/V2) Co-authored-by: eternityk<taoyikun@huawei.com> # message auto-generated for no-merge-commit merge: !10694 merge BlockLSTMGRAD into master feat(rnn): 新增 BlockLstmGrad 算子(对标 tf.raw_ops.BlockLstmGrad V1/V2) Created-by: eternityk Commit-by: eternityk Merged-by: cann-robot Description: ## 描述 BlockLstmGrad 是 BlockLSTM(分块长短期记忆网络)的**反向梯度算子**,对应 TensorFlow 原生算子 tf.raw_ops.BlockLSTMGrad(V1)与 tf.raw_ops.BlockLSTMGradV2(V2)。 LSTM 是序列建模(语音识别、机器翻译、时序预测、语言模型)的核心结构。其反向传播需沿时间步逆序递推回传梯度,计算输入、权重、偏置及各门控的梯度共 8 个梯度张量。BlockLSTM 将单个时间步内 4 个门(input/forget/cell/output)的计算融合为单个算子,反向同理——BlockLstmGrad 在一次调用内完成整段序列(T 个时间步)的反向递推,避免逐门逐步骤的算子碎片化开销。 当前 CANN ops-nn 仓 rnn 分类下已交付前向 block_lstm,但**缺少反向算子**:TF BlockLSTM 网络在 NPU 上训练时反向图无法落图(回退 CPU 或训练不可用)。本算子补齐该闭环。 **对标结论**:数学公式 **1:1 移植自 TF v2.21 lstm_ops**(carry 序、乘法序、gate 布局保留);PyTorch 无对等独立算子(其 LSTM 反向封装于 cuDNN/autograd 内),故竞品对标以 TensorFlow 为准。 ## 关联的Issue [#6208](https://gitcode.com/cann/ops-nn/issues/6208) ## 测试 构造geir/e2e通路测试用例各500+条,测试通过。 ## 文档更新 新增了README.md文件。 ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [x] AI辅助编写 See merge request: cann/ops-nn!10694 | 4 天前 | |
feat(dynamic_augru_grad): 新增 DynamicAUGRUGrad 反向算子(arch35,融合 seq_length 掩码生成) Co-authored-by: Huang-Peng<huangpeng98@huawei.com> # message auto-generated for no-merge-commit merge: !10986 merge pr-10063-dynamic-augru-grad into master feat(dynamic_augru_grad): 新增 DynamicAUGRUGrad 反向算子(arch35,融合 seq_length 掩码生成) Created-by: Huang-Peng Commit-by: Huang-Peng Merged-by: cann-robot Description: ## 描述 新增 DynamicAUGRUGrad(带注意力更新门 GRU/AUGRU 的反向算子),按 BPTT(时间步 T-1 → 0)计算输入、初始隐状态、权重与偏置的梯度,并额外输出注意力梯度 dw_att。 - **反向计算**:输出 dw_input [I,3H]、dw_hidden [H,3H]、db_input/db_hidden [3H]、dx [T,B,I]、dh_prev [B,H]、dw_att [T,B];支持 gate_order 为 zrh/rzh。 - **掩码融合**:传入 seq_length(INT32 [B])时在 kernel 内在线生成变长掩码 seq_mask[t,b] = (t < seq_length[b]) ? 1 : 0 并作用于梯度回传,无需外部再接独立的掩码生成算子;不传时等价全 1 掩码。 - **算子原型与图模式**:op_graph/dynamic_augru_grad_proto.h 定义原型(15 输入 / 7 输出 / 8 属性),dynamic_augru_grad_graph_infer.cpp 实现图模式推理。 - **Host 侧**:dynamic_augru_grad_infershape.cpp 形状推导、op_host/arch35/dynamic_augru_grad_tiling_arch35.cpp arch35 tiling、dynamic_augru_grad_def.cpp 算子注册。 - **Kernel**:op_kernel/dynamic_augru_grad.cpp 入口 + op_kernel/arch35/dynamic_augru_grad.h 主体实现,支持 FLOAT16/FLOAT32。 - **构建配置**:新增算子 CMakeLists,并在 scripts/kernel/binary_config/ascendc_config.json 注册。 ## 关联的Issue 关联Issue #6111 ## 测试 - Host UT:tests/ut/op_host/test_dynamic_augru_grad_infershape.cpp(形状推导)、tests/ut/op_host/arch35/test_dynamic_augru_grad_tiling.cpp(arch35 tiling)。 - Kernel UT:tests/ut/op_kernel/test_dynamic_augru_grad.cpp。 - ST:tests/st/arch35/ttk_kernel_dynamic_augru_grad_st.csv 与 ttk_kernel_dynamic_augru_grad_precision.csv。 - Golden:tests/assets/golden.py + tests/assets/test_golden.py 校验。 - GE 图样例:examples/arch35/test_geir_dynamic_augru_grad.cpp、test_geir_dynamic_augru_grad_dynamic.cpp(含动态 Shape 场景)。 ## 文档更新 - 新增 rnn/dynamic_augru_grad/README.md:算子功能、反向计算公式、参数说明与掩码语义。 - 更新 docs/zh/op_list.md:新增 dynamic_augru_grad 算子条目。 ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [ ] AI辅助编写 See merge request: cann/ops-nn!10986 | 5 天前 | |
feat(dynamic_augru_grad): 新增 DynamicAUGRUGrad 反向算子(arch35,融合 seq_length 掩码生成) Co-authored-by: Huang-Peng<huangpeng98@huawei.com> # message auto-generated for no-merge-commit merge: !10986 merge pr-10063-dynamic-augru-grad into master feat(dynamic_augru_grad): 新增 DynamicAUGRUGrad 反向算子(arch35,融合 seq_length 掩码生成) Created-by: Huang-Peng Commit-by: Huang-Peng Merged-by: cann-robot Description: ## 描述 新增 DynamicAUGRUGrad(带注意力更新门 GRU/AUGRU 的反向算子),按 BPTT(时间步 T-1 → 0)计算输入、初始隐状态、权重与偏置的梯度,并额外输出注意力梯度 dw_att。 - **反向计算**:输出 dw_input [I,3H]、dw_hidden [H,3H]、db_input/db_hidden [3H]、dx [T,B,I]、dh_prev [B,H]、dw_att [T,B];支持 gate_order 为 zrh/rzh。 - **掩码融合**:传入 seq_length(INT32 [B])时在 kernel 内在线生成变长掩码 seq_mask[t,b] = (t < seq_length[b]) ? 1 : 0 并作用于梯度回传,无需外部再接独立的掩码生成算子;不传时等价全 1 掩码。 - **算子原型与图模式**:op_graph/dynamic_augru_grad_proto.h 定义原型(15 输入 / 7 输出 / 8 属性),dynamic_augru_grad_graph_infer.cpp 实现图模式推理。 - **Host 侧**:dynamic_augru_grad_infershape.cpp 形状推导、op_host/arch35/dynamic_augru_grad_tiling_arch35.cpp arch35 tiling、dynamic_augru_grad_def.cpp 算子注册。 - **Kernel**:op_kernel/dynamic_augru_grad.cpp 入口 + op_kernel/arch35/dynamic_augru_grad.h 主体实现,支持 FLOAT16/FLOAT32。 - **构建配置**:新增算子 CMakeLists,并在 scripts/kernel/binary_config/ascendc_config.json 注册。 ## 关联的Issue 关联Issue #6111 ## 测试 - Host UT:tests/ut/op_host/test_dynamic_augru_grad_infershape.cpp(形状推导)、tests/ut/op_host/arch35/test_dynamic_augru_grad_tiling.cpp(arch35 tiling)。 - Kernel UT:tests/ut/op_kernel/test_dynamic_augru_grad.cpp。 - ST:tests/st/arch35/ttk_kernel_dynamic_augru_grad_st.csv 与 ttk_kernel_dynamic_augru_grad_precision.csv。 - Golden:tests/assets/golden.py + tests/assets/test_golden.py 校验。 - GE 图样例:examples/arch35/test_geir_dynamic_augru_grad.cpp、test_geir_dynamic_augru_grad_dynamic.cpp(含动态 Shape 场景)。 ## 文档更新 - 新增 rnn/dynamic_augru_grad/README.md:算子功能、反向计算公式、参数说明与掩码语义。 - 更新 docs/zh/op_list.md:新增 dynamic_augru_grad 算子条目。 ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [ ] AI辅助编写 See merge request: cann/ops-nn!10986 | 5 天前 | |
产品名称修改 Co-authored-by: y60124828<yanglou1@h-partners.com> # message auto-generated for no-merge-commit merge: !11292 merge master into master 产品名称修改 Created-by: yanglu-1 Commit-by: y60124828 Merged-by: cann-robot Description: ## 描述 产品名称修改 ## 关联的Issue 关联Issue [#6089](https://gitcode.com/cann/ops-nn/issues/6089) ## 测试 <!--描述进行了哪些测试来验证你的改动。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [ ] AI辅助编写 See merge request: cann/ops-nn!11292 | 4 天前 | |
fix(dynamic_rnn): 修复 op_api codecheck 告警 Co-authored-by: weike<weike13@huawei.com> # message auto-generated for no-merge-commit merge: !11334 merge fix/codecheck-dynamic-rnn into master fix(dynamic_rnn): 修复 op_api codecheck 告警 Created-by: m0_55003149 Commit-by: weike Merged-by: cann-robot Description: ## 描述 修复 codecheck 报告中 dynamic_rnn 算子 op_api 的 13 处告警(规则 G.CNS.02-CPP / G.EXP.27-CPP / G.EXP.08-CPP),。 ## 关联的Issue (https://gitcode.com/cann/ops-nn/issues/6283) ## 测试 - dynamic_rnn op_api UT:改动前 10/10 PASSED,改动后 10/10 PASSED,结果一致。 ## 文档更新 不涉及 ## 类型标签 - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [x] 其他,请描述:CodeCheck 静态检查缺陷整改(魔数 / 浮点判等 / 空指针) ## AI/Agent生成声明 - [x] AI辅助编写 See merge request: cann/ops-nn!11334 | 4 天前 | |
产品名称修改 Co-authored-by: y60124828<yanglou1@h-partners.com> # message auto-generated for no-merge-commit merge: !11292 merge master into master 产品名称修改 Created-by: yanglu-1 Commit-by: y60124828 Merged-by: cann-robot Description: ## 描述 产品名称修改 ## 关联的Issue 关联Issue [#6089](https://gitcode.com/cann/ops-nn/issues/6089) ## 测试 <!--描述进行了哪些测试来验证你的改动。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [ ] AI辅助编写 See merge request: cann/ops-nn!11292 | 4 天前 | |
gru/gru_grad算子适配Ascend 950 Co-authored-by: wlfsnw<wuluofei@h-partners.com> # message auto-generated for no-merge-commit merge: !11015 merge gru-gru-grad-a5-review into master gru/gru_grad算子适配Ascend 950 Created-by: wlfsnw Commit-by: wlfsnw Merged-by: cann-robot Description: ## 变更说明 gru/gru_grad 算子适配 Ascend 950,修订 aclnn 接口文档与实现一致性,并完成精度、缺陷修复与评审整改。 ### 一、A5 适配 - rnn/gru、rnn/gru_grad:单一 tiling/kernel 同时支持 ascend910b / ascend910_93 / ascend950(不拆分 arch 子目录) - OpDef 新增 AddConfig("ascend950"),L0 SOC 守卫放行 RegBase 代际;README 补 950 支持说明 ### 二、aclnn 接口文档修订 对照实现修订 aclnnGRU.md / aclnnGRUBackward.md 共 22 处不一致,主要包括:维度与 shape 约束按模式强制、packed 模式排布公式修正、列表长度公式修正、错误码触发表补全、参数命名与头文件对齐。 ### 三、精度与缺陷修复 - gru n 门 Tanh 高精度化:TanhAdaptive 按代际自适应,3510(Ascend950)走 SUBSECTION_COMPENSATION 分段补偿算法修复小值域精度问题,其余代际走通用 Tanh 保证多代际编译通过 - gru T=0 空 tensor 拦截(timeStep≤0 返回 161002) - gru packed 路径 hx 判空守卫 - gru_grad 跨 tile 数据竞争修复(ProcessVectorHTile 补 SyncVtoM2) - gru_grad dgateMM 超大 K 形态 tiling 归一化,修复 MTE2 越界(RegBase 代际门控) ### 四、评审整改 - SoC 判断替换为已封装接口:op_api 侧 Ops::NN::AclnnUtil::IsRegbase(),tiling 侧 Ops::NN::OpTiling::IsRegbaseSocVersion - dgateMM 归一化魔鬼数字常量化(DGATE_MM_K_RESIDENT_ALIGN / DGATE_MM_STREAMING_DEPTH) - 注释清理:去除过程性信息与重复注释 - 合并最新 master 并解冲突(aclnnGRUBackward.md 按评审意见保留/回退对应表述) - 提交作者邮箱修正(历史遗留本地占位邮箱导致 CLA 校验失败) ### 验证 - A2(Ascend910B1)/ A5(Ascend950PR_9599)× fp16/fp32 共 8 组 kernel 编译全部通过 - 宿主侧 tiling/op_api 单文件编译验证通过 - 文档修订逐条对照实现核实闭合 ## 关联Issue Closes #6209 See merge request: cann/ops-nn!11015 | 5 天前 | |
修复gruBlockCell用例性能 Co-authored-by: Davon14272<liuwenda4@huawei.com> # message auto-generated for no-merge-commit merge: !11325 merge perf/gru-block-cell into master 修复gruBlockCell用例性能 Created-by: Davon14272 Commit-by: Davon14272 Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> 1. **MN 欠并行**(skill streamk_design.md 场景 1 判定):多核切分只切 M(MultiCoreSplitRows), B < 28×mChunk 时 coreNumUsed=1~4,列片在块内串行——权重流读集中在少数核 (实测单核有效带宽 ~35GB/s) 2. **逐组同步握手**(skill pingpong_design.md 问题 3 紧耦合的加强版):AIC 对每个 (列片, 组) 执行「A 现搬 → Mmad→Fixpipe→C2V 同步门」,r/u 两门串行;kg=16 是精度契约 (AIV 侧 Neumaier 逐组归并),不可直接放大 → K=8192 时 512 组 × 2 门 × 同步开销 3. 无 pingpong:aK 单槽,MTE2/Mmad/C2V 不重叠 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> ## 测试 <!--描述进行了哪些测试来验证你的改动。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [ ] AI辅助编写 See merge request: cann/ops-nn!11325 | 3 天前 | |
产品名称修改 Co-authored-by: y60124828<yanglou1@h-partners.com> # message auto-generated for no-merge-commit merge: !11292 merge master into master 产品名称修改 Created-by: yanglu-1 Commit-by: y60124828 Merged-by: cann-robot Description: ## 描述 产品名称修改 ## 关联的Issue 关联Issue [#6089](https://gitcode.com/cann/ops-nn/issues/6089) ## 测试 <!--描述进行了哪些测试来验证你的改动。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [ ] AI辅助编写 See merge request: cann/ops-nn!11292 | 4 天前 | |
修复 gru_grad readme中的错误 Co-authored-by: sakuraqqz<furao15@h-partners.com> # message auto-generated for no-merge-commit merge: !11324 merge master into master 修复 gru_grad readme中的错误 Created-by: sakuraqqz Commit-by: sakuraqqz Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> 修复 gru_grad readme中的错误 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> https://gitcode.com/cann/ops-nn/issues/6285 ## 测试 <!--描述进行了哪些测试来验证你的改动。--> 无 ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> rnn/gru_grad/README.md ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [ ] AI辅助编写 See merge request: cann/ops-nn!11324 | 4 天前 | |
feat(rnn): 新增 Ascend950 LstmBlockCell 算子及 GEIR 支持 Co-authored-by: wang-zhiyue2<wangzhiyue2@huawei.com> # message auto-generated for no-merge-commit merge: !10831 merge lstmblock into master feat(rnn): 新增 Ascend950 LstmBlockCell 算子及 GEIR 支持 Created-by: wang-zhiyue2 Commit-by: wang-zhiyue2 Merged-by: cann-robot Description: ## 描述 新增 Ascend950 LstmBlockCell 算子,按 arch35 布局接入 rnn/lstm_block_cell,对标 TensorFlow tf.raw_ops.LSTMBlockCell 单步前向语义(8输入/7输出/3属性,fp32/fp16 双档)。 ### 计算公式(单步前向,门序 i|ci|f|o) IN : x [B,I], cs_prev [B,H], h_prev [B,H], w [I+H,4H], wci/wcf/wco [H], b [4H] ATTR: forget_bias (默认1.0), cell_clip (默认3.0), use_peephole (默认false) OUT: i/cs/f/o/ci/co/h,各 [B,H] ① 投影 GEMM(K = I+H,[x|h_prev] 沿 K 拼接;w 列序 i|ci|f|o): gates = [x, h_prev] · w + b ∈ R^{B×4H} ② 门控 logit(属性逐项标注): i_logit = gates[:, 0:H) + (use_peephole == true ? cs_prev ⊙ wci : 0) ci_logit = gates[:, H:2H) f_logit = gates[:, 2H:3H) + forget_bias + (use_peephole == true ? cs_prev ⊙ wcf : 0) o_logit = gates[:, 3H:4H) + (use_peephole == true ? cs ⊙ wco : 0) (o 的 peephole 用更新并裁剪后的新 cs) ③ ICFO 激活与状态更新: i = σ(i_logit) ci = tanh(ci_logit) f = σ(f_logit) cs = f ⊙ cs_prev + i ⊙ ci cs = (cell_clip > 0) ? clip(cs, -cell_clip, +cell_clip) : cs (cell_clip ≤ 0 不裁剪) co = tanh(cs) o = σ(o_logit) h = o ⊙ co 补充语义:use_peephole=false 时 wci/wcf/wco 不参与计算但仍为必填输入(TF 侧约定零填充而非缺席);σ 为 sigmoid,⊙ 为逐元素乘;±Inf 经 σ/tanh 饱和,钳位以 Compares+Select 实现、NaN 逐元素传播。 ### kernel 内 gates 的切分计算(K-split) gates[m,j] = Σ_{k=0}^{K-1} [x|h][m,k]·w[k,j] = Σ_{s=0}^{S-1} partial_s[m,j] # partial_s = Σ_{k∈段s}(各 AIC 并行) # bias 仅种入 partial_0(恰加一次) # 段内:单核 L0C fp32 串行累加;段间:AIV Kahan 补偿归并 - **op_host**:OpDef / InferShape(IMPL_OP_INFERSHAPE 分离注册,支持 -1 未知维 / -2 未知 rank 声明)/ arch35 TilingFunc(IMPL_OP_OPTILING + TilingParse<CompileInfo>)。M/N/K 全轴切分 tile 搜索与 kernel 共享同一份片上容量公式(proj_budget.h -> fwd_layout.h -> onchip_budget.h),片上放不下的 shape 在 host 侧拒绝 - **op_kernel(arch35,MIX 1 AIC : 2 AIV)**:投影 GEMM 采用 K-split 两段式结构(AIC 各段 partials 直落 GM workspace,AIV 网格屏障后 Kahan 补偿归并),ICFO 门控激活含 forget_bias / peephole / cell_clip(钳位以 Compares+Select 实现,NaN 逐元素传播) - **op_graph**:proto.h(双层去重宏)+ graph_infer(InferDataType) - **framework**:TF 插件(dtype 前向设置,避免 ATC 为全 fp32 图误选 fp16 kernel 并以 trans_Cast 桥接全图) - **examples**:GEIR 静态/动态示例(确定性输入构造 + 独立双精度 golden 数值比对,rtol=1e-5/atol=1e-6) - 同步 docs/zh/op_list.md ## 关联的Issue 无 ## 测试 - 隔离构建成功(bash build.sh --soc=Ascend950 --pkg --ops=lstm_block_cell -j16)并安装 - GEIR 示例:静态 1/1(7 输出逐元素比对)、动态 -1/-2 场景各 3/3 + 非 rank-2 输入拒绝探针 2/2,全部 PASS - TTK GEIR cross-check 硬核精度集 12 条:11 PASS + 1 条维持既定 NaN/Inf 行为差异类(含近零消减、大 K 分段、fp16 舍入链、超大 batch 多轮等压例) - ops-admission-scan 白盒扫描:约束 30/30 PASS、资料一致性 0 FAIL - 代码检视(ascendc-code-review file-review 工作流)11 项意见全部修复并复验 ## 文档更新 新增 rnn/lstm_block_cell/README.md;更新 docs/zh/op_list.md ## 关联需求 Closes #6276([Requirement|需求建议]: 新增 LstmBlockCell 算子,Ascend950) ## 类型标签 - [x] 新特性 ## AI/Agent生成声明 - [x] AI辅助编写 See merge request: cann/ops-nn!10831 | 4 天前 | |
feat(rnn): 新增 LSTMBlockCellGrad 算子(对标 tf.raw_ops.LSTMBlockCellGrad) Co-authored-by: KDC202<1664969415@qq.com> # message auto-generated for no-merge-commit merge: !10942 merge feat/lstm-block-cell-grad into master feat(rnn): 新增 LSTMBlockCellGrad 算子(对标 tf.raw_ops.LSTMBlockCellGrad) Created-by: KDC202 Commit-by: KDC202 Merged-by: cann-robot Description: ## 功能说明 新增 rnn 类算子 LSTMBlockCellGrad,语义与 TensorFlow tf.raw_ops.LSTMBlockCellGrad 完全对齐(16 输入 / 5 输出 / use_peephole 属性逐项一致): - 由 cs_grad 与 h_grad 结合前向门控中间量 i/cs/f/o/ci/co,重建 cs_prev_grad、融合门 pre-activation 梯度 dicfo(列块 [di, dci, df, do],与前向融合权重 w 的 icfo 列序一致)及三个窥孔权重梯度 wci/wcf/wco_grad - use_peephole=false 时窥孔权重梯度精确全 0(与 TF 原生行为一致) - 梯度链按 TF CPU functor 左结合求值序实现,fp16 路径逐算子中间舍入,bitwise 对齐 TF half kernel - 支持 float32/float16 × use_peephole true/false(tilingKey {0, 1, 4, 5}),空张量短路 - GE 图模式调用,tf_plugin 认领 TF 前端构图节点;支持 Ascend 950PR/950DT(arch35) ## 变更清单 - rnn/lstm_block_cell_grad/:op_host(def / infershape / arch35 tiling)、op_kernel(arch35)、op_graph(图推断 / proto)、examples(geir 调用样例)、framework/tf_plugin、README - docs/zh/op_list.md:rnn 分区新增索引条目 See merge request: cann/ops-nn!10942 | 5 天前 | |
feat(rnn): 新增 SingleLayerLstm, 并挂进 aclnnLSTM 的 SoC 分派 Co-authored-by: Fan Yuwei<fanyuwei2@huawei.com> Co-authored-by: Xinxian Chen<chenxinxian1@huawei.com> # message auto-generated for no-merge-commit merge: !10108 merge feat/single-layer-lstm into master feat(rnn): 新增 SingleLayerLstm, 并挂进 aclnnLSTM 的 SoC 分派 Created-by: fanyuwei_math Commit-by: Fan Yuwei;fanyuwei_math;Xinxian Chen Merged-by: cann-robot Description: ## 描述 **Ascend 950 上目前没有可用的 LSTM。** CANN 9.1.0 的内置 opp 里, DynamicRNN 出现在 ascend910b 与 ascend910_93 的 ops-info 配置中, 在 ascend950 的五个 ops-info json 里 出现 **0 次**; ascend950/ops_nn 下 365 个内核二进制没有一个匹配 rnn/lstm。于是 A5 上: - aclnn 通路: aclnnLSTM 会建出 DynamicRNN 节点, 但没有对应的 950 二进制; - aclop 通路: acl_op::lstm 的 OpCommand.Name("DynamicRNN") 在 950 的 ops-info 里选不到算子。 两条都到不了 kernel。这是能力缺口, 不是性能问题。 本 MR 新增 rnn/single_layer_lstm —— 单层、单方向、fp32 的 LSTM 前向 L0 算子, 承担 PyTorch nn.LSTM 的主路径, 并在 A5 上逐步取代 DynamicRNN。 ### 不新增对外接口 aclnnLSTM 一个参数都不改, 在其内部按 SoC 与能力分派: aclnnLSTM ├─ ascend950 且 fp32 且 单向 且 batchSizes 为空 -> l0op::SingleLayerLstm (本 MR) └─ 其余 -> l0op::DynamicRNN (现状, 一字不改) 分派点在 rnn/dynamic_rnn/op_api/aclnn_lstm.cpp 的 LstmSingleLayerDirec —— **本 MR 唯一 改动的既有文件**。选在这个函数里, 是因为它本来就按 (层, 方向) 各调一次: 多层与双向的调用会 一条腿一条腿地进来, 每条腿按自己的形状单独判。 因此本目录**没有** op_api/aclnn*.h、docs/acl*.md、op_graph/、framework/ —— 与 rnn/single_layer_lstm_grad 的形态一致。只被 aclnn 调用的 L0 算子不需要 REG_OP; 将来图模式要用时再补, 那时 op_graph/ 与 framework/ 各自带自己的检视门。 结构上与 at::native::lstm 的后端阶梯、cuDNN get_algo 的三档选择是同一回事。 ### 不新增反向 SingleLayerLstmGrad 已注册 ascend950 且已有 arch35 kernel (op_kernel/arch35/single_layer_lstm_grad_regbase_small.h + op_host/config/ascend950/single_layer_lstm_grad_binary.json)。本前向的八个输出正是它的输入, 不需要任何 reshape。**反向侧本 MR 一字未动。** ### 分派闸门必须与 tiling 同源 aclnn 在**建 executor 时**选节点, tiling 在**下发时**拒绝 —— 选完之后再被拒是整个 aclnnLSTM 调用死掉, 而不是回落到 DynamicRNN。所以 l0op::SingleLayerLstmSupports() 必须至少和它挡在前面的 tiling 一样严。 它直接 include op_host/arch35/single_layer_lstm_budget.h (该头是 plain C++, 无 AscendC), 调用 tiling 用的**同一份**片上容量算术 RecurrenceFits / PickRowsPerBlock, 两者不可能漂移。 dtype、属性与 8 倍数三条在闸门里各自陈述 (tiling 要用它们组错误消息), 注释中点名了这是需要 同步维护的行。 ### 两处契约不一致, 已在分派处适配 | | DynamicRNN | SingleLayerLstm | |---|---|---| | 状态秩 | [1, B, H] | [B, H], 用 l0op::Reshape | | l0 输出顺序 | (y, i, j, f, o, h, c, tanhc) | (y, output_h, output_c, i, j, f, o, tanhc), 重排 tuple | 后者是 OpDef 的声明顺序; 重排之后 LstmSingleLayerDirec 下游看到的顺序与走哪个节点无关。 ### gate_order 取 "ifjo" 而不是 def 层默认的 "ijfo" 这两个属性是**成对**的。所有 dynamic_rnn 的 binary config —— ascend910b / ascend910_93 / ascend950 三个芯片完全一致 —— 只预编两个特化: ("ifjo", UNIDIRECTIONAL) 与 ("ijfo", REDIRECTIONAL), **任何芯片上都没有 ("ijfo", UNIDIRECTIONAL)**。而所有实际调用方传的都是 "ifjo": dynamic_rnn.cpp 的 l0op 包装、aclnn_lstm_backward.cpp、framework/npu_lstm_onnx_plugin.cpp。def 里的 "ijfo" 是 GEIR 默认值, aclnn 每次调用都覆盖它。本算子的 single_layer_lstm_binary.json 只有一条, 正是 ("ifjo", UNIDIRECTIONAL)。 ### 拒绝而不是静默忽略 direction / gate_order 非默认值、非 fp32、I 或 H 不是 8 的倍数、H 超出 L0B 上界 —— 全部在 tiling 阶段拒绝并给出点名参数的消息。被静默忽略的非默认属性会训出一个看起来合理的错 模型; 一次拒绝只让调用方多收一条错误信息。 ## 关联的Issue 无直接关联。与 [issue 5627](https://gitcode.com/cann/ops-nn/issues/5627) (A5 上 LSTM 个别 用例劣于 A2) 及 [PR 9976](https://gitcode.com/cann/ops-nn/pull/9976) 同域但不重叠: 那两个针对 DynamicRNN 现有实现的精度, 本 MR 是 A5 上的另一条实现路径, **不主张**解决 5627。若能提供 5627 失败用例的 shape, 我们可以用同一套探针把两条路径一起量出来。 本 MR 取代 [PR 9339](https://gitcode.com/cann/ops-nn/pull/9339) —— 那个 MR 的做法是新增 aclnnLstmV2 / aclnnLstmBackwardV2 两个接口; 该形态已否, 9339 将随本 MR 关闭。 ## 测试 **主机侧 UT (CANN 9.1.0, x86 主机): 13/13 通过。** sh bash build.sh -u --ophost --ops=single_layer_lstm --soc=ascend950 | 项 | 用例数 | |---|---| | tiling: 2 个接受形状 + 6 个拒绝形状 | 8 | | InferShape: 输出形状 + 秩拒绝 | 2 | | 片上预算与拒绝 | 3 | ⚠ **--soc=ascend950 不能省。** 不带它时 CMake 传 -UASCEND_COMPUTE_UNIT, 本目录 CMakeLists.txt 的 SUPPORT_COMPUTE_UNIT "ascend950" 匹配不上, op_host/arch35/ 下的 tiling 根本不参与编译, IMPL_OP_OPTILING 没有注册, ExecuteTiling 拿到空函数指针后 段错误。那不是算子的缺陷, 是编译配置没选中 arch35 —— 先说在前面, 免得 CI 用默认命令跑出一个 吓人的崩溃。 **真机 (Ascend950PR_9579, 28 AICORE, CANN 9.1.0), 全部经由 aclnnLSTM 调用:** | 项 | 结果 | |---|---| | 分派 T=64 B=32 I=64 H=64 | 走 SingleLayerLstm (msprof op_statistic, MIX_AIC 1 次 362.410 us) | | 回落 H=256 (超出 L0B 上界) | 静默回落 DynamicRNN, **不是报错** | | 精度, 8 个形状 (I 16--1024, H 32--256, T 2--32) | 0.4x--1.2x, 跨分派边界无台阶 | | train=0 与 train=1 | 结果逐位相同, 都走 SingleLayerLstm | | 多层 L = 1 / 2 / 3 | SingleLayerLstm 分别被下发 1 / 2 / 3 次 (op_statistic 的 Count 逐一对上), 精度 0.7x--1.1x | | batchFirst = true, L = 1 / 2 | 同样每层一次, 精度 0.6x--1.2x | **性能对照。** 两侧都经由 aclnnLSTM, 只换装的包 —— 一个把分派强制关掉 (一律走 DynamicRNN), 一个是本 MR。**因此两侧的辅助算子完全相同** (同一份 PrepareWeightTrans / PrepareBias / Slice), 比值是 kernel 对 kernel 的。每轮 = GetWorkspaceSize + 执行 + 同步, 预热后 20 轮均值: | 形状 | DynamicRNN | SingleLayerLstm | 比值 | |---|---:|---:|---:| | T=16 / 64 / 128 / 256 (B=32 I=64 H=64) | 128.8 / 419.6 / 807.5 / 1575.9 us | 90.3 / 296.1 / 580.1 / 1109.1 us | 1.43 / 1.42 / 1.39 / 1.42x | | H=32 / 64 / 128 (T=64 B=32 I=64) | 356.8 / 420.2 / 550.4 us | 260.8 / 296.1 / 462.6 us | 1.37 / 1.42 / 1.19x | | L=2 (T=64 B=32 I=64 H=64) | 849.9 us | 603.1 us | 1.41x | 比值对 T 不敏感, 对 H 敏感 —— H=128 已贴着 L0B 上界, 收窄到 1.19x; 优势最大的区间 恰好也是支持的区间。多层按层线性叠加。 精度判据是**比值**而非绝对阈值: 取同一份参考代码, 只把累加类型在 double 与 float 之间 切换, 以 err(实现, fp64) / err(主机顺序 fp32, fp64) 为指标, ~1 表示不比老实的 fp32 差。 绝对阈值随形状漂移, 比值不会。 **未做, 已写在 README 里:** - 仿真器上的 kernel 相 B / 相 C 用例仍为 DISABLED_ (CPU 仿真器在分段 tanh 的 Compares / Select 对上, 于其自身谓词寄存器模型内段错误)。相 B/C 的数值正确性目前由上面 那组真机结果承担。 - 变长序列 (PackedSequence) 与 dropout —— 不在本算子的分派窗口内, aclnnLSTM 会把它们交给 DynamicRNN; 本 MR 未改变它们的行为, 也未回归验证。 - Ascend950DT —— 只在 Ascend950PR_9579 上验过, DT 属族级声明。 ## 文档更新 - 新增 rnn/single_layer_lstm/README.md (产品支持、功能、张量契约、约束、接口、验证状态)。 - **未**改 docs/zh/op_api_list.md —— 本 MR 不新增公开 API, 那张表不受影响。 ## 类型标签 - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 - [x] AI辅助编写 See merge request: cann/ops-nn!10108 | 5 天前 | |
feat(rnn): 新增 SingleLayerLstm, 并挂进 aclnnLSTM 的 SoC 分派 Co-authored-by: Fan Yuwei<fanyuwei2@huawei.com> Co-authored-by: Xinxian Chen<chenxinxian1@huawei.com> # message auto-generated for no-merge-commit merge: !10108 merge feat/single-layer-lstm into master feat(rnn): 新增 SingleLayerLstm, 并挂进 aclnnLSTM 的 SoC 分派 Created-by: fanyuwei_math Commit-by: Fan Yuwei;fanyuwei_math;Xinxian Chen Merged-by: cann-robot Description: ## 描述 **Ascend 950 上目前没有可用的 LSTM。** CANN 9.1.0 的内置 opp 里, DynamicRNN 出现在 ascend910b 与 ascend910_93 的 ops-info 配置中, 在 ascend950 的五个 ops-info json 里 出现 **0 次**; ascend950/ops_nn 下 365 个内核二进制没有一个匹配 rnn/lstm。于是 A5 上: - aclnn 通路: aclnnLSTM 会建出 DynamicRNN 节点, 但没有对应的 950 二进制; - aclop 通路: acl_op::lstm 的 OpCommand.Name("DynamicRNN") 在 950 的 ops-info 里选不到算子。 两条都到不了 kernel。这是能力缺口, 不是性能问题。 本 MR 新增 rnn/single_layer_lstm —— 单层、单方向、fp32 的 LSTM 前向 L0 算子, 承担 PyTorch nn.LSTM 的主路径, 并在 A5 上逐步取代 DynamicRNN。 ### 不新增对外接口 aclnnLSTM 一个参数都不改, 在其内部按 SoC 与能力分派: aclnnLSTM ├─ ascend950 且 fp32 且 单向 且 batchSizes 为空 -> l0op::SingleLayerLstm (本 MR) └─ 其余 -> l0op::DynamicRNN (现状, 一字不改) 分派点在 rnn/dynamic_rnn/op_api/aclnn_lstm.cpp 的 LstmSingleLayerDirec —— **本 MR 唯一 改动的既有文件**。选在这个函数里, 是因为它本来就按 (层, 方向) 各调一次: 多层与双向的调用会 一条腿一条腿地进来, 每条腿按自己的形状单独判。 因此本目录**没有** op_api/aclnn*.h、docs/acl*.md、op_graph/、framework/ —— 与 rnn/single_layer_lstm_grad 的形态一致。只被 aclnn 调用的 L0 算子不需要 REG_OP; 将来图模式要用时再补, 那时 op_graph/ 与 framework/ 各自带自己的检视门。 结构上与 at::native::lstm 的后端阶梯、cuDNN get_algo 的三档选择是同一回事。 ### 不新增反向 SingleLayerLstmGrad 已注册 ascend950 且已有 arch35 kernel (op_kernel/arch35/single_layer_lstm_grad_regbase_small.h + op_host/config/ascend950/single_layer_lstm_grad_binary.json)。本前向的八个输出正是它的输入, 不需要任何 reshape。**反向侧本 MR 一字未动。** ### 分派闸门必须与 tiling 同源 aclnn 在**建 executor 时**选节点, tiling 在**下发时**拒绝 —— 选完之后再被拒是整个 aclnnLSTM 调用死掉, 而不是回落到 DynamicRNN。所以 l0op::SingleLayerLstmSupports() 必须至少和它挡在前面的 tiling 一样严。 它直接 include op_host/arch35/single_layer_lstm_budget.h (该头是 plain C++, 无 AscendC), 调用 tiling 用的**同一份**片上容量算术 RecurrenceFits / PickRowsPerBlock, 两者不可能漂移。 dtype、属性与 8 倍数三条在闸门里各自陈述 (tiling 要用它们组错误消息), 注释中点名了这是需要 同步维护的行。 ### 两处契约不一致, 已在分派处适配 | | DynamicRNN | SingleLayerLstm | |---|---|---| | 状态秩 | [1, B, H] | [B, H], 用 l0op::Reshape | | l0 输出顺序 | (y, i, j, f, o, h, c, tanhc) | (y, output_h, output_c, i, j, f, o, tanhc), 重排 tuple | 后者是 OpDef 的声明顺序; 重排之后 LstmSingleLayerDirec 下游看到的顺序与走哪个节点无关。 ### gate_order 取 "ifjo" 而不是 def 层默认的 "ijfo" 这两个属性是**成对**的。所有 dynamic_rnn 的 binary config —— ascend910b / ascend910_93 / ascend950 三个芯片完全一致 —— 只预编两个特化: ("ifjo", UNIDIRECTIONAL) 与 ("ijfo", REDIRECTIONAL), **任何芯片上都没有 ("ijfo", UNIDIRECTIONAL)**。而所有实际调用方传的都是 "ifjo": dynamic_rnn.cpp 的 l0op 包装、aclnn_lstm_backward.cpp、framework/npu_lstm_onnx_plugin.cpp。def 里的 "ijfo" 是 GEIR 默认值, aclnn 每次调用都覆盖它。本算子的 single_layer_lstm_binary.json 只有一条, 正是 ("ifjo", UNIDIRECTIONAL)。 ### 拒绝而不是静默忽略 direction / gate_order 非默认值、非 fp32、I 或 H 不是 8 的倍数、H 超出 L0B 上界 —— 全部在 tiling 阶段拒绝并给出点名参数的消息。被静默忽略的非默认属性会训出一个看起来合理的错 模型; 一次拒绝只让调用方多收一条错误信息。 ## 关联的Issue 无直接关联。与 [issue 5627](https://gitcode.com/cann/ops-nn/issues/5627) (A5 上 LSTM 个别 用例劣于 A2) 及 [PR 9976](https://gitcode.com/cann/ops-nn/pull/9976) 同域但不重叠: 那两个针对 DynamicRNN 现有实现的精度, 本 MR 是 A5 上的另一条实现路径, **不主张**解决 5627。若能提供 5627 失败用例的 shape, 我们可以用同一套探针把两条路径一起量出来。 本 MR 取代 [PR 9339](https://gitcode.com/cann/ops-nn/pull/9339) —— 那个 MR 的做法是新增 aclnnLstmV2 / aclnnLstmBackwardV2 两个接口; 该形态已否, 9339 将随本 MR 关闭。 ## 测试 **主机侧 UT (CANN 9.1.0, x86 主机): 13/13 通过。** sh bash build.sh -u --ophost --ops=single_layer_lstm --soc=ascend950 | 项 | 用例数 | |---|---| | tiling: 2 个接受形状 + 6 个拒绝形状 | 8 | | InferShape: 输出形状 + 秩拒绝 | 2 | | 片上预算与拒绝 | 3 | ⚠ **--soc=ascend950 不能省。** 不带它时 CMake 传 -UASCEND_COMPUTE_UNIT, 本目录 CMakeLists.txt 的 SUPPORT_COMPUTE_UNIT "ascend950" 匹配不上, op_host/arch35/ 下的 tiling 根本不参与编译, IMPL_OP_OPTILING 没有注册, ExecuteTiling 拿到空函数指针后 段错误。那不是算子的缺陷, 是编译配置没选中 arch35 —— 先说在前面, 免得 CI 用默认命令跑出一个 吓人的崩溃。 **真机 (Ascend950PR_9579, 28 AICORE, CANN 9.1.0), 全部经由 aclnnLSTM 调用:** | 项 | 结果 | |---|---| | 分派 T=64 B=32 I=64 H=64 | 走 SingleLayerLstm (msprof op_statistic, MIX_AIC 1 次 362.410 us) | | 回落 H=256 (超出 L0B 上界) | 静默回落 DynamicRNN, **不是报错** | | 精度, 8 个形状 (I 16--1024, H 32--256, T 2--32) | 0.4x--1.2x, 跨分派边界无台阶 | | train=0 与 train=1 | 结果逐位相同, 都走 SingleLayerLstm | | 多层 L = 1 / 2 / 3 | SingleLayerLstm 分别被下发 1 / 2 / 3 次 (op_statistic 的 Count 逐一对上), 精度 0.7x--1.1x | | batchFirst = true, L = 1 / 2 | 同样每层一次, 精度 0.6x--1.2x | **性能对照。** 两侧都经由 aclnnLSTM, 只换装的包 —— 一个把分派强制关掉 (一律走 DynamicRNN), 一个是本 MR。**因此两侧的辅助算子完全相同** (同一份 PrepareWeightTrans / PrepareBias / Slice), 比值是 kernel 对 kernel 的。每轮 = GetWorkspaceSize + 执行 + 同步, 预热后 20 轮均值: | 形状 | DynamicRNN | SingleLayerLstm | 比值 | |---|---:|---:|---:| | T=16 / 64 / 128 / 256 (B=32 I=64 H=64) | 128.8 / 419.6 / 807.5 / 1575.9 us | 90.3 / 296.1 / 580.1 / 1109.1 us | 1.43 / 1.42 / 1.39 / 1.42x | | H=32 / 64 / 128 (T=64 B=32 I=64) | 356.8 / 420.2 / 550.4 us | 260.8 / 296.1 / 462.6 us | 1.37 / 1.42 / 1.19x | | L=2 (T=64 B=32 I=64 H=64) | 849.9 us | 603.1 us | 1.41x | 比值对 T 不敏感, 对 H 敏感 —— H=128 已贴着 L0B 上界, 收窄到 1.19x; 优势最大的区间 恰好也是支持的区间。多层按层线性叠加。 精度判据是**比值**而非绝对阈值: 取同一份参考代码, 只把累加类型在 double 与 float 之间 切换, 以 err(实现, fp64) / err(主机顺序 fp32, fp64) 为指标, ~1 表示不比老实的 fp32 差。 绝对阈值随形状漂移, 比值不会。 **未做, 已写在 README 里:** - 仿真器上的 kernel 相 B / 相 C 用例仍为 DISABLED_ (CPU 仿真器在分段 tanh 的 Compares / Select 对上, 于其自身谓词寄存器模型内段错误)。相 B/C 的数值正确性目前由上面 那组真机结果承担。 - 变长序列 (PackedSequence) 与 dropout —— 不在本算子的分派窗口内, aclnnLSTM 会把它们交给 DynamicRNN; 本 MR 未改变它们的行为, 也未回归验证。 - Ascend950DT —— 只在 Ascend950PR_9579 上验过, DT 属族级声明。 ## 文档更新 - 新增 rnn/single_layer_lstm/README.md (产品支持、功能、张量契约、约束、接口、验证状态)。 - **未**改 docs/zh/op_api_list.md —— 本 MR 不新增公开 API, 那张表不受影响。 ## 类型标签 - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 - [x] AI辅助编写 See merge request: cann/ops-nn!10108 | 5 天前 | |
rnn/thnn_fused_gru_cell算子开发 Co-authored-by: h1234515<huangzhiyuan21@huawei.com> Co-authored-by: zhoulong50_hw<zhoulong50@huawei.com> # message auto-generated for no-merge-commit merge: !10684 merge thnn_fused_gru_cell_2 into master rnn/thnn_fused_gru_cell算子开发 Created-by: h1234515 Commit-by: zhoulong50_hw;h1234515 Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> 新增ThnnFusedGruCell算子 ## 1. 功能定位 对 **GRU(Gated Recurrent Unit,门控循环单元)的单个时间步**执行门控融合计算:输入两路门控预激活(输入侧 + 隐层侧)、上一步隐状态和可选双 bias,**一次算子调用同时产出两个结果**——新隐状态 hy 和反向计算复用的中间量 storage。适用于 RNN 逐步推理/训练中的高频单步计算,等价于 PyTorch torch.nn.functional.gru_cell 的 THNN 内核语义。 - 支持产品:Ascend 950PR / Ascend 950DT(arch35),AIV 纯矢量算子。 - 输出为双结果融合算子:hy 供下一时间步递推,storage 供反向梯度计算复用,避免训练场景重复计算。 ## 2. 计算公式 门控预激活沿最后一维按门序 **[r, z, n] 三等分**: - input_gates (B, 3H) → gi_r、gi_z、gi_n(各 H 列) - hidden_gates (B, 3H) → gh_r、gh_z、gh_n - 两路 bias 同步三等分为 b1_r/b1_z/b1_n 与 b2_r/b2_z/b2_n,沿 batch 维广播 - hx (B, H) 为上一步隐状态 计算过程: $$rg = \frac{1}{1 + e^{-(gi_r + gh_r + b1_r + b2_r)}}$$ $$zg = \frac{1}{1 + e^{-(gi_z + gh_z + b1_z + b2_z)}}$$ $$ng = \tanh(gi_n + b1_n + rg \times (gh_n + b2_n))$$ $$hy = ng + zg \times (hx - ng)$$ $$storage = [rg \mid zg \mid ng \mid hx \mid (gh_n + b2_n)]$$ 语义说明: - rg 重置门、zg 更新门:sigmoid 激活,取值 (0, 1)。 - ng 候选状态:tanh 激活,重置门 rg 调制隐层侧候选分量。 - hy:更新门 zg 在旧状态 hx 与候选状态 ng 之间做凸组合。 - storage:反向复用中间量,五段 [rg、zg、ng、hx、gh_n+b2_n] 沿最后一维拼接,每段 H 列,故 shape 为 (B, 5H)。 - bias 缺省(空指针)时等价于全零 bias。 ## 3. 输入输出 | 参数名 | 输入/输出/属性 | 描述 | 数据类型 | 数据格式 | | --- | --- | --- | --- | --- | | input_gates | 输入 | 输入侧门控预激活,对应 gi_r/gi_z/gi_n,shape 为 (B, 3H) | BFLOAT16、FLOAT16、FLOAT | ND | | hidden_gates | 输入 | 隐层侧门控预激活,对应 gh_r/gh_z/gh_n,shape 为 (B, 3H) | BFLOAT16、FLOAT16、FLOAT | ND | | hx | 输入 | 上一步隐状态,shape 为 (B, H) | BFLOAT16、FLOAT16、FLOAT | ND | | input_bias | 可选输入 | 输入侧 bias,对应 b1_r/b1_z/b1_n,shape 为 (3H,);缺省等价全零 | BFLOAT16、FLOAT16、FLOAT | ND | | hidden_bias | 可选输入 | 隐层侧 bias,对应 b2_r/b2_z/b2_n,shape 为 (3H,);缺省等价全零 | BFLOAT16、FLOAT16、FLOAT | ND | | hy | 输出 | 新隐状态,shape 为 (B, H) | BFLOAT16、FLOAT16、FLOAT | ND | | storage | 输出 | 反向复用中间量,shape 为 (B, 5H) | BFLOAT16、FLOAT16、FLOAT | ND | ## 4. 精度说明 - BFLOAT16 / FLOAT16 输入在 **fp32 中间精度**下完成 sigmoid、tanh 与乘加计算,结果舍回原数据类型。 - FLOAT 输入直接计算。 - 输出数据类型与输入一致(全张量同 dtype)。 ## 5. 实现要点(kernel 双路径) | 路径 | tilingKey | 适用场景 | 管线 | | --- | --- | --- | --- | | 常规路径(RANK=4) | 0 | 通用场景,H 优先切分 | 6 相位矢量流水线:NDDMA 搬入(含 bias 随路广播)→ fp32 计算域(3-buffer:累加器/结果载体/第二操作数)→ DataCopyPad 搬出 | | h-major 转置路径(RANK=8 哨兵档) | 1 | 小 H 大 B 家族 | 连续 2D 搬入 → UB 内 ConfusionTransposeOnly 转置 → 面板域计算 → 结果拼接转置回 → 连续 2D 搬出 | tiling 侧按 UB 容量三形态切分:形态 A 沿 H 切(单行 tile)、形态 B 沿 B 切(多行 tile,多核并行)、形态 C 全量单 tile;行级 32B 对齐填充(paddedHidden)消除非对齐 H 的形态退化;微量数据(<160B)回退单核避免 launch-bound 退化。 ## 6. 约束说明 - 输入与输出的数据类型必须一致,仅支持 BFLOAT16、FLOAT16、FLOAT;不支持跨数据类型组合,也不支持 DOUBLE、INT64 等其它数据类型。 - input_gates 与 hidden_gates 的 shape 必须相同且为 (B, 3H),hx 的 shape 为 (B, H),需满足 input_gates.shape[1] == 3 × hx.shape[1];input_bias 与 hidden_bias 在位时元素个数必须为 3H 且两者相同。 - 输入与输出的数据格式仅支持 ND。 - B=0 或 H=0(numel 为 0 的空 Tensor)为合法输入,直接返回空输出。 - aclnn 接口中可选 bias 以空指针表达缺省,等价于全零 bias;输入与输出均支持非连续 Tensor(输入由接口层自动连续化,输出由接口层按声明的布局逐元素写回)。 ## 7. 调用方式 | 调用方式 | 说明 | | --- | --- | | aclnn API | 通过 aclnnThnnFusedGruCell 接口调用,两段式:aclnnThnnFusedGruCellGetWorkspaceSize + aclnnThnnFusedGruCell | | GE 图模式 | 通过算子 IR 定义(op_graph/thnn_fused_gru_cell_proto.h)构图调用 | ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> https://gitcode.com/cann/ops-nn/issues/6174 ## 测试 <!--描述进行了哪些测试来验证你的改动。--> 二级冒烟,ttk测试 ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [x] AI辅助编写 See merge request: cann/ops-nn!10684 | 8 天前 | |
rnn/thnn_fused_gru_cell_grad 算子开发 Co-authored-by: dengguojie<dengguojie@huawei.com> # message auto-generated for no-merge-commit merge: !10731 merge master into master rnn/thnn_fused_gru_cell_grad 算子开发 Created-by: dengguojie Commit-by: dengguojie Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> ## 测试 <!--描述进行了哪些测试来验证你的改动。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [ ] AI辅助编写 See merge request: cann/ops-nn!10731 | 5 天前 | |
产品名称修改 Co-authored-by: y60124828<yanglou1@h-partners.com> # message auto-generated for no-merge-commit merge: !11292 merge master into master 产品名称修改 Created-by: yanglu-1 Commit-by: y60124828 Merged-by: cann-robot Description: ## 描述 产品名称修改 ## 关联的Issue 关联Issue [#6089](https://gitcode.com/cann/ops-nn/issues/6089) ## 测试 <!--描述进行了哪些测试来验证你的改动。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 <!-- [x] 表示选中 --> - [ ] AI辅助编写 See merge request: cann/ops-nn!11292 | 4 天前 | |
fix(rnn): thnn_fused_lstm_cell_grad 修复多块搬运末块漏块并适配 Ascend950 Co-authored-by: Miao_Haifeng<miaohaifeng@huawei.com> # message auto-generated for no-merge-commit merge: !10606 merge fix/thnn-fused-lstm-cell-grad-950 into master fix(rnn): thnn_fused_lstm_cell_grad 修复多块搬运末块漏块并适配 Ascend950 Created-by: Almost_CANN Commit-by: Miao_Haifeng Merged-by: cann-robot Description: ## 描述 ### 1. 修复多块搬运末块漏块(op_kernel/thnn_fused_lstm_cell_grad.h) - 原实现末块行数用 mLines % MAX_COPY_LINES 计算:当 mLines 为 MAX_COPY_LINES 整倍数时取模结果为 0,导致漏搬整整一块 - 改为 min(块上限, 剩余行数),任意 mLines 均正确 ### 2. 修复多块搬运目的地址不递增(op_kernel/thnn_fused_lstm_cell_grad.h) - 多块 DataCopyPad 循环中目的地址固定为 subDataTensor 起始处,后块覆盖前块 - 新增 dstOffset = copyLoopIdx * MAX_COPY_LINES * nReduceShapeAlign,后块接续前块写入(baseReduceN 已按 8/16 对齐,32B 地址对齐满足) ### 3. Ascend950 适配 - op_host:AICore 注册 ascend950 - op_kernel:新增 CMakeLists.txt 注册 kernel 源码(ascend910b/ascend910_93/ascend950) - tests/ut/op_kernel:UT 目标扩展 ascend950pr_9599 ## 关联的Issue ## 测试 - ascend910B1 / ascend950 UT 通过/冒烟测试/新精度测试 ## 文档更新 op_api_list.md、readme.md ## 类型标签 <!-- [x] 表示选中 --> - [x] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-nn!10606 | 3 天前 | |
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: !318 merge license2 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!318 | 9 个月前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 4 天前 | ||
| 4 天前 | ||
| 3 天前 | ||
| 4 天前 | ||
| 5 天前 | ||
| 5 天前 | ||
| 4 天前 | ||
| 4 天前 | ||
| 4 天前 | ||
| 5 天前 | ||
| 3 天前 | ||
| 4 天前 | ||
| 4 天前 | ||
| 4 天前 | ||
| 5 天前 | ||
| 5 天前 | ||
| 5 天前 | ||
| 8 天前 | ||
| 5 天前 | ||
| 4 天前 | ||
| 3 天前 | ||
| 9 个月前 |