摘要:以单算子开发为例,带你了解算子开发及测试全流程。

为什么要自定义算子

深度学习算法由一个个计算单元组成,我们称这些计算单元为算子(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处理器的算子开发

→点击直达华为云学院,get更多新技能

点击关注,第一时间了解华为云新鲜技术~

自定义TBE算子入门,不妨从单算子开发开始相关推荐

  1. BCSP-玄子前端开发之JavaScript+jQuery入门CH13_表单校验

    BCSP-玄子前端开发之JavaScript+jQuery入门CH13_表单校验 4.13 表单验证 4.13.1 为什么要表单验证 保证输入的数据符合要求 减轻服务器的压力 [外链图片转存失败,源站 ...

  2. 机器学习入门的书单(数据挖…

    原文地址:机器学习入门的书单(数据挖掘.模式识别等一样)转 作者:想法简单 (写在前面)昨天说写个机器学习书单,那今天就写一个吧.这个书单主要是入门用的,很基础,适合大二.大三的孩子们看看:当然你要是 ...

  3. 网页制作表单代码java_JSP动态网页入门:表单输入例子

    我们将创建一个web页面,它有一个输入表单,用户可以输入一个股票代号以获得出当前股票价格(有20分钟延迟).如果输入有误,则显示错误提示页面. quote.jsp 首先,用以下代码创建quote.js ...

  4. java求sobel算子代码_边缘检测sobel算子

    #1,个人理解 网上查了很多资料,都说sobel算子是用来检测边缘的,分别给了两个方向上的卷积核,然后说明做法,就说这就是sobel算子.对于我个人来说,还有很多不明白的地方,所以理清下思路. #2, ...

  5. Moveit!入门——古月居机械臂开发笔记(二)

    Moveit!入门--古月居机械臂开发笔记(二) 引言 ROS机械臂开发_机器视觉与物体抓取 1.ROS中的运动学插件 2.Moveit!碰撞检测 规划场景 3.Pick and Place 4.RO ...

  6. 圣诞节营销攻略之贺卡、逼单、开发的模板

      <读书歌>:春天不是读书天,夏日炎炎正好眠,秋日苦长且狠睡,收拾收拾又一年. 年关圣诞临近,关于圣诞的关键词就热搜起来了,本文内容主要是分享贺卡.逼单和开发的模板与大家分享. 我们上学 ...

  7. Moveit!入门——古月居机械臂开发笔记(一)

    Moveit!入门--古月居机械臂开发笔记(一) 引言 Moveit!与机械臂控制 1.创作机械臂模型 2.生成配置文件 3.如何使用Moveit!实现机械臂仿真(gazebo) 完善模型 在gaze ...

  8. 物联网新零售项目 工单核心业务开发

    第3章 工单核心业务开发 1. 微服务集成EMQ 1.1 MQTT客户端- Paho Paho Java客户端是用Java编写的MQTT客户端库,用于开发在JVM或其他Java兼容平台(例如Andro ...

  9. 立可得_第4章_工单核心业务开发

    立可得_第4章_工单核心业务开发 文章目录 立可得_第4章_工单核心业务开发 第4章 工单核心业务开发 1. 微服务集成EMQ 1.1 MQTT客户端- Paho 1.2 基于Paho的代码实现 1. ...

最新文章

  1. MySQL 数据库的优化,你知道有哪些?
  2. 传统负载均衡助力AIOps优化智能运维
  3. vue启动项目报错:npm ERR! missing script: serve解决方法
  4. html5 jpg转webp格式转换,JPEG和WebP格式图片的差别
  5. AI从业人员需要必备这些算法和工具!
  6. 【通信】基于matlab Alamouti空频编码【含Matlab源码 801期】
  7. xvideos打开显示服务器出错,为什么打开xvideo显示网页
  8. ss下,解决ncurl: (7) Failed to connect to android.googlesource.com port 443: Connection refused
  9. 人工智能:智能优化算法
  10. 什么是动态与静态IP
  11. QT开发笔记(多媒体实例之视频播放器)
  12. Nginx下https模式下,不带www的域名无法自动跳转到带www域名的问题
  13. 桌面文件删除了怎么恢复
  14. php去掉notice错误,学习猿地-php怎么关闭notice级别的错误提示?
  15. Java初级·基础语法
  16. shell小记:dirname
  17. java入门-java程序
  18. 度过有意义的生命(下)
  19. 不枕枕头对健康是不好的
  20. ENC28J60学习笔记——第1部分

热门文章

  1. 选择Bootstrap的理由
  2. bat随机打开目录下的一个音乐文件_Tomcat bin目录详解
  3. 5 批量更新多条记录_批量更新现有记录的默认表格方法
  4. python中构造方法的名字,【填空题】Python提供了名称为 的构造方法,实现让类的对象完成初始化。...
  5. usb禁止重定向_一种USB重定向处理方法和系统与流程
  6. 2019.01.21 bzoj2441: [中山市选2011]小W的问题(树状数组+权值线段树)
  7. Android清空Fragment回退栈
  8. php(2)—基础补充
  9. Python学习笔记015——汉字编码
  10. 网易云免费OSS服务用做Markdown图床或博客图片外链