​作者​:昇腾实战派
​知识地图​:https://blog.csdn.net/Lumos_Lovegood/article/details/161601003

背景概述

昇腾 CANN 提供两套算子执行方式:aclop(基于 Ascend C 的算子库)和 aclnn(面向神经网络场景的高性能算子库)。aclnnLSTM 是昇腾为提升 LSTM 性能引入的加速接口,其能力边界与业界主流 RNN 加速接口保持一致,在 bf16、混合精度等场景上与原有 aclop 实现存在差异。昇腾 PTA(PyTorch Adapter)作为 PyTorch 与 CANN 之间的桥接层,通过回退机制在性能与兼容性之间取得平衡,保障 LSTM 接口在昇腾 NPU 上的可移植性。

问题描述

在执行昇腾 PyTorch Adapter(PTA)上的 LSTM 模糊测试与确定性测试时,遇到了参数校验失败的问题。

测试命令

source /usr/local/Ascend/ascend-toolkit/set_env.sh && python3 Fuzz_tensorlist_torch.nn.LSTM.py  # 模糊测试

export ASCEND_PROCESS_LOG_PATH=$PWD/plog/OPS_Deterministic_torch_nn_LSTM && export deterministic_test=True && source /usr/local/Ascend/ascend-toolkit/set_env.sh && python3 run_testing.py --csv_file final_dtype.csv --api_name torch.nn.LSTM --case_id 0-bfloat16-1-float32-f017 --output_dir $PWD/LSTM_f017  # 确定性测试

错误日志

错误一:hx列表中tensor数量异常

RuntimeError: _lstm_npu: ... NPU function error: call aclnnLSTM failed, error code is 161002
[ERROR] AclNN_Parameter_Error(EZ1001): The number of tensors required for the hx lists should be 2 or 0, but 15000 was obtained.

错误二:hx tensor数据类型不匹配

AclNN_Parameter_Error(EZ1001): Tensor(*hx)[i] expected dtype is DT_FLOAT but found DT_FLOAT16.

错误三:input数据类型不支持

AclNN_Parameter_Error(EZ1001): Tensor input not implemented for DT_BFLOAT16, should be in dtype support list [DT_FLOAT, DT_FLOAT16].

根因分析

昇腾 CANN 的 aclnn 接口能力边界与业界主流 RNN 加速接口保持一致,与原有 aclop 实现存在以下能力差异,不支持下列场景:

  1. bf16 数据类型:aclnnLSTM 暂未覆盖 bf16 输入场景
  2. 混合精度输入:不支持 fp16 + fp32 的混合精度组合
  3. hx 列表中超过 2 个 tensor:aclnn 接口要求 hx 参数最多包含 2 个 tensor(对应初始隐藏状态和细胞状态)

补充说明

  • 业界同类 RNN 加速方案同样不支持上述三个场景(bf16 未走该类接口的原生实现路径,混合精度与 hx 超限均为该类接口的共同能力边界)
  • 测试中传入 15000 个 tensor 到 hx 参数,远超接口支持上限(2 个),属于非法输入
  • 原有 aclop 实现支持这些场景;昇腾 CANN 将 aclnn 切换为默认算子执行方式后,能力边界之外的场景需由适配层兜底
  • 昇腾 PTA(PyTorch Adapter)作为 PyTorch 与 CANN 的适配层,承担场景判断和回退调度职责

解决方案

aclnn 接口保持与业界同类 RNN 加速方案的能力对齐,不重新扩展支持这些场景。决策方案为:

由昇腾 PTA(PyTorch Adapter)侧判断问题场景并回退(fallback)至 aclop 实现:

  • 检测到 bf16 输入 → 回退到 aclop
  • 检测到混合精度输入 → 回退到 aclop
  • 检测到 hx 中 tensor 数量不为 0 或 2 → 回退到 aclop

总结

该问题通过昇腾 PTA 侧增加回退机制解决,属于接口能力边界场景的适配,而非接口缺陷。aclnn 接口的能力边界与业界同类 RNN 加速接口一致,超出能力范围的场景由 PTA 层自动回退到 aclop 实现,确保昇腾 NPU 上 LSTM 接口的兼容性。此方案在保证性能的同时,通过合理的回退策略实现了功能的完整覆盖。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