论文阅读MEC

阅读论文:MEC:https://arxiv.org/abs/1706.06873v1 Memory-efficient Convolution for Deep Neural Network原文的链接!
主要优化:结合之前的img2col和GEMM的优化的基础上,前两者的实现在某些基础上可以得到一定的优化,文章的主要优化方向是优化img2col和GEMM的计算策略中的内存消耗、而且还可以提升一点点的计算速度。
背景介绍:当前的CNN模型是现今比较流程的深度学习模型,一般实现的CNN模型中都包含着很多的卷积层和较少的全连接层,同时实验证明了卷积层的时间开销占据了整个模型的大多数时间,所以想要缩短模型的运行时间,那么必须首先缩短卷积层的运行时间。
现有存在的加速优化的方法:
Img2col+GEMM:现有的多种框架都是基于这种方法进行优化的如Caffe,其是将卷积操作优化为对应的矩阵乘法,然后使用现有的矩阵乘法的库来进行加速运算的。
WinoGrad算法:本算法主要是通过对应的减少卷积运算中的乘法运算的次数来达到加速运算,其也在很多的现成的框架中已经实现。
FFT算法:基于快速傅里叶算法的卷积操作实现,因为时域里面的卷积等于频域里面的乘积,可以将对应的卷积操作转换为频域之后然后再进行计算。
现有的FaceBook研发的NNPACK加速包就是将FFT和winograd两者进行结合后的结果。首先可以从两者的实现来看,不论是基础的img2col的方式和对应的WinoGrad的方式两者中,虽然两者的执行都是可以得到计算效率的提升,但是都会导致很大的内存开销,本文的主要的优化方向就是为了减少对应的内存开销的实现。

上图是对应的直接聚氨基和对应使用img2col的方式转换为矩阵乘法之后的运算实现。显然除了直接卷积外对应的img2col和winograd的方式中都会导致额外的内存开销,本文改进了对应的方法目的是为了降低对应的内存开销并且提高一定的计算效率。

在介绍对应的算法之前,首先是给出一些本文使用到的一些符号使用如下图所示:

文中对应的算法的实现主要有基础版本和最终版本两种实现:基础版本是没有考虑其中BatchSize和channel两个维度的引入导致的问题,文中给出的是输入特征图为77的,卷积核为33以及滑动步长为1的卷积层为例,只是需要将输入特征图当成一个通道数为1的普通的矩阵的时候即可。

下面是其实现的算法流程:

因为卷积核是33的,并且滑动的步长为1,所以这里循环取出A、B、C、D、E这个5个子矩阵,每个子矩阵的维度都是一样的公式,图2中的h的值代表对应的特征图的高度值即h=7的值,将A、B、C、D、E按照行优先展开并弄链接为一个大的中间矩阵,L,此时L的维度为:521.从其中循环取出P、Q、R、S、T这5个矩阵,然后计算能5此矩阵乘法,就获得了最终的输出特征图。
从上面的介绍中我们可以看到,MEC将Im2Col的过程分成了Height和Width两部分,于是需要存储的中间矩阵也大大减少了,因为如果是Im2Col,那么展开之后的矩阵大小是259==225,但是现在MEC需要的矩阵大小只有521=105,所以内存消耗降低了2倍。但是这样做可能带来的问题是,Im2Col+GEMM的一次矩阵乘法现在变成了多次小矩阵乘法,虽然这对并行计算是有利的,但如果使用OpenBlas库来计算则失去了它对大矩阵乘法计算的优势,但是现在的实现需要很多的开销,无法完成对应的高并行性,所以想要达到对应的性能需要很大的时间开销。
对应算法高级版实现,将之前忽略的两个维度考虑进去,然后再进行优化,对应都是优化其的内存开销。

对应的实现的细节图:

从上面的伪代码可以看出其的算法有两种实现,分别是针对于不同的计算硬件平台实现的了不同的方法。
实现一:Algorithm2中的第9-19行和Algorithm1中的方法完全一致,然后14-19行是对临时结果对做排列变化,即Figure3中的上半部分。
实现二:Algorithm2中的第21-25行。每次循环处理一个样本,不需要做额外的排列变化,即Figure3中的下半部分。
这两种计算方法的浮点乘法计算次数是完全一样的。但是,在实际操作中,子矩阵的数量对性能的影响是很大的,在算法1中执行了5次gemm,而算法2中执行15次gemm,如果使用Blas矩阵计算库,那么这两种方法在特定硬件平台如GPU上哪一种更好是需要考虑的。因此,在算法2的第8行使用了一个参数T来控制是使用算法1还是算法2,其中T是一个和硬件平台有关的参数。论文指出,如果是在GPU上,那么T取100是一个不错的值。
最后是文章中实现了对应的论文方法中对应的方式进行结果对比。在很多的平台上是可以得到很好的优化效果的。下面是使用到的对应的硬件平台环境,使用的环境如下:

最后的实验结果为:

从实验结果可以看到,无论是从内存占用还是运算时间都相比于WinoGrad,Im2Col+GEMM,FFT有一些优势,不过这里并没有给出更多的实验对比结果例如和NNPACK以及CUDNN的对比。本文的方法确实在很多的应用上达到了很好的效果,但是也存在很多不同的硬件环境没有去进行比较实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值