已合并
fix: support packed LSTM output shape transition #5761
fix: support packed LSTM output shape transition #5761
已合并
ymdsall创建于 9 天前
ymdsall
ymdsall成员
9 天前

【合入来源】

【修改方案】

  1. Packed LSTM 收到 CPU batch_sizes 时,在 C++ 层将输出 reshape 为 PackedSequence 所需的二维数据,用于直调和删除 Python patch 后的 PTA。
  2. 收到 NPU batch_sizes 时保留原输出形状,由旧 PTA 的 LSTM.forward monkey-patch 完成 reshape,避免重复处理。
  3. shape 判断使用进入 C++ 时的原始 batch_sizes 设备;ACLop 继续在内部使用 CPU batch_sizes,ACLNN 在调用算子前按需转到数据设备。

本 PR 是 LSTM.forward monkey-patch 删除前的兼容修改。合入顺序为:本 PR → pytorch PR 43893 删除 monkey-patch → op-plugin MR 5675 rebase 后合入完整修改和测试。

【资料变更】

不涉及。

【接口变更】

不涉及。

【功能验证】

  • git diff --check:通过。
  • 本 PR 不修改测试文件,由现有 packed LSTM 官方用例验证旧 PTA monkey-patch 兼容路径。
  • 本 PR 合入后,由 pytorch PR 43893 验证删除 patch 后的 CPU batch_sizes 路径。

【CheckList】

likedislike
Pull Request已成功合入, 合并人@ascend-robot
(感谢 ymdsall 的贡献)
ymdsallymdsall成员
9 天前 创建了 pull request,commit 10e6f9ec
atomgit-bot
atomgit-bot
9 天前 评论:

变更摘要

本 PR 修复 packed LSTM 在 NPU kernel 上的输出 shape 兼容问题:将 batch_sizes 的设备适配与输出 reshape 逻辑下沉到 op-plugin 的 LstmKernelNpu.cpp(ACLop)和 LSTMKernelNpuOpApi.cpp(ACLNN)中。核心规则是仅在 batch_sizes 位于 CPU 时将输出 y reshape 为 PackedSequence 所需的二维形状,若旧 PTA monkey-patch 传入 NPU batch_sizes 则保留原输出、由 Python patch 完成 reshape,从而同时兼容保留和删除旧 LSTM.forward patch 的 PTA 版本。同时补充了 ACLop 直调输出形状、BF16、混合 dtype 及参数数量 fallback 等测试。

主要改动

  • ACLop 输出 reshape 下沉:在 op_plugin/ops/aclops/LstmKernelNpu.cpplstm 中新增 should_reshape_output = batch_sizes.device().is_cpu() 判断,为真时对输出 y 执行 y.reshape({-1, y.size(-1)}),内部仍继续使用 CPU batch_sizes
  • ACLNN 设备适配与 reshape:在 op_plugin/ops/opapi/LSTMKernelNpuOpApi.cpplstm 中新增 batch_sizesdata 设备不一致时经 to(data.device()) 转换并传入 _lstm_npu,同时按同一 should_reshape_output 规则对 output_y 做二维 reshape,保证与 ACLop 路径行为一致。
  • 兼容旧 monkey-patch 场景:两处 kernel 均以 batch_sizes.device().is_cpu() 为分界,NPU batch_sizes 时保持原输出不变,由旧 PTA 的 Python patch 负责 reshape,避免重复处理。
  • 补充 packed LSTM 测试:在 test/test_base_ops/test_lstm.py 中为 _build_lstm/_make_packed_inputs 增加 num_layers 参数,新增混合 dtype、BF16、参数数量 fallback 及 ACLop 直调输出形状测试,将断言收紧为 y.shape == (packed.data.size(0), 6),并通过 PackedSequence 回填 pad_packed_sequence 验证输出可还原为 (5, 3, 6)
likedislike
atomgit-bot
atomgit-bot
9 天前 评论:

代码审查

✅ 未发现问题

likedislike
ascend-robotascend-robot成员
9 天前 添加了label:needs-issue
此处折叠了48条消息 查看更多
wanglijun55成员
6 天前 评论:

/lgtm

likedislike
chengpeng25成员
6 天前 评论:

/approve

likedislike
ascend-robotascend-robot成员
6 天前 添加了label:approvedlgtm
ascend-robotascend-robot成员
6 天前 合入了pull request
ymdsallymdsall成员
6 天前 关联了里程碑:TorchNPU-v26.2.0