神经网络编译器
文章平均质量分 69
free1993
这个作者很懒,什么都没留下…
展开
-
Winograd(二)实测
测试环境说明:我测试了TVM里面默认的Winograd和卷积的模版。分别记录了他们运行的时间,发现在TVM没有优化的版本下,Winograd就是个笑话,就跑出来的时间就很坑,感觉winograd没有被广泛应用就是会存在加速其实没有很好的。测试例子输入的参数的说明batch,in_channel,in_size,num_filter,kernel,stride,padding,测试结果这测试结果,跑不过普通的卷积。还有很大的优化空间的。...原创 2021-06-30 17:02:55 · 227 阅读 · 0 评论 -
Winograd(一):背景知识介绍
背景winograd是针对卷积做的特定的卷积加速的算法。一维卷积对于输入是一维的In来说,当卷积核是F,输出是Out.其中y0和y1的计算公式如下所示:y0=z0x0+z1x1+z2x2y1=z1x0+z2x1+z3x2上面是针对的是正常卷积的计算过程,对于这种正常的卷积计算来说,我们是需要6次乘法和四次加法。为了加速计算,我们希望减少乘法的次数,用加法来代替乘法。因此winograd使用四个变量m1,m2,m3,m4来代替中间的计算。在这种情况下,将乘法减少到4次。因此我们将上述的计算原创 2021-06-28 18:39:10 · 1292 阅读 · 1 评论 -
多面体模型系列二
数据依赖关系多面体模型在上面的系列一已经介绍过了,然后我们现在需要来优化for循环之间的数据依赖关系。数据依赖关系可以分为3个基本的部分.对于我们例子中的二维矩阵的乘法来说,存在的三个数据依赖关系如下:Read dependence: the read-only data之间的流动。例如计算C[i][j]和C[i][j+1]都需要A[i][k] 。Flow dependence: transferring the intermediate results,例如C[i][j]的计算是不断累加中间变原创 2021-05-18 19:18:16 · 588 阅读 · 0 评论 -
多面体模型系列一
Polyhedral Model基本概念多面体模型是用于循环优化的数学模型,我们把满足多面体模型的循环称为static control part(SCoP)。在多面体模型中,一个循环由三个基本的组件组成:iteration domains, access relations, schedule.iteration domains由循环过程中访问的数据的下标组成。access relations标记访问的映射关系。schedule标记loop执行的过程针对上面的二维的矩阵乘法来说,iterat原创 2021-05-18 18:23:03 · 2211 阅读 · 3 评论 -
神经网络编译器图层面IR
图形IR图形IR,也被称为高级IR,代表计算流和控制流,并且与硬件无关。 高级IR的设计挑战是对计算流和控制流的进行抽象的能力,要能够表达出各种深度学习模型。 高级IR的目标是建立控制流以及算子与数据之间的依赖关系,并为图层面的优化提供接口。 它还包含丰富的语义信息以进行编译,并为自定义算子提供了可扩展性。分类DAG-based IR(a directed acyclic graph)有向无环图。其节点和边组织为有向无环图(DAG)。 计算图IR是一种以有向无环图(Directed Acyclic原创 2021-05-10 19:29:44 · 2472 阅读 · 0 评论 -
TVM简介
整体架构从开发者在不同深度学习开放平台上所撰写的代码,到最终在不同硬件平台上执行,这其中存在着不小的差距。深度学习框架更多关注开发者的便捷性,而硬件设备更注重能耗和效率。TVM/NNVM,定位于开源的深度学习编译器技术栈(open deep learning compiler stack),整体目的就是缩小这两者之间的差距。需要注意的是,无论是深度学习框架还是硬件设备,两者都具有高度的多样性,倘若一对一的进行优化和编译,工作量会由于组合爆炸而激增。为此,TVM/NNVM借用了在CPU架构中常用的编程语言原创 2020-12-12 18:34:25 · 9616 阅读 · 0 评论 -
代码优化-loop transformation(unroll,fusion,skew等)
loop transformation:模型的并行和局部性(时间和空间)loop fusion循环融合,就是将多个循环融合在一起。融合在一起的好处包括充分利用数据的局部性,同时利用一些pipeline/multithread的技术可以减少计算时间。例如对于下面的循环:在没有融合之前,我们得先访问A[i],然后串行访问B[i]。我们得launch两个kernel,也就是每个kernel都得处理一个for循环,这种增加了局部性。将一个整体的for循环拆成多个for循环称为loop fission.我原创 2021-05-10 19:19:09 · 1156 阅读 · 0 评论 -
谷歌在MLIR中支持稀疏张量积算(1)
MLIR(multi-level IR)首先,在现在的编译器里面是存在IR(Intermediate presentation)的概念的。这个IR的概念是为了在编译器的不同阶段来代表本层的语言的。例如说对于一些编译器的前端,是使用计算图来表示;对于一些后端,可能会使用一些DSL的表示形式。那么这些层之间来回转换这种中间表示就会存在复用性,开销,人力等问题。所以google就想用MLIR来统一所有的IR的表示。我的理解(如果有不对的地方,欢迎大家一起讨论),MLIR使用一种叫做方言(dialect)的形式来原创 2021-02-28 20:59:35 · 329 阅读 · 0 评论 -
神经网络编译器-常量折叠
常量折叠所谓的常量折叠,指在传统编译器做语法分析的过程中,如果一个表达式的所有的operands都是常量,那么在编译结束的时候,相当于直接用计算结果来代表计算表达式.例子如上图所示,在这个函数里面,实现了三个常量的乘法,那么在编译的过程中,直接用计算的结果来代替本来要用两个乘法指令表达的计算式.也就是用(101112)代替(abc).常量折叠的技术通常和常量传播(也就是分析占位符到底是个什么类型,如果是常量的话,把他的数值给替代了).神经网络编译器的常量折叠我们以简单的add-conv为例.左边原创 2020-12-21 18:17:44 · 892 阅读 · 0 评论 -
神经网络编译器优化-死代码消除
定义死代码指在程序执行的过程中可能无法执行或者访问的代码,以及仅影响死变量(写入但从未再次读取)的代码。死代码删除(DCE, dead code eliminate)是指删除在编译过程中没有使用的变量等的编译优化技术,这种编译优化技术可以保证在删除死代码之后不影响程序运行结果的正确性.例子以传统编译器为例,在这个例子里面,我们定义了三个变量:a,b,c.但是在实际执行的过程中,我们发现其实执行不到b+=a这行指令.因此对于这段代码来说,b是无效的.那么操作系统也不用额外分空间.在现在的神经网络编译器原创 2020-12-21 18:02:51 · 1239 阅读 · 0 评论