关于深度学习编译器,这些知识你需要知道
作者 | 小O妹
出品 | AI科技大本营(ID:rgznai100)
神经网络编译器概览
近年来,以机器学习、深度学习为核心的AI技术得到迅猛发展,深度神经网络在各行各业得到广泛应用:
1. CV(计算机视觉):目标检测,场景识别,图像分割等。
2. 智慧语音:语音识别,声纹识别等。
3. NLP(自然语言处理):自动搜索引擎、对话服务机器人、文本分类、智能翻译等。
4. 科学研究:应用于物理、生物、医学等多研究领域。高能粒子对撞分类,宇宙天体图数据分析,星系形状建模,生物结构的蛋白质折叠预测,精准医疗与疾病预测。
这些应用催生更多的新模型出现:CNN, RNN, LSTM, GAN, GNN,也催生着如TensorFlow, PyTorch, Mxnet, Caffe等深度学习框架出现。目前训练框架开始收敛,逐步形成了PyTorch引领学术界,TensorFlow主导工业界的一个双雄局面。
但是,深度学习算法要实现落地应用,必须被部署到硬件上,例如Google的TPU、华为麒麟NPU,以及其他在FPGA上的架构创新。
各训练框架训练出来的模型要如何部署到不同的终端硬件,就需要深度学习神经网络编译器来解决。
在神经网络编译器出现之前,我们使用的是传统编译器。
传统编译器:
以LLVM(low level virtual machine)为例,其输入是高级编程语言源码,输出是机器码,由一系列模块化的编译器组件和工具链组成。
LLVM通过模块分为前端、中端(优化)和后端三部分。每当出现新的编程语言,只需要开发相应的前端,将编程语言转换成LLVM的中间表示;类似地,出现新的硬件架构,只需要开发相应的后端,对接上LLVM的中间表示。
模块化的划分,避免了因编程语言和CPU架构的翻新而引发的编译器适配性问题,大大简化了编译器的开发工作。
神经网络编译器:
其输入是深度学习训练框架训练出来的模型定义文件,输出是能够在不同硬件高效执行的代码。
从上至下由四个层级组成:
1. 最上层对接各个深度学习训练框架训练出来的算法模型(Tensorflow, Caffe, Pytorch, Mxnet等)。
2. 图层级(High-level IR):神经网络的结构可以表示成计算图,图层级的操作则是对计算图进行一些和具体硬件和框架无关的操作,比如算子融合,内存分配优化,数据类型和数据维度的推导等。
我们可通过算子融合的方式,避免中间数据频繁的在寄存器和内存直接来回读写,从而提升整体推理性能。
Nividia通过把conv, bn, relu这三个算子融合成一个算子 fuse- CBR. 实现了三倍的推理性能提升。
3. 算子层级(operator level/kernel level)算子层级主要是张量计算。为了实现这些计算在硬件上高效实现,发挥芯片的性能,通常硬件芯片配有专门优化的算子计算库,如Intel的MKL, Nvidia的CuDNN, TensorRT。这个层级需要支持每个硬件后端的算子实现。
4. 各硬件后端:GPU, ARM CPU, X86 CPU, NPU等。
自深度学习编译器的概念提出以来,各类编译器变层出不穷的出现。
TVM的前世今生
在编译器快速发展的浪潮中,较为突出的便是TVM(Tensor Virtual Machine)。
TVM最早提出是2017年,是深度学习系统的编译器堆栈。
第一代TVM的设计借鉴了借鉴传统编译器框架LLVM的设计思路,设计抽象出中间表示层,不同的模型只需要开发相应的前端接口,不同的后端只需要开发相应的后端接口。
TVM全称为Tensor Virtual Machine,属于算子层级,主要用于张量计算,提供独立于硬件的底层计算中间表示,采用各种方式(循环分块,缓存优化等)对相应的计算进行优化。第一代的图层级表示叫NNVM(Neural Network Virtual Machine)。NNVM的设计目标是:将来自不通深度学习框架的计算图转换为统一的计算图中间表示(IR),对之进行优化。
第一代的静态图存在一定的缺陷:
1. 不能较好支持控制流,如分支跳转,循环等。
2. 不能支持计算图输入形状,取决于输入tensor大小的模型,比如word2vec等。
虽然Tensorflow有如tf.cond.Tf.while_loop的控制接口来在某种程度上解决第一个问题,tf.fold来解决第二个问题,但是这些方式对刚刚接触深度学习框架的同学来说门槛过高。
后面出现的动态图摒弃了传统的计算图先定义,后执行的方式,采用了计算图在运行时定义的模式,这种计算图就称为动态图。
第二代TVM的图计算层变为Relay VM,Relay和第一代的图计算表示NNVM的最主要区别是Relay IR除了支持dataflow(静态图), 能够更好地解决control flow(动态图)。它不仅是一种计算图的中间表示,也支持自动微分。
总结一下,目前TVM的架构是:
1. 最高层级支持主流的深度学习前端框架,包括TensorFlow,MXNet,Pytorch等。
2. Relay IR支持可微分,该层级进行图融合,数据重排等图优化操作。
3. 基于tensor张量化计算图,并根据后端进行硬件原语级优化,autoTVM根据优化目标探索搜索空间,找到最优解。
4. 后端支持ARM、CUDA/Metal/OpenCL、加速器VTA(Versatile Tensor Accelerator)。
Halide
Halide于2012年提出,主要用于自动优化。其嵌入到C++中,是MIT研究人员专门为图像处理设计的一种程序语言。Halide语言易于编写,语法简单,数据结构清晰,能过自动对代码进行优化,使得程序获得比较好的执行效率。
它设计的核心思想是把算法和调度分离。这样做的好处是,在给定算法的情况下只需要去调整它的Schedule 调度选择,不用重写算法实现不同的Schedule。当调整Schedule、探索设计空间时也不会担心因为重写算法而导致计算的正确性会发生变化。
Algorithm部分主要是算法描述和计算的数学表达式。
Halide于2012年提出,主要用于自动优化。其嵌入到C++中,是MIT研究人员专门为图像处理设计的一种程序语言。Halide语言易于编写,语法简单,数据结构清晰,能过自动对代码进行优化,使得程序获得更好的执行效率。
它设计的核心思想是把算法和调度分离。这样做的好处是,在给定算法的情况下只需要去调整它的Schedule调度选择,不用重写算法实现不同的Schedule。当调整Schedule、探索设计空间时也不会担心因为重写算法而导致计算的正确性会发生变化。
Algorithm部分主要是算法描述和计算的数学表达式。
Schedule部分则是告诉机器什么时候分配内存,如何计算(分块计算还是顺序计算)——目前已经提供了一些调度策略。
不同调度策略考虑重复冗余计算和局部性(locality)的权衡。
AutoKernel
深度学习模型能否成功在终端落地应用,满足产品需求,一个关键的指标就是神经网络模型的推理性能。
目前的高性能算子计算库主要是由高性能计算优化工程师进行手工开发。然而新的算法/硬件的不断涌现,导致了算子层级的优化开发工作量巨大。同时优化代码的工作并不是一件简单的事,它要求工程师既要精通计算机体系架构,又要熟悉算子的计算流程。
人才少,需求多,技术门槛高,因此我们认为算子优化自动化是未来的大趋势。而提出AutoKernel的初衷便是希望能把这个过程自动化,从小处入手,在算子层级的优化,实现优化代码的自动生成。
AutoKernel的输入是算子的计算描述(如Conv、Poll、Fc),输出是经过优化的加速源码。
这一工具的开发旨在降低优化工作的门槛,不需要有底层汇编的知识门槛,不用手写优化汇编。可通过直接调用开发的工具包便可生成汇编代码。同时还提供了包含CPU、GPU的docker环境,无需部署开发环境,只需使用docker便可。还可通过提供的插件——plugin,可以把自动生成的算子一键集成到推理框架中——Tengine。
对应地,算子层级的AutoKernel则主要分为三个模块,
1. Op Generator:算子生成器,采用了开源的Hallide。
2. AutoSearch:目前还在开发中,目标是通过机器学习、强化学习常用算法自动搜索出优化策略。
3. AutoKernel Plugin:把生成的自动算子以插件的形式插入到Tengine中,和人工定制互为补充。
Tengine对象层对接了不同的神经网络模型,图层级的NNIR包含了模型解析、图层优化,算子层级则包括高性能计算库(HCL lib)。
AutoKernel Plugin主要分为生成和部署两部分,生成部分用Hallid填写算法描述和调度策略,执行时指定后端类型(基本覆盖目前的主流后端)。
部署部分则封装为Tengine的库,直接调用。
相信随着更多开发者的加入,AutoKernel开源社区会有更大的突破与成长,在未来的深度学习编译器领域中,留下浓重的一笔。
项目开源Github地址:https://github.com/OAID/AutoKernel
点击这里 ???? 关注我们~~~
更多精彩推荐
☞RedHat 年度报告:只索取不贡献的开源消费“大户”不受待见☞腾讯:这可是一只“骨骼清奇”的狗☞Python 搭建车道智能检测系统☞“踢爆”职场焦虑、玩机车、文科转大厂程序媛,乘风破浪的 IT 女神太飒了!
点分享点收藏点点赞点在看
相关文章:

checkbox点击切换选中状态
2019独角兽企业重金招聘Python工程师标准>>> function cboxChecked(ele) {$(ele).click(function () {var isChecked $(ele).attr(checked);if (!isChecked) {$(ele).attr(checked, true)} else {$(ele).attr(checked, false)}})} 转载于:https://my.oschina.net/u…

提升Hadoop计算能力的并行框架
集算器是新型并行计算框架,它支持读写HDFS中的文件,可以通过并行框架将计算任务分担到多个节点中。它专注于加强Hadoop的计算能力,从而实现计算性能和开发效率更高的大数据应用。更强的计算能力。Hadoop所使用的计算语言为JAVA,JA…

在ASP.NET 2.0中建立站点导航层次
站点导航提供程序--ASP.NET 2.0中的站点导航提供程序暴露了应用程序中的页面的导航信息,它允许你单独地定义站点的结构,而不用考虑页面的实际物理布局。默认的站点导航提供程序是基于XML的,但是你也可以通过编写自定义的提供程序,…

加速数据中心变革,Xilinx推出软件定义、硬件加速型 Alveo SmartNIC
近日,为满足现代数据中心发展需求,赛灵思公司宣布推出一系列全新数据中心产品及解决方案,包括全新 Alveo SmartNIC 系列、smart world (智能世界) AI 视频分析应用、一款能够实现亚微秒级交易的加速算法交易参考设计&a…

