已关闭
A5 lstm 精度优化 #9976
weike创建于 28 天前关闭于 24 天前
A5 lstm 精度优化 #9976
已关闭
当前Pull Request已关闭, 关闭人@weike
atomgit-bot
28 天前 评论:
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 精度。


不准确?
atomgit-bot
28 天前 评论:
28 天前 评论:
28 天前 添加了label:stat/needs-squash
28 天前 添加了label:cann-cla/yes
此处折叠了59条消息 查看更多
27 天前 删除了label:ci-pipeline-failed
27 天前 添加了label:ci-pipeline-running
27 天前 删除了label:ci-pipeline-running
27 天前 添加了label:ci-pipeline-passed
24 天前 关闭了 pull request
描述
A5上LSTM正向算子精度优化
关联的Issue
https://gitcode.com/cann/ops-nn/issues/5627
测试
文档更新
类型标签
AI/Agent生成声明