背景
现在执行类似下面的 pytorch 代码时候:
a[129] = b 这种 scatter 操作,我们使用了 GE接口,使用算子原型进行构图来进行表达。我们尝试了使用 ScatterElements 和 viewcopy 算子来构图,分别对应下面两张图:
- 使用 ScatterElements 算子

模型执行 kernel 耗时占比: 
执行时间: 
- 使用 viewcopy 算子

模型执行 kernel 耗时占比: 
执行时间: 
我们对比发现,同样的实现 ViewCopy 和 ScatterElements 操作都可以实现期望的功能,但是 ViewCopy 性能会更好点。但是 ViewCopy 本身也是使用 AICPU 实现,最终的性能比我们现象的还是要差一些。
以下是我们在 llama2 7b 前向推理中使用 viewcopy 最终耗时占比: 
我们发现 viewcopy 在仅调用 64 次的情况下, kernel耗时占比达到了 18%,这让我们认为这个算子性能比较差。
我们的问题:
- 类似上述这种 scatter update 操作,除了ScatterElements/ViewCopy 还有没有其他什么算子可以更高效的实现?
- 目前我们尝试的两个算子都是跑在 AI CPU 上的,有没有什么方法可以提供性能?
实验环境
CANN 版本: 8.0.RC1.alpha001
cpu架构:aarch64
硬件:Atlas 800T A2
背景
现在执行类似下面的 pytorch 代码时候:
import torch a = torch.randn(130, 32, 128) b = torch.randn(1, 32, 128) def forward(self, a, b): a[129] = b return a + a out = forward(a, b)a[129] = b这种 scatter 操作,我们使用了 GE接口,使用算子原型进行构图来进行表达。我们尝试了使用 ScatterElements 和 viewcopy 算子来构图,分别对应下面两张图:模型执行 kernel 耗时占比:
执行时间:
模型执行 kernel 耗时占比:
执行时间:
我们对比发现,同样的实现 ViewCopy 和 ScatterElements 操作都可以实现期望的功能,但是 ViewCopy 性能会更好点。但是 ViewCopy 本身也是使用 AICPU 实现,最终的性能比我们现象的还是要差一些。
以下是我们在 llama2 7b 前向推理中使用 viewcopy 最终耗时占比:
我们发现 viewcopy 在仅调用 64 次的情况下, kernel耗时占比达到了 18%,这让我们认为这个算子性能比较差。
我们的问题:
实验环境
CANN 版本: 8.0.RC1.alpha001
cpu架构:aarch64
硬件:Atlas 800T A2