跟阿里云技术专家阙寒一起深度了解视频直播CDN技术
网络直播平台现下已经十分火热,很多常见的直播平台都采用了阿里云直播CDN来搭建自身业务。今天,我们请来了阿里云CDN团队技术专家阙寒,来介绍下视频的一些基础知识和视频直播的架构。在进入正题之前,我们先来了解视频直播相关的名…

一个ASP.NET中使用的MessageBox类
/// <summary>/// 自定义信息对话框/// </summary>public class MessageBox{/// <summary>/// 定义一个web页面,用来显示用户自定错误提示信息/// </summary>System.Web.UI.Page p;/// <summary>/// 实例时,参数为:this 如…

Ubuntu 13.10 安装Terminalx 后更改默认终端设置
1、安装 terminalx, sudo apt-get install terminator 2、Ctrl Alt t 试一下打开什么终端,我的默认启动的是Terminator;如果想换换默认的终端,还需以下一步 3、接下来,安装dconf-tools,这个是设置默认终端的必须 打开…

360数科张家兴:如何突破三大瓶颈,破解金融科技发展难题?
3月6日,上海香港联会、普陀香港联会联合普陀新区联会,IFTA亚洲金融科技师学会共同举办了“沪港合作共创未来”——沪港两地金融科技线上论坛。本次活动通过沪港两地直播连线,探讨两地金融科技领域的发展机遇。麻省理工学院香港创坊执行董事冼…

