TVM系列 |
您所在的位置:网站首页 › ai优化是什么意思 › TVM系列 |
TVM系列 - 图优化 - 算子融合
图优化综述
声明一下,本文所有的理解都是基于个人理解。 图优化算是一个推理框架前端比较成熟的操作了,一般来说,针对模型做图优化有两个目的(对于通用框架来说,就加速减少计算一个目的了): 减少Node的数量, 不管是算子融合,还是无效节点去除,共同的目的就是减少整个graph中node的数量,因为对于框架来说,从一个node到另一个node之间就意味着数据的搬运。举个例子,我们知道算子合并最经典的就是将BN层融合到Conv层,我们姑且不论融合后计算量的减少,单单是减少了将原Conv层输出数据搬运给Bn层输入这一步操作就有足够的理由让我们去实现他match硬件的限制,可能对于通用硬件来说还好,很多硬件对于算子的支持都非常少,有各种各样的限制,这时候就需要进行图优化来将算子转换到硬件支持的算子,常见的就是将各种算子转成卷积 😃 TVM算子融合算法介绍 首先,我们先看一种非常常见的网络子结构:
![]() ![]() ![]() 这里要明确一点,每一个步骤都是把数据从ddr搬运到专用的处理器(cpu的话就是cache,寄存器这些),比如SDP上,进行运算后,再吐出到ddr上的。所以,如果要一次性将这三个步骤在一个cycle中全部算完再吐出的话,首先要存张量x, 要存张量a, b,要存中间量或者说最终输出量y,而这个y你还不能复用x的空间,因为等下还要加x,这对专用硬件的要求是挺高的,同时对于框架也要求有所提升。 所以一般的框架对于算子融合其实能够做的非常有限,总不过就是卷积和BN融合,再把relu算上这些基础的做法,以Tengine为例: 但是TVM在算子融合上显然要做的更多,当然这主要得益于TVM强大的code generator,也就是编译器后端。 支配树TVM整体的算子融合是基于支配树来做的。那么什么是支配树呢? 简单来说,支配树就是由各个点的支配点构成的树,那么什么又是支配点呢?支配点在神经网络结构上可以理解为:所有能够到达当前节点的路径的公共祖先点(LCA)。 以图为例: TVM的算子融合策略就是检查每个Node到其支配点的这些Node是否符合融合条件,如果符合就对其进行融合。举例来说,比如上图Node55的支配点就是他下面的BN层,就检查它俩能不能融合,一看可以融合,就用新的Func去替代原来的这俩算子。同理,检查Node37到他的支配点之间所有路径是否符合融合规则。 那么,为什么要基于支配树去做呢?试想一下,如果不按照上述规则去做,你将Node37与其中一条路径合并了,那么另外一条咋办? 融合的基本规则就是融合掉的Node节点不会对剩下的节点产生影响。 支配树的生成我们都知道,神经网络结构可以看做是一个有向无环图(DAG),根据这个有向无环图我们可以生成对应的支配树。 具体步骤如下: 首先根据DAG进行深度优先遍历,生成DFS树,需要注意的是,这个DFS树是要倒序的,也就是最后一个节点是节点0,然后依次深度递增,如下图:![]() ![]() |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |