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

为什么要自定义算子

深度学习算法由一个个计算单元组成,我们称这些计算单元为算子(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. halcon基础算子介绍(窗口创建,算子运行时长,是否启用更新函数)

    前言 halcon有有大约1500个算子,我总结一些简单大家用得到的算子,比如创建窗口的方式有3种,接下来结束这方式,及其异同点等! 1.窗口创建的三种方式 1.1使用dev_open_window算 ...

  2. Hibernate入门2.简单的项目开发实例

    Hibernate入门2.简单的项目开发实例 这一节通过一个简单的项目学习Hibernate项目的配置 代码下载 : 链接: http://pan.baidu.com/s/1zlgjl 密码: p34 ...

  3. 课程上线 -“新手入门 : Windows Phone 8.1 开发”

    经过近1个月的准备和录制,“新手入门 : Windows Phone 8.1 开发”系列课程已经在Microsoft 虚拟学院上线,链接地址为:http://www.microsoftvirtuala ...

  4. 优化单页面开发环境:webpack与react的运行时打包与热更新

    前面两篇文章介绍初步搭建单页面应用的开发环境: 第一篇:使用webpack.babel.react.antdesign配置单页面应用开发环境 第二篇:使用react-router实现单页面应用路由 这 ...

  5. 让 Python 带你进入开源的世界——Git 从入门到与他人协作开发

    让 Python 带你进入开源的世界--Git 从入门到与他人协作开发 我认为开源社区中有很多优秀的资源,并且可以帮助进阶中的程序员提高编程能力和水平.所以,我发起了<HelloGitHub&g ...

  6. 【Git 使用笔记】第二部分:基本命令 和 单分支开发

    git 基本命令 git add . git commit -am "请填写你NB的备注" git fetch --all git fetch -p  //如果远程分支删除了,本地 ...

  7. 详解H5中的history单页面,手动实现单页面开发,细说h5单页面原理

    就目前来看,前端的单页面开发占了很大一部分,一方面无刷新的切换增强了体验,并且浏览器记录依然存在,前进后退都没问题,在之前我们通地址栏中的hash改变来触发onhashchange方法来实现单页面应用 ...

  8. React Native实战系列教程之自定义原生UI组件和VideoView视频播放器开发

    React Native实战系列教程之自定义原生UI组件和VideoView视频播放器开发   2016/09/23 |  React Native技术文章 |  Sky丶清|  4 条评论 |  1 ...

  9. 【转】hurry_liu 大神STM32移植contiki入门之一:系统介绍和开发环境搭建

    前言: 由于项目的原因,需要在LPC1788(STM32 cortex-M3)上面跑contiki. 之前没有涉及到contiki,不知其为何物.不过这个不是难事,做IT的,每每遇到新事物,都不会处理 ...

  10. 牛客网Java刷题知识点之什么是单例模式?解决了什么问题?饿汉式单例(开发时常用)、懒汉式单例(面试时常用)、单例设计模式的内存图解

    不多说,直接上干货! 什么是单例设计模式? 解决的问题:可以保证一个类在内存中的对象唯一性,必须对于多个程序使用同一个配置信息对象时,就需要保证该对象的唯一性. 如何保证? 1.不允许其他程序用new ...

随机推荐

  1. js数据结构--集合

    <!DOCTYPE html> <html> <head> <title></title> </head> <body&g ...

  2. SQL基础应用

    SQL基础应用 更多详细内容请查阅:https://www.jianshu.com/p/08c4b78402ff 1.SQL介绍 结构化查询语言 5.7 以后符合SQL92严格模式 通过sql_mod ...

  3. django 国际化

    参考文档: https://docs.djangoproject.com/zh-hans/2.2/topics/i18n/translation/ https://blog.csdn.net/qq_3 ...

  4. HTTP 和 RPC 的区别

    一句话概括 RPC代表:Feign.Dubbo RPC 主要用于公司内部的服务调用,性能消耗低,传输效率高,服务治理方便. HTTP 代表:RestTemplate.HttpClient HTTP 主 ...

  5. Webpack相关知识点

    webpack的优点 webpack从配置的入口出发,可以打包所有前端资源,同时可以配置多种loader来处理不同类型文件的转换,并且可以配置plugin来扩展模块打包流程,满足更多构建中特殊的需求, ...

  6. 【PySide6】QChart笔记(三)—— QPieSeries的使用

    一.QPieSeries简介 1. 官方描述 https://doc.qt.io/qtforpython-6/PySide6/QtCharts/QPieSeries.html 一个饼图序列(QPieS ...

  7. Codeforces Round #702 (Div. 3) 题解

    写在前边 链接:Codeforces Round #702 (Div. 3) 比较简单,但是总是感觉脑子有点转不过弯来. A. Dense Array 链接:A题链接 题目大意: 在数组中插入若干个数 ...

  8. Leetcode回文数

    直接上python代码 class Solution: def isPalindrome(self, x: int) -> bool: if x<0: //负数必不是回文数 return ...

  9. 实例讲解SpringBoot集成Dubbo的步骤及过程

    首先,让我们先了解一下Spring Boot和Dubbo. Spring Boot 是一个开源的 Java Web 框架,它可以帮助开发者快速创建独立的.生产级别的 Spring 应用程序.Sprin ...

  10. StackGres 1.6 数据库平台工程功能介绍以及快速上手

    StackGres 1.6 数据库平台工程功能 声明式 K8S CRs StackGres operator 完全由 Kubernetes 自定义资源管理.除了 kubectl 或任何其他 Kuber ...