

自定义TBE算子入门,不妨从单算子开发开始
source link: https://my.oschina.net/u/4526289/blog/4839945
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

摘要:以单算子开发为例,带你了解算子开发及测试全流程。
为什么要自定义算子
深度学习算法由一个个计算单元组成,我们称这些计算单元为算子(Operator,简称Op)。算子是一个函数空间到函数空间上的映射O:X→X;从广义上讲,对任何函数进行某一项操作都可以认为是一个算子。于我们而言,我们所开发的算子是网络模型中涉及到的计算函数。在Caffe中,算子对应层中的计算逻辑,例如:卷积层(Convolution Layer)中的卷积算法,是一个算子;全连接层(Fully-connected Layer, FC layer)中的权值求和过程,也是一个算子。
Ascend 模型转换导航
绝大多数情况下,由于昇腾AI软件栈支持绝大多数算子,开发者不需要进行自定义算子的开发,只需提供深度学习模型文件,通过离线模型生成器(OMG)转换就能够得到离线模型文件,从而进一步利用流程编排器(Matrix)生成具体的应用程序。既然如此,为什么还需要自定义算子呢?这是因为在模型转换过程中出现了算子不支持的情况,例如昇腾AI软件栈不支持模型中的算子、开发者想修改现有算子中的计算逻辑、或者开发者想自己开发算子来提高计算性能,这时就需要进行自定义算子的开发了。
TBE算子开发流程
昇腾AI软件栈提供了TBE算子开发框架,开发者可以基于此框架使用Python语言开发自定义算子。首先,我们来了解一下什么是TBE。TBE的全称为Tensor Boost Engine,即张量加速引擎,是一款华为自研的算子开发工具,用于开发能够运行在NPU(Neural-network Processing Unit:神经网络处理器)上的TBE算子,该工具是在业界著名的开源项目TVM(Tensor Virtual Machine)基础上扩展的,提供了一套Python API来实施开发活动。在本次开发实践中,NPU特指昇腾AI处理器。
通过TBE进行算子开发的方式有两种:特定域语言开发(DSL开发)和TVM原语开发(TIK开发)。DSL开发相对简单,适用于入门级的开发者。其特点是TBE工具提供自动优化机制,给出较优的调度流程,开发者仅需要了解神经网络和TBE DSL相关知识,便可指定目标生成代码,进一步被编译成专用内核。TIK开发难度较高,适用于对于TVM编程及达芬奇结构都非常了解的开发者使用。这种方式的接口偏底层,需开发者自己控制数据流及算子的硬件调度。作为入门课程,我们这次使用的DSL开发方式。
TBE算子开发流程
接下来,我们就以一个简单的单算子开发为例,了解一下开发过程。
- 目标:
用TBE-DSL方式开发一个Sqrt算子
- 确定算子功能:
Sqrt算子功能是对Tensor中每个原子值求开方,数学表达式为y=
- 确定使用的计算接口:
根据当前TBE框架可支持的计算描述API,可采用如下公式来表达Sqrt算子的计算过程
算子代码的实现可分为以下步骤:
1)算子入参
shape:Tensor的属性,表示Tensor的形状,用list或tuple类型表示,例如(3, 2, 3)、(4, 10);
dtype:Tensor的数据类型,用字符串类型表示,例如“float32”、“float16”、“int8”等。
2)输入Tensor占位符
data = tvm.placeholder(shape, name="data", dtype=input_dtype)
tvm.placeholder()是TVM框架的API,用来为算子执行时接收的数据占位,通俗理解与C语言中%d、%s一样,返回的是一个Tensor对象,上例中使用data表示;入参为shape,name,dtype,是为Tensor对象的属性。
3)定义计算过程
4)定义调度过程
5)算子构建
6)测试验证
诶等一等,还没结束呢。只有在仿真环境中验证了算子功能的正确性,自定义算子的开发才算完成。
ST测试流程
我们需要用ST测试(即System Test系统测试)在仿真环境中测试算子逻辑的正确性以及能否正确地生成.o和.json文件。想知道具体是怎么测试的吗?与其看一大段枯燥的文字描述,不如来沙箱实验室亲自体验一番,一定更加直观。
读到这里,你是不是对自己的自定义算子开发能力更加有信心了?何不来华为云学院学课程、做实验、考证书来验证一下呢?喏,就是这门微认证啦:基于昇腾AI处理器的算子开发
Recommend
-
40
Spark RDD算子实例,包括非常多的实例。
-
82
有问题,上知乎。知乎是中文互联网知名知识分享平台,以「知识连接一切」为愿景,致力于构建一个人人都可以便捷接入的知识分享网络,让人们便捷地与世界分享知识、经验和见解,发现更大的世界。
-
60
-
34
一、第一次在公众号推广告? (这是认真的吗) 依稀记得有很多小伙伴在公众号给我留言说我的公众号算是技术圈内一股清流...
-
1
当你垂直开发新品遇到瓶颈时,不妨看下这个产品-跨境头条-AMZ123亚马逊导航-跨境电商出海门户 当你垂直开发新品遇到瓶颈时,不妨看下这个产品...
-
6
ki via Mac OS AIQ 134 号成员...
-
10
不妨试试更快更小更灵活Java开发框架Solon
-
5
想要自定义理想家居场景?不妨看看这位设计师推荐的家电单品 zhangli 2023年02月14日 15:43 理想家的样子,每个人心中各有所期。而...
-
9
手敲,Ascend算子开发入门笔记分享 本文分享...
-
10
自定义插件开发基本流程 TensorRT 本身只是一个推理优化框架,它需要从其他训练框架的模型中解析出网络结构,因此常常会遇到一些 TensorRT 不支持的算子,这时我们就需要用插件扩展功能来自己实现这些算子。 简单来说...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK