已关闭
[Requirement|需求建议]: 新增 BlockLstmGrad 算子(TF BlockLSTMGrad/V2 反向梯度算子,Ascend950) #6208
陶贻坤创建于  9月24日关闭于  9月29日
陶贻坤
陶贻坤成员
9月24日 创建

Thanks for sending an requirement! Please fill in the following template to help quickly solve your problem.

Backgroud(背景信息)

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 为准。

Origin(信息来源)

NA

Benefit / Necessity (价值/作用)

Design(设计方案)

1. 接口定义(18 输入 / 8 输出 / 2 属性)

类别 名称 规格
INPUT seq_len_max int64 标量,有效时间步
INPUT x [T,B,I],fp32/fp16
INPUT cs_prev / h_prev [B,H] 初始状态
INPUT w [I+H,4H] 权重
INPUT wci / wcf / wco [H] peephole 权重
INPUT b [4H] 偏置
INPUT i / cs / f / o / ci / co / h [T,B,H] 前向缓存激活
INPUT cs_grad / h_grad [T,B,H] 上游梯度
OUTPUT x_grad [T,B,I](超 seq_len_max 置零)
OUTPUT cs_prev_grad / h_prev_grad [B,H]
OUTPUT w_grad [I+H,4H];wci/wcf/wco_grad [H];b_grad [4H]
ATTR use_peephole Bool,默认 false
ATTR gate_order String,ifco(V2)/icfo(V1),默认 ifco

单算子 + gate_order 属性统一覆盖 TF 两个 op(V1=icfo / V2=ifco)。

2. 数学核心(沿 t 逆序递推,carry 跨步依赖)

cs_grad_t = cs_prev_carry + cs_grad[t];  h_grad_t = h_prev_carry + h_grad[t]
do_ = o*(1-o)·h_grad_t·co          # 门导数由前向缓存激活代数构造,无超越函数
dcs = (1-co·co)·h_grad_t·o + cs_grad_t (+ do_·wco if peephole)
dci/df/di = tanh'·dcs·i / sigmoid'·dcs·cs_prev / sigmoid'·dcs·ci
dgates = pack([di,dci,df,do_], gate_order)
cs_prev_carry = dcs·f (+ di·wci + df·wcf if peephole)
xh_grad = dgates @ w.T;  x_grad[t]=xh_grad[:,:I];  h_prev_carry=xh_grad[:,I:]
w_grad += xh_t.T @ dgates;  b_grad += Σbatch dgates   # 跨 t、batch 归约

3. 工程实现要点

  • 芯片:Ascend 950PR/950DT(arch35,cube+vector 混合架构)
  • Tiling 三相切分:Phase A 反向递推 / Phase B dX(dgates@W_x^T)/ Phase C dW(xh^T@dgates),多模式(resident/stream/slab/recVec)适配 on-chip 预算(L1 512KB / L0C 256KB / UB 248KB×AIV),batch 切分 + split-K + 零维 zeroMode 快路径
  • Kernel:restage 零填充 → 递推 → dX → dW → scatter/跨 cluster 归约
  • TF Plugin:liboptf_plugin_nn.so 注册 BlockLSTMGrad/V2 解析器 → npu_device 路由 NPU
  • 零维 parity:T/B/I/H 任一为 0 合法(与 TF 行为一致)

4. 验证结论(已完成)

通路 规模 结果
GEIR 三方对比(NPU vs fp64 golden vs A100 TF) 526 条 正向 495/495 三方 PASS,负向 31/31 正确拒绝
TF e2e 三方对比(npu_device 通路) 491 条(fp32 318 + fp16 173) 491/491 全 PASS(cross_check L1:mare 5.0/mere 1.5/rmse 1.5)

性能对比数据已采集(NPU GEIR 端到端 vs A100 TF 设备时延,小 shape 中位比值 5.8x、大 shape 偏慢,详见测试报告)。

5. 关联

  • 实现 PR:#10694(rnn/block_lstm_grad/,含全部检视意见修复)
  • 工程路径:ops-nn/rnn/block_lstm_grad/
likedislike
陶贻坤
陶贻坤成员
9月24日 评论:

/assign

likedislike
CANN-robotCANN-robot成员
9月24日 将 eternityk 设为负责人
CANN-robotCANN-robot成员
9月29日 关闭了 issue
CANN-robotCANN-robot成员
9月29日 添加了label:resolved