当前位置: 首页 > 科技观察

硬件不强,深度神经网络怎么玩不好?

时间:2023-03-22 01:18:17 科技观察

深度学习的力量为其实际应用创造了巨大的机会。但深度学习训练往往需要巨大的计算能力,有时我们不能(或没有钱)使用强大的服务器或像NVIDIA的Jetson这样的嵌入式加速平台。如果您需要使用RaspberryPi开发板为您的小院子开发对象跟踪器怎么办?换句话说,如果您需要在没有加速器的情况下在ARMCPU上运行CNN怎么办?德国BuddyGuardGmbH机器学习工程师DmytroPrylipko最近在LinkedIn上发表了一篇文章,分享了他在弱硬件上运行深度神经网络的经验。机器学习社区长期以来一直致力于加速神经网络推理,并且有许多可能的有效解决方案。在这篇文章中,我将尝试回答一个简单的问题:哪些软件库/工具包/框架可以帮助改善我们训练模型的推理时间?考虑到文章的篇幅,我不会考虑修改本文的网络架构(虽然这确实是一个很好的方法,比如SqeezeNet),而是探索那些已经在ARM设备上生产就绪并提供C/C++接口的(因为我们很少在嵌入式设备上使用Lua或Python)工具包和软件库。所以在这里我只是试验了Caffe、TensorFlow和MXNet。我们可以做些什么来加快你的计算速度,我们有两个主要的大方向:1)修改模型;2)加速框架。当然,也可以将两者结合起来(这是一个非常好的主意)。前一种方法通常需要使用较低的权重精度(也称为量化)和/或权重修剪。修剪背后的想法是深度学习模型中的重要参数冗余,而低精度方法(使用浮点数的定点或动态定点表示)利用了推理不需要高精度的事实:因为由于操作的线性特性和非线性动态范围压缩,量化误差倾向于以次线性方式传播而不会导致数值不稳定(Vanhoucke,V.,Senior,A.,&Mao,M.(2011)。提高神经网络的速度中央处理器)。此外,我们甚至可以使用低精度乘法来训练模型。结合SIMD指令(如SSE3),参数量化可以实现非常有效的计算加速。但目前我们很难找到同时使用两者的解决方案。例如,Ristretto可以执行自动量化,但它并没有利用它来降低计算成本。TensorFlow也可以执行量化,但它的推理时间实际上增加了5到20倍,因为它还在图中引入了辅助量化/反量化节点。因此,如果空间考虑很重要,我们实际上可以将量化视为压缩网络权重的一种方式。至少对于目前的状态,我们可以这样想。另一方面,我们也有在不影响模型参数的情况下加快框架执行时间的方法。这些方法基本上是尝试优化矩阵到矩阵乘法(GEMM)的一般计算技巧,因此会影响卷积层(其计算通常是im2col+GEMM)和全连接层。除此之外是NNPACK:深度学习框架的加速包。这个加速包也是YannLeCun推荐的!据我所知,NNPACK使用FFT将时域的卷积运算换成频域的乘法计算。另一种方法是将网络定义和权重转换为目标优化代码,而不是在同一框架中运行它们。这种方法的一个很好的例子是TensorRT。还有CaffePresso,可将Caffeprototxt转换为适用于各种不同后端的低级规范。但是,TensorRT需要CUDA才能运行,并且只能在NVIDIAGPU上使用,而CaffePresso也需要某种硬件加速器(DSP、FPGA或NoC),因此这些都不适合我的测试硬件-Raspberry组。相关链接:Ristretto:http://lepsucd.com/?page_id=621NNPACK:http://github.com/Maratyszcza/NNPACKTensorRT:http://developer.nvidia.com/tensorrtCaffePresso:http://github.com/gplhegde/caffepresso部署配置在仔细评估现有解决方案后,我发现了以下方法来加速当前可用模型的推理:如果您的架构使用OpenBLAS,您可以尝试一下。优化分支:http://github.com/xianyi/OpenBLAS/tree/optimized_for_deeplearningNNPACK可以与其他一些框架(包括Torch、Caffe和MXNet)结合使用:http://github.com/Maratyszcza/NNPACK当在tree在树莓派上使用TensorFlow时,可以使用NEON指令集提供一些优化标志:http://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/makefile#raspberry-pi通过这些,我可以列出以下调试配置:CaffewithOpenBLAS主分支(masterbranch)作为后端(caffe-openblas)CaffewithOpenBLAS深度学习优化分支(caffe-openblas-dl)使用OPTFLAGS="-Os"(tf-vanilla)使用OPTFLAGS="-Os-mfpu=neon-vfpv4-funsafe-math-optimizations-ftree-vectorize"编译的TensorFlow(tf-neon-vfpv4)使用OpenBLAS编译的TensorFlow用于线性代数(mxnet-openblas)VanillaMXNetMXNetwithOpenBLAS的深度学习优化分支(mxnet-openblas-dl)你可能会疑惑:为什么配置里没有NNPACK呢?这个确实有点复杂,ajtulloch做的Caffebranch提供了最直接的NNPACK使用方式,但是NNPACKAPI在集成后已经变了,目前无法编译)。Caffe2原生支持NNPACK,但我不会考虑Caffe2,因为它是实验性的并且几乎是Caffe的重构,并且没有太多关于它的文档。另一种选择是使用Maratyszcza/caffe-nnpack,尽管它较旧且维护较少。另一个问题是NNPACK本身。不提供Linux/ARM交叉编译配置,仅提供Android/ARM交叉编译配置。我的实验构建在结合了MXNet的目标平台上不起作用。我只能在台式机上运行它,但我没有发现OpenBLAS有任何更好的性能。由于我的目标是评估已经可用的解决方案,因此我只能在以后尝试使用NNPACK。相关链接:ajtulloch制作的Caffe分支:http://github.com/ajtulloch/caffe/tree/nnpack-prNNPACKAPI编译问题:https://github.com/Maratyszcza/NNPACK/issues/1#issuecomment-266416638Maratyszcza/caffe-nnpack:http://github.com/Maratyszcza/caffe-nnpackNNPACKLinux/ARM问题:https://github.com/Maratyszcza/NNPACK/issues/35硬件所有这些评估都在四核上执行具有1.3GHzCPU和1GBRAM的RaspberryPi3。操作系统是32位Raspbian,所以CPU不是ARMv8架构,而是ARMv7架构。modelname:ARMv7Processorrev4(v7l)BogoMIPS:38.40Features:halfthumbfastmultvfpedspneonvfpv3tlsvfpv4idivaidivtvfpd32lpaeevtstrmcrc32CPUimplementer:0x41CPUarchitecture:7CPUvariant:0x0CPUpart:0xd03CPUimplementer:4Thatis,atinyConvNetwith3convolutionallayersandtwofullyconnectedlayerswithsoftmaxontop:conv1:16@7x7relu1pool1:MAXPOOL2x2conv2:48@6x6relu2pool2:MAXPOOL3x3conv3:96@5x5relu3fc1:128unitsfc2:848unitssoftmax体积积神经网络有1039744个参数。虽然很小,但它足以处理许多计算机视觉任务。该网络使用Caffe进行人脸识别任务训练,并转换为TensorFlow和MXNet格式,以便使用这些框架进行评估。为了评估正向通过时间,测试了从1到256的批量大小,因为批量大小对性能有很大影响。而对于每个批量大小,网络执行100次正向传递并计算每个图像的平均时间。评估结果和讨论在下表中,列出了平均正向通过时间。其中A为caffe-openblas,B为caffe-openblas-dl,C为tf-vanilla,D为tf-neon-vfpv4,E为mxnet-openblas,F为mxnet-openblas-dl。让我们在对数尺度上看一下:这些结果让我大吃一惊。首先,我没想到在CPU上运行MXNet会出现如此糟糕的性能。但这看起来已经是一个众所周知的问题。此外,由于存储限制,它无法批量运行256张图像。第二个惊喜是经过优化的TensorFlow的表现如何。它甚至优于Caffe(批量大小大于2);仅从原始框架很难预测这个结果。但要小心:不能保证您可以在任何ARM设备上使用这些标志。Caffe是出了名的快。如果你想对图像进行一张一张的处理,带有优化的OpenBLAS的Caffe将是你最好的选择。要获得10ms的改进,您只需键入:cdOpenBLASgitcheckoutoptimized_for_deeplearning要将我的小研究变成严肃的事情,我还需要做很多工作:评估更多模型,集成NNPACK,研究更多与多个框架的结合BLAS后端。但我希望它能帮助您了解当前最先进解决方案的推理速度。原文:https://www.linkedin.com/pulse/how-run-deep-neural-networks-weak-hardware-dmytro-prylipkoTheHeartoftheMachine(id:almosthuman2014)》]点此查看更多精彩该作者的文章