一、编写目的
该文档用作提供使用ARM-NENO技术在卷积神经网络上应用。
二、ARM-NEON与卷积神经网络
2.1 卷积神经网络
参考相关网站: http://cs231n.github.io/convolutional-networks/
卷积神经网络的计算主要包括大量的卷积核的乘法运算。为了加速乘法运算,可以使用ARM-NEON技术,比如ncnn就依据此类技术实现,除了ncnn外,ARM还提供了官方的基于NEON技术的计算库ARM Compute Library以及专为深度学习设计的ARM NN。根据实现方式分为以下两种:
- ncnn:针对不同平台实现高效的几种卷积核(1x1/3x3/5x5/7x7)运算,以点乘为主(特别地,1x1的可以看做是gemm)。优点在于效率高,缺点在于通用性不强,专门面向深度学习。
- GEMM(General Matrix Multiplication):实现通用的矩阵乘法运算,可参考类似openblas的实现过程。优点在于通用性好,缺点在于将卷积运算转换成矩阵乘法运算耗内存资源。
2.2 矩阵乘法计算
矩阵乘法通用易理解的表达如上图1所示,其中矩阵乘法在目前的基于CPU的架构中无法达到实时性的主要原因有:
- 软件编写无法发挥硬件的计算能力
- 硬件本身计算能力存在瓶颈
- 算法对乘法计算要求较大
针对上述3个原因,可以思考的方法有三点:
- 修改软件编程模型,使用汇编或者硬件原生支持的加速方法,比如ARM NEON提供的指令以及库
- 更换硬件平台,提升硬件平台能力,比如FPGA、GPU等
- 对计算进行优化,减少计算量(主要是减少乘法数量),比如Winograd变换(增加计算的复杂度),如图2所示
在不更换硬件平台的情况下,可以使用ARM NEON技术更好地发挥硬件性能。基于ARM NEON技术的矩阵乘法加速可以理解为利用矩阵乘法并行性,如图3所示。
2.3 卷积神经网络转换矩阵乘法
如果为了使用GEMM方法进行卷积神经网络加速,需要将卷积神经网络中的卷积层计算转换成矩阵乘法,然后利用GEMM进行加速,卷换过程如图4所示。
三、总结
通过ARM NEON技术进行卷积神经网络加速,可以采用的路径有:
1.参考2.3将卷积神经网络转换成矩阵乘法,然后参考openblas的实现过程,使用ARM提供的ACL库(ARM Compute Library)或者ARM NN实现。
2.如果是ncnn支持的网络模型,可以使用ncnn进行加速。如果不支持的网络模型,可以参考ncnn对于相关卷积计算的实现做个性化的应用开发。