通过改进算法来优化程序性能的真实案例(Ransac)
对于运行不了几次,一次运行不了多久的方法,我们不需要考虑性能优化,对于那些需要经常运行几百次几千次的方法,我们头脑里还是要有性能这根弦。C#太优雅方便了,以至于很多人写程序时根本就把性能抛到脑后了,…

ASP.NET中使用MD5和SHA1算法加密
你的主页或者你管理的网站有各种密码需要保护,把密码直接放在数据库或者文件中存在不少安全隐患,所以密码加密后存储是最常见的做法。在ASP.NET中实现加密非常容易。.NET SDK中提供了CookieAuthentication类,其中的HashPasswordForStoringInC…

不追逐标准化产品,360数科的一站式风控体系有何不同?
新冠肺炎疫情无疑加速了金融行业数字化转型,竞争者不断涌入,逐渐形成由BATJ、传统银行旗下金融科技子公司、以及专注于金融机构的数字化服务公司构成的竞争格局。然而,风控始终是金融行业的核心。作为定位于中国零售金融领域科技服务商的360数…

基于Bootstrap里面的Button dropdown打造自定义select
最近工作非常的忙,在对一个系统进行改版。项目后台是MVC1.0开发的,但是前端部分已经改过几个版本,而已之前的设计师很强大,又做设计又做前端开发。而已很时尚和前沿,使用了一直都很热门的Bootstrap工具包,有…

HybridDB · 源码分析 · MemoryContext 内存管理和内存异常分析
背景 最近排查和解决了几处 HybridDB for PostgreSQL 内存泄漏的BUG。觉得有一定通用性。 这期分享给大家一些实现细节和小技巧。 阿里云上的 HybridDB for PostgreSQL 是基于 PostgreSQL 开发,定位于 OLAP 场景的 MPP 架构数据库集群。它不少的内部机制沿用了 Post…

联合南京大学,爱奇艺智能论文入选顶会CVPR 2021
日前,全球计算机视觉顶级会议CVPR (IEEE Conference on Computer Vision and Pattern Recognition)公布了2021年论文接收结果。作为计算机视觉领域世界三大顶会(CVPR、ICCV、ECCV)之一,CVPR的论文投稿量近五年来持续大涨。据CVPR官网显示,今…

Forefront_TMG_2010-TMG发布Web服务器
1.环境拓扑图:2.准备DMZ区域的Web服务器:安装Web服务器:在DMZ区域的Web服务器进行测试:3.TMG发布Web服务器:打开TMG管理控制台,新建“网站发布规则”:新建名称:选择“允许”…

ASP.NET实现身份模拟
使用模拟时,ASP.NET 应用程序可以选择以这些应用程序当前正为之操作的客户的身份执行。通常这样做的原因是为了避免在 ASP.NET 应用程序代码中处理身份验证和授权问题。而您依赖于 Microsoft Internet 信息服务 (IIS) 来验证用户,然后将已通过验证的标记…

Mac homebrew类似apt-get命令安装包
INSTALL brew ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 其它: 其他brew命令 brew list 列出已安装的软件 brew update 更新brew brew home 用浏览器打开brew的官方网站 brew inf…

