《昇腾 NPU 上 aclnnGather 算子越界场景精度比对失败的问题定位与处理》
**作者**:昇腾实战派
**知识地图**:[https://blog.csdn.net/Lumos\_Lovegood/article/details/161601003](https://blog.csdn.net/Lumos_Lovegood/article/details/161601003)
## 背景概述
在昇腾 NPU 上,`gather` 算子底层调用 tik 算子(基于 Ascend C 的领域编程接口)。受昇腾硬件架构微核(Cube Unit / Vector Unit)设计限制,tik 算子不支持在 kernel 内部进行日志上报和异常捕获。平台侧评估后认为,在 Ascend C 层增加越界检查会带来明显的性能开销,因此当前版本不添加越界报错逻辑,用户应在框架层确保索引合法性。本文记录了该场景下精度比对失败的问题定位过程与处理结论,为类似场景提供参考。
## 问题描述
在执行 `torch.distributions.categorical.Categorical.log_prob` 边界值精度比对测试时,发现精度比对失败。
测试命令如下(具体配置路径已省略):
```bash
atk task -c <用例配置JSON路径> -n <节点配置YAML路径> -p <用例工程目录>
```
## 报错日志
精度比对结果为不通过(`result: false`),`error_info` 提示:最大相对误差比例超过阈值(10.0),判定比对失败(具体比对数值略)。
## 根因分析
`aclnnGather` 算子在 index 超出 tensor 范围时,受昇腾硬件架构限制无法在 kernel 内做越界报错处理,会返回非预期结果;精度比对工具将 NPU 结果与 CPU 参考结果比对时,因而判定不通过,属于越界场景下的平台行为差异。
### 分析过程
- **参考实现(CPU)行为**:`gather` 越界时抛出 `RuntimeError` 异常。
- **NPU 行为**:越界时不报错,返回非预期结果。
- **测试验证**:输入 tensor 大小为 55、index=55(越界)时,CPU 参考实现报错,NPU 返回非预期结果。
- **底层限制**:受昇腾硬件架构微核设计限制,算子内不支持日志上报与异常捕获。
- **性能权衡**:在 Ascend C 层增加越界检查会带来明显的性能开销。
- **平台确认**:该行为属于昇腾硬件架构限制导致的环境差异。
## 修复方案
经与平台侧确认,综合考虑硬件架构限制与性能开销后,处理结论如下:
1. **不修改算子实现** — 在算子层增加越界检查会带来明显的性能开销,且受硬件限制无法在 kernel 内添加日志上报。
2. **按非问题关闭** — 该行为属于平台环境差异,而非算子实现缺陷。
## 结论
**结论:非问题关闭。**
昇腾 NPU 上 `aclnnGather` 算子的越界行为属于硬件架构限制导致的环境差异,不视为算子实现缺陷。使用时应确保索引在合法范围内,避免越界访问。
更多推荐




所有评论(0)