已关闭
A5 lstm 精度优化 #9976
weike创建于 28 天前关闭于 24 天前
A5 lstm 精度优化 #9976
已关闭
weike创建于 28 天前关闭于 24 天前
weike
weike成员
28 天前

描述

A5上LSTM正向算子精度优化

关联的Issue

https://gitcode.com/cann/ops-nn/issues/5627

测试

文档更新

类型标签

AI/Agent生成声明

likedislike
当前Pull Request已关闭, 关闭人@weike
weikeweike成员
28 天前 创建了 pull request,commit 1d436e50
atomgit-bot
atomgit-bot
28 天前 评论:

变更摘要

本 PR 为 Bug 修复,针对 A5 系列(Ascend 3510/5102/3003/3113)上 LSTM 正向算子 fp32 精度偏差问题(关联 issue #5627)。其背景是 A5 系 fp32 cube 的 L0C 累加噪声显著大于 A2,而 matmul 库仅暴露 SetHF32(精度只会更差)、无更高精度累加开关,因此本改动为 LstmMmSplitNDNDFP32 新增一条可编译期开关的高精度 GEMM 路径:将输入 x@Wih 与隐藏 h@Whh 的 fp32 累加从 cube 搬到向量单元,对每个乘积做单次舍入后采用 Kahan 补偿求和,把累加误差压到 ~1ulp 量级。改动以架构相关宏控制,默认仅 A5 侧输入 GEMM 走高精度向量路径,隐藏 GEMM 因在回归中造成灾难性误差暂默认关闭。

主要改动

  • 高精度 GEMM 编译开关与公共配置(dynamic_rnn_common.h):新增按 __NPU_ARCH__ 限定的 DYNAMIC_RNN_HIACC_GEMM_INPUT/DYNAMIC_RNN_HIACC_GEMM_HIDDEN/DYNAMIC_RNN_HIACC_GEMM 宏(默认输入 GEMM 开启、隐藏 GEMM 关闭),以及累加策略开关 DYNAMIC_RNN_HIACC_PLAIN(0=Kahan,1=普通顺序累加)和累加方向开关 DYNAMIC_RNN_HIACC_REVK_INPUT/DYNAMIC_RNN_HIACC_REVK_HIDDEN,并新增列分块常量 HIACC_MM_CHUNK、缓冲数量 HIACC_MM_BUF_NUM、hiaccBuf 缓冲与 hiaccCch 字段,在 InitQue() 中对 fp32 路径按需初始化该缓冲。
  • 新方法声明(LstmFP32.h):在 LstmMmSplitNDNDFP32 中新增高精度实现声明 ProcessInputMMHighAcc() 与 ProcessHiddenMMHighAcc(int64_t tIdx)。
  • 输入 GEMM 高精度路径(LstmFP32.cpp):ProcessInputMM() 在 T=float 且宏开启时改走 ProcessInputMMHighAcc();新实现按列分块 hiaccCch、按向量核数划分 batch 行,逐 k 行取 x 值乘 Wih 后用 Kahan 补偿累加并叠加 bias,写回 workspace 的布局与原 cube 输出完全一致。
  • 隐藏 GEMM 高精度路径(LstmFP32.cpp):ProcessHiddenMM(tIdx) 在 T=float 且宏开启时改走 ProcessHiddenMMHighAcc(tIdx);新实现对每个时间步在向量单元按 Kahan 累加 h[t-1]@Whh,随后读回输入 GEMM 已写入的 workspace 值做单次舍入合并,使喂给向量激活阶段的 gate 输入达到 ~1ulp 精度。
likedislike
不准确?
atomgit-bot
atomgit-bot
28 天前 评论:

代码审查

✅ 未发现问题

likedislike
不准确?
CANN-robotCANN-robot成员
28 天前 添加了label:stat/needs-squash
CANN-robotCANN-robot成员
28 天前 添加了label:cann-cla/yes
此处折叠了59条消息 查看更多
CANN-robotCANN-robot成员
27 天前 删除了label:ci-pipeline-failed
CANN-robotCANN-robot成员
27 天前 添加了label:ci-pipeline-running
CANN-robotCANN-robot成员
27 天前 删除了label:ci-pipeline-running
CANN-robotCANN-robot成员
27 天前 添加了label:ci-pipeline-passed
weikeweike成员
24 天前 关闭了 pull request