asp.net中长内容自动分页的实现
在一篇文章过长时,可以自动的写个小程序对其进行分页.具体代码:public class t3 : System.Web.UI.Page { private string str;//字符 private int strl;//字符总长度 private int pagesize;//每页显示的字符数 …

黑马程序员之List--队列、栈...
--------------------- ASP.NetUnity开发、.Net培训、期待与您交流! ---------------------- 1.队列:先进先出 运行结果: zhangsan lisi wangwu 2.栈:先进后出 结果: lisi wangwu zhangsan 3. 去除重复元素思路&#x…

龙芯架构应用迁移技术分享——搜狗输入法应用迁移
技术引领创新,用“芯”构建生态,第一期龙芯生态论坛将于2021年3月12日(周五)盛大开讲!龙芯生态论坛作为龙芯生态建设的重要技术交流窗口,将汇聚龙芯资深技术专家及行业生态伙伴精英,持续开展行业…

Health Check in eShop -- 解析微软微服务架构Demo(五)
引言 What is the Health Check Health Check(健康状态检查)不仅是对自己应用程序内部检测各个项目之间的健康状态(各项目的运行情况、项目之间的连接情况等),还包括了应用程序对外部或者第三方依赖库的状态检测。 Why…
网易伏羲论文入选 CVPR:AI 感知表情能力或实现巨大突破!
出品 | AI科技大本营(ID:rgznai100)2月28日,人工智能顶级会议CVPR 2021(国际计算机视觉与模式识别会议,Conference onComputer Vision and Pattern Recognition)公布论文录取结果,网易伏羲共有3…

asp.net/c#字符格式化大总结
一、用{0:?}格式化可通过 String.Format 方法或通过 Console.Write 方法格式化数值结果,其中后一种方法调用 String.Format。使用格式字符串指定格式。下表包含受支持的标准格式字符串。格式字符串采用的形式为 Axx,其中 A 为“格式说明符”,…

小鱼提问1 类中嵌套public修饰的枚举,外部访问的时候却只能Class.Enum这样访问,这是为何?...
/// <summary>/// 常量等定义/// </summary>public class General{/// <summary>/// 文件类型/// </summary>public enum FileType{}}小鱼提问:都是public修饰,为何外部只能General.FileType这样访问?既然外部都不能…

radio根据name 获取选中值及判断是否被选中
$(input:radio[name"fjscfs"]:checked).val();根据id判断是否被选中if($("#A26").is(":checked")){}根据class判断是否被选中if($(".A26").is(":checked")){}转载于:https://blog.51cto.com/ty2538402559/1949828

ASP.NET中用healthMonitor属性用
在ASP.NET 2.0中,可以使用healthMonitoring属性监测事件。healthMonitoring属性是一个基于方法的provider,在这里可以构造自己的provider。利用healthMonitoring属性,我们可以诸如记录错语、成功的事件等,对不同的数据源ÿ…

用 Python 动态可视化,看看比特币这几年
作者 | 刘早起来源 | 早起Python头图 | 下载于视觉中国最近几年,一直站在风口浪尖的比特币被追捧为最佳的投资产品,拥护者们认为这种加密货币是一种类似于黄金的储值工具,可以对冲通胀和美元疲软。其他人则认为,比特币的暴涨只是一…

违规用户处理办法
2019独角兽企业重金招聘Python工程师标准>>> 1.简单设置用户信赖状态 给用户设置信任字段,0不可信任,1默认许可(默认值),2可信赖用户 当用户违规后,对其进行惩罚并设置其为 不可信赖状态&#…

linux同步软件
linux同步软件:scp,rsync,inotify,sersync一、scpscp就是secure copy,是用来进行远程文件拷贝的。数据传输使用 ssh,并且和ssh 使用相同的认证方式,提供相同的安全保证 。 与rcp 不同的是,scp 在需要进行验证时会要求你…

C语言内联函数
内联函数也称内嵌函数,它主要解决程序的运行效率。 #####################问题######################################### 函数调用需要建立栈内存环境,进行参数传递,并产生程序执行转移,这些转移都需要时间开销。 有些函数在程序…