通用矩阵乘(GEMM)优化(卷积加速/卷积优化)(FFT & Winograd& Strassen)

神经网络前向耗时主要由卷积的耗时决定,参考賈杨青毕业论文,那么如何对卷积加速便成了重要的一个点。主流的加速方法有以下几种:

  • im2col+GEMM:目前几乎所有的主流计算框架包括 Caffe, MXNet 等都实现了该方法. 该方法把整个卷积过程转化成了GEMM过程,而GEMM在各种 BLAS 库中都是被极致优化的,一般来说,速度较快。
  • Winograd: Winograd 是存在已久最近被重新发现的方法,在大部分场景中, Winograd方法都显示和较大的优势,目前cudnn中计算卷积就使用了该方法。
  • Strassen:1969年,Volker Strassen提出了第一个时间复杂度低于O(N^3)的算法,其复杂度为O(N^(2^(log2(7)))),但这种方法只在大卷积核情况下优势才比较明显,目前还没有在开源框架中见到这种方法。
  • FFT:傅里叶变换和快速傅里叶变化是在经典图像处理里面经常使用的计算方法,但是,在 ConvNet中通常不采用,主要是因为在 ConvNet 中的卷积模板通常都比较小,例如 3×3 等,这种情况下,FFT 的时间开销反而更大,所以很少在CNN中利用FFT实现卷积。

     

      通用矩阵乘( GEMM, General Matrix Multiplication),是一个名词,是对常规矩阵乘法的一种优化

      GEMM在深度学习中是十分重要的,全连接层以及卷积层基本上都是通过GEMM来实现的,而网络中大约90%的运算都是在这两层中。而一个良好的GEMM的实现可以充分利用系统的多级存储结构程序执行的局部性来充分加速运算。

       所谓卷积的GEMM优化指的就是用im2col将卷积乘转化为矩阵乘,然后可以计算机就可以调用BLAS中的操作加速计算

你可能感兴趣的:(深度学习)