已合并
add gru aclnn version #5567
XianglongZeng创建于 22 天前
add gru aclnn version #5567
已合并
XianglongZeng创建于 22 天前
XianglongZeng成员
22 天前

【合入来源】

如有社区issue,请关联issue链接
请勿携带内部流程信息(需求链接、问题单、内部issue等)

  • 需求
  • 问题单
  • issue/工单
  • 重构优化
  • 资料更新

【修改方案】

  1. torch.nn.GRU正反向接入aclnn,以替换之前的aclop实现,暂不支持变长Sequence输入,issue见https://gitcode.com/Ascend/op-plugin/issues/332
  2. 调整一个阻塞CI的存量精度问题用例(group_norm_backward)的阈值,issue见https://gitcode.com/Ascend/pytorch/issues/3515

【资料变更】

在原生api清单限制中添加dropout不生效的提示。已合入,pr见https://gitcode.com/Ascend/pytorch/pull/43385

【接口变更】

不涉及

【功能验证】

正向ut:
image.png
反向ut:
image.png

【CheckList】

PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x]

  • 代码注释完备,正确记录错误日志
  • 代码实现进行了返回值、空指针等校验
  • PR标题正确使用类型标签,如:feat、fix、refactor、docs、test等
  • PR持续集成流水线(CI)执行通过,代码检查无异常
likedislike
Pull Request已成功合入, 合并人@ascend-robot
(感谢 XianglongZeng 的贡献)
XXianglongZeng成员
22 天前 创建了 pull request,commit 3d9c23da
atomgit-bot
atomgit-bot
22 天前 评论:

变更摘要

该 PR 为 GRU 算子新增了基于 aclnn API 的 NPU 实现(此前仅存在 acl_op 路径),包含前向 _gru_npu 与反向 _gru_npu_backward 两个内核,同时修改了公共类型转换逻辑以适配 aclnn GRU 反向算子对 ACL_FORMAT_ND 格式的强制要求,并补充了更全面的前向/反向测试用例。

主要改动

  • 新增 GRU 前向 aclnn 内核 (GRUKernelNpuOpApi.cpp): 实现 _gru_npugru 函数,调用 aclnnGRU 执行前向计算;包含 BF16/混合精度回退到 acl_op::gru 的逻辑,训练模式下输出 gate 状态张量并在 at::stack 后显式转为 ACL_FORMAT_ND 以满足反向算子格式约束。
  • 新增 GRU 反向 aclnn 内核 (GRUBackwardKernelNpuOpApi.cpp): 实现 _gru_npu_backward,调用 aclnnGRUBackward;处理 grad_y/grad_hundefined 时回退为 zeros_like 张量,并对 hx/r/z/n/h_n/h 等输入执行 chunk+squeeze 以适配 aclnn 所需的 TensorList 形参。
  • 修改公共类型转换逻辑 (op_api_common.cpp): 在 ConvertTypeConvertType(重载) 和 ConvertTypeV2 三处,对已显式标记为 ACL_FORMAT_ND 的 3D 张量保留原格式,不再按维数推断为 ACL_FORMAT_NCL,以避免 aclnnGRUBackward 因格式不匹配报错。
  • 新增/注册算子声明与导数规则: 在 op_plugin_functions.yaml 中将 gru.input 标记为 op_api: all_version,新增 _gru_npu_gru_npu_backward 自定义算子;在 derivatives.yaml 中添加 _gru_npu 的反向导数映射;在 torch_npu_OpApi_schema_all.json 中补充对应 schema。
  • 新增 GRU 输出形状计算函数 (KernelNpuOutputSize.cpp/.h): 添加 gru_npu_output_sizegru_npu_hy_output_sizegru_npu_gate_output_sizegru_backward_npu_output_sizegru_backward_npu_h_prev_output_size 五个工具函数,支持 batch_first 和双向模式。
likedislike
atomgit-bot
atomgit-bot
22 天前 评论:

代码审查

审查总结

优先级 数量 说明
P1 1 debug fprintf 残留在生产代码中
P2 2 grad_y fallback shape 错误;aclnnGRUBackward 缺少 dropout/train 参数
P3 1 ConvertType 注释引用不够明确

逐文件审查结果:

文件 结果
op_plugin/config/derivatives.yaml ✅ 无问题
op_plugin/config/op_plugin_functions.yaml ✅ 无问题
op_plugin/ops/opapi/GRUBackwardKernelNpuOpApi.cpp ⚠️ 3 个问题(P1×1, P2×2)
op_plugin/ops/opapi/GRUKernelNpuOpApi.cpp ✅ 无问题
op_plugin/utils/KernelNpuOutputSize.cpp ✅ 无问题
op_plugin/utils/KernelNpuOutputSize.h ✅ 无问题
op_plugin/utils/op_api_common.cpp ⚠️ 1 个建议(P3×1)
test/core_tests/torch_npu_OpApi_schema_all.json ✅ 无问题
test/test_base_ops/test_gru.py ✅ 无问题
test/test_base_ops/test_gru_backward.py ✅ 无问题

整体风险评估:中等。 最紧迫的问题是 GRUBackwardKernelNpuOpApi.cpp 中残留的 debug fprintf,它在每次反向传播时向 stderr 输出内部格式信息,应在上线前移除。grad_y_real 的 shape 错误在 input_size ≠ D*hidden_sizegrad_y 未定义时会被触发,当前测试未覆盖该路径。dropout/train 参数在反向调用中的缺失需要与 CANN 算子 owner 确认是否需要补传。

类型 数量
🔴 阻塞 1
🟡 建议 2

⛔ 需要修改

likedislike
ascend-robotascend-robot成员
22 天前 添加了label:ascend-cla/yes
此处折叠了238条消息 查看更多
ascend-robot
ascend-robot成员
18 天前 评论:

Pull Request 已合并或已关闭。

If you want to solve this problem, you can click here to do it in the FAQs.

likedislike
ascend-robot
ascend-robot成员
18 天前 评论:

Pull Request 已合并或已关闭。

If you want to solve this problem, you can click here to do it in the FAQs.

likedislike
XXianglongZeng成员
18 天前 修改了pull request 的描述
ascend-robot
ascend-robot成员
18 天前 评论:

Pull Request 已合并或已关闭。

If you want to solve this problem, you can click here to do it in the FAQs.

likedislike
ascend-robot
ascend-robot成员
18 天前 评论:

Pull Request 已合并或已关闭。

If you want to solve this problem, you can click here to do it in the FAQs.

likedislike