​**作者**​:昇腾实战派

​**知识地图**​:[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` 算子的越界行为属于硬件架构限制导致的环境差异,不视为算子实现缺陷。使用时应确保索引在合法范围内,避免越界访问。


 

Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