Ascend C算子入门
收藏回复举报
Ascend C算子入门
发表于2024-05-25 22:35:26
0 查看

1.什么是算子 - 算子的数学含义

算子在数学中的定义: 

-个函数空间到函数空间上的映射0:X→X; 

广义的讲,对任何函数进行某一项操作都可以认为是一个算子。比如微分算子,不定积分算子等。 

常见算子举例: tanh、ReLU、sigmoid等。

2.算子基本概念 - 总览

(1)算子名称(Name) 

算子的名称,用于标志网络中的某个算子,同一网络中算子的名称需要保持唯一。如右图所示Conv1,Pool1,Conv2都是此网络中的算子名称,其中Conv1与Conv2算子的类型为Convolution,表示分别做一次卷积运算。 

(2)算子类型(Type) 

网络中每一个算子根据算子类型进行算子实现的匹配,相同类型的算子的实现逻辑相同。在一个网络中同一类型的算子可能存在多个,例如右图中名称为Conv1的算子与Conv2算子的类型都为Convolution。 

(3)数据容器(Tensor) 

前面介绍了算子的类型与算子的名称。我们再看下网络中的算子,如右图所示,算子在网络中执行时,还需要一个重要的输入:数据,算子执行完后,也会有对应的数据输出。这种承载算子数据的容器定义为:张量(Tensor)。

3.算子基本概念- Tensor

张量(Tensor)是存储算子输入数据与输出数据的容器,而张量描述符(TensorDesc)是对输入数据与输出数据的描述,张量描述符的数据结构包含如下属性:

(1)名称(name):用于对Tensor进行索引,不同Tensor的name需要保持唯一。

(2)形状(shape):Tensor的形状,比如(10,)或者(1024,1024)或者(2,3,4)等。形式:(i1,i2...in),其中i1到in均为正整数

(3)数据类型(dtype):指定Tensor对象的数据类型。例如:floatl6,float32,int8,intl6,int32,uint8,uintl6,bool等不同计算操作支持的数据类型不同。

(4)数据排布格式(format):数据的物理排布格式,定义了解读数据的维度。

4.什么是Ascendc算子

(1)Ascend C是CANN针对算子开发场景推出的编程语言,通过多层接口抽象、自动并行计算、孪生调试等关键技术,极大提高算子开发效率,助力AI开发者低成本完成算子开发和模型调优部署。使用Ascend C编程语言开发的算子我们称之为Ascend C算子。

(2)使用Ascend C开发自定义算子的优势: 

.C/C++原语编程,最大化匹配用户的开发习惯 

.编程模型屏蔽硬件差异,编程范式提高开发效率 

.多层级API封装,从简单到灵活,兼顾易用与高效 

.李生调试,CPU侧模拟NPU侧的行为,可优先在CPU侧调试

5.什么场景需要开发自定义算子

一般场景下,开发者无需自己开发算子,但若遇到以下场景,开发者需要考虑进行自定义算子的开发。推理场景下,将第三方框架模型(例如TensorFlow、Caffe、ONNX等)使用ATC工具转换为适配昇腾平台的离线模型时遇到了不支持的算子。 

推理场景下,若应用程序中的某些逻辑涉及到数学运算(例如查找最大值,进行数据类型转换等)开发者可以将这些操作通过自定义算子的方式进行实现,然后在应用程序中对算子进行调用,从而利用昇腾AI处理器进行加速。 

例如,针对一个分类应用,我们想从分类模型的推理结果中查找可能性最大的前5个标识,则可以实现一个查找最大值的算子(例如ArgMax),后续就可以直接通过Ascendcl接口调用此算子实现对推理结果的后处理。 

训练场景下,将第三方框架(例如TensorFlow、PyTorch等)的网络训练脚本迁移到昇腾平台时遇到了不支持的算子。 

网络调优时,发现某算子性能较低,想重新开发一个高性能算子替换性能较低的算子

6.昇腾(Ascend)算子开发样例

FFT算子实现解决方法:

(1).算法实现方式适配: 

·二维化分块数据搬运 

·以基16分割进行FFT处理 

(2).矢量-矩阵运算结合 

·长于16的序列DFT通过矩阵单元计算 

短于16的序列通过向量计算单元完成

(3).灵活运用各类计算原语 

·选择规约指令处理小数据量FFT计算

我要发帖子