如果对深度学习有所了解的小伙伴们想必都知道,深度学习需要使用强大的服务器、加速嵌入式平台(如NVIDIA的Jetson)来运行深度学习算法,然而这也同样意味着不菲的开支。
那么问题来了,如果你想你想用树莓派来做一个目标跟踪器,为你看家守院,这可以实现吗?换句话说,如果你需要在不带加速器的ARMCPU上运行卷积神经网络了怎么办?
雷锋网想,大概就会像下图这位小哥一样,处境尴尬。
来自德国初创企业BuddyGuardGmbH的机器学习工程师DmytroPrylipko就为我们提供了一个可行的“杀牛不用鸡刀”的解决方案,雷锋网编译,未经许可不得转载。
加速神经网络模型在硬件平台计算速度,两个主要有大的策略:
1)修改神经网络的模型;
2)加快框架运行速度。
当然,将这两个策略结合起来使用,也是一种不错的思路。
加快框架执行速度另一种方法是将网络模型和权重配置转换成针对目标平台代码,并对代码进行优化,而不是让它们直接在某一个框架内运行。这种方法的典型案例是TensorRT。还有CaffePresso,可以将Caffe中prototxt类型的文件定制成适用于各种不同硬件平台的低规格版本。然而,TensorRT的运行需要CUDA,而且只能在NVIDIA的GPU中才能使用,而CaffePresso也需要某种硬件加速器(DSP、FPGA或NoC),所以这两种方法都不适合用于我的测试硬件——树莓派。
上述内容仔细地评估现有的解决办法后,我发现以下几种方法能够加速当前流行的可用模型的推理:
基于以上3种方法,我概括出以下调测配置:
1.使用以OpenBLAS为后端的Caffe主分支(caffe-openblas);
2.使用以OpenBLAS为后端OpenBLAS且为深度学习优化过的Caffe分支版本(caffe-openblas-dl);
3.编译TensorFlow时,使用优化编译标志OPTFLAGS="-Os"(tf-vanilla)
4.编译TensorFlow时,使用优化编译标志OPTFLAGS="-Os-mfpu=neon-vfpv4-funsafe-math-optimizations-ftree-vectorize"(tf-neon-vfpv4)
5.使用以OpenBLAS实现基础线性代数程序集的VanillaMXNet
6.使用带有OpenBLAS、且为深度学习优化过MXNet分支版本(mxnet-openblas-dl)。
你可能会疑惑:配置中怎么没有NNPACK?这确实有点复杂,由ajtulloch创建的Caffe分支提供了最直接的使用NNPACK方法。然而自从它被集成进去以后,NNPACK的API接口就已经改变了,并且目前我无法编译它。Caffe2对NNPACK有原生支持,但我不会考虑Caffe2,因为它处于实验性阶段并且几乎对Caffe进行了尚未文档化的重构。另外一个选项就是使用Maratyszcza的caffe-nnpack分支,但该分支比较老旧且已经停止维护。
另外一个问题就是出于NNPACK本身。它只提供了Android/ARM平台的交叉编译配置,并不提供在Linux/ARM平台上的交叉编译配置。结合MXNet,我尝试编译目标平台代码,但结果无法在目标平台上正常运行。我只能在台式电脑上运行它,但是我并没有看到比OpenBLAS会有更好的性能。由于我的目标是评估已经可用的解决方法,所以我只能推迟NNPACK的实验了。
以上所有的这些方法都是在四核1.3GHzCPU和1GBRAM的树莓派3上执行。操作系统是32位的Raspbian,所以检测到的CPU不是ARMv8架构,而是ARMv7架构。硬件规格如下:
modelname:ARMv7Processorrev4(v7l)
BogoMIPS:38.40
Features:halfthumbfastmultvfpedspneonvfpv3tlsvfpv4idivaidivtvfpd32lpaeevtstrmcrc32
CPUimplementer:0x41
CPUarchitecture:7
CPUvariant:0x0
CPUpart:0xd03
CPUrevision:4
为了评估上述每个测试配置的性能,我制定的测试方案如下:使用相同的神经网络。也就是一个有3个卷积层和2个全连接层且在顶层带有Softmax的小型卷积神经网络:
conv1:16@7x7
relu1pool1:MAXPOOL2x2conv2:48@6x6
relu2pool2:MAXPOOL3x3conv3:96@5x5
relu3fc1:128unitsfc2:848units
softmax
表1不同测试配置在不同的批处理次数下的性能表现
在对数尺度尺度上我们再来看一下:
测试结果让我大吃一惊。首先,我没有预料到在CPU上运行MXNet的性能会这么差。但这看起来已经是一个众所周知的问题。此外,受限于存储空间,它无法运行256张图片的批处理。第二个惊奇是优化过的TensorFlow竟有如此好的性能。它甚至比Caffe的表现还好(批处理次数超过2时),光从原始框架上看是很难预料这个结果的。需要注意的是,上述测试配置中的优化标志并不是在任意ARM芯片上都可以使用的。
Caffe因速度非常快和思路独到而知名。如果你需要连续地处理图片,可以选择使用优化过的OpenBLAS的Caffe,可得到最好的处理性能。如果想提升10ms的性能,你所要做的就只是简单的输入以下指令:
cdOpenBLAS
gitcheckoutoptimized_for_deeplearning
为了将我的研究转变成正式的东西,我仍需要做大量的工作:评估更多的模型,最终集成NNPACK,以及研究更多结合了BLAS后端的框架。雷锋网希望本文能帮助你了解目前最流行的解决方案的推理速度。