神经网络编译器优化
文章平均质量分 71
优化
free1993
这个作者很懒,什么都没留下…
展开
-
AutoSchedule和AutoTVM
简介AutoTVM用户自己手写一个模版,在模版里面自己定义一下tune的参数,例如tile size等。给定一个模版,在这个模版里面去搜索参数,使得可以达到一组最好的参数使得张量计算的结果最好。但是,它是一种基于模板的方法,因此仍然需要领域专家为每个平台上的每个算子实现一个性能比较好的模板。今天,TVM 代码库中有超过 15,000 行这些模板的代码。除了非常难以开发之外,这些模板通常效率低下且搜索空间有限,无法实现最佳性能。Auto Schedule : Template-free Auto Sch原创 2021-07-19 17:00:46 · 1086 阅读 · 0 评论 -
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 评论 -
代码优化-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 评论 -
Halide-based IR和 Polyhedral-based IR
背景编译器后端的第一步是生成低级IR。低级IR可以理解为实现单个算子的算法的抽象表达形式。编译器后端的第二步是后端优化。针对不同的硬件架构,不同的算法实现方式有不同的性能。后端优化的目的就是希望能找到算子的最优实现方式,达到最优的性能。编译器后端优化是AI编译器的核心内容。编译器后端的第三步是代码生成。代码生成即把优化后的低级IR转化成机器指令,这一步通常会借助其他成熟的编译工具来实现,不是AI编译器的核心内容。常用的编译工具包括跨平台的LLVM、Nvidia GPU的编译工具NVCC等等。AI编译器会原创 2021-05-10 18:33:50 · 2263 阅读 · 0 评论 -
神经网络的加速
背景目前神经网络应用在大多数的场景,包括计算机视觉(包括目标识别、检测),推荐系统,大型的科学计算等。神经网络的计算本质上是张量计算(tensor),因此为了加速神经网络的计算,我们就需要进行张量的加速计算。为了加速张量计算,我们需要软硬件协调。张量计算有两个特征计算密集(compute-intensive)访存受限(memory-bound)目前现存的一些技术算法层面稀疏性所谓的稀疏,就是利用神经网络计算过程中的零值元素。提出的要求就是只取出非零数值送到PE中,然后进行运算。包括的方面原创 2021-05-08 15:03:19 · 1972 阅读 · 0 评论 -
神经网络编译器的Tensor优化:auto tune和auto schedule
一般情况下,深度神经网络的计算本质上是一对tensor的计算,例如常见的conv2d的计算本质上是一个7层的for循环,那么底层的硬件,例如内存大小,SM的数量,threads和blocks等都会对最终的for循环造成影响。现存的深度学习框架(例如Tensorflow,PyTorch ,MXNet)会将DNN中的计算映射到其底层提供的向量计算内核库(例如cuDNN,MKL-DNN)来实现高性能。 但是,这些内核库存在以下几个问题:现存的加速库cuDnn,MKL-DNN针对Tensor的优化是需要耗费大原创 2021-04-28 18:03:57 · 1817 阅读 · 0 评论