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

如何使用CNN推理引擎在物联网设备上实现深度学习?

时间:2023-03-16 21:26:30 科技观察

通过深度学习技术,物联网(IoT)设备可以解析非结构化多媒体数据并智能响应用户和环境事件,但伴随而来的是苛刻的性能和功耗要求。作者探索了两种成功集成深度学习和低功耗物联网设备的方法。近年来,市场上出现了越来越多的物联网产品,它们收集周围环境的数据并使用传统的机器学习技术来理解这些数据。一个例子是谷歌的Nest恒温器,它以结构化的方式记录温度数据,并使用算法来了解用户的温度偏好和时间表。然而,它对非结构化多媒体数据无能为力,例如音频信号和视觉图像。新兴的物联网设备使用更复杂的深度学习技术通过神经网络探索其环境。例如,AmazonEcho可以理解人类的语音命令,通过语音识别,将音频信号转换成一串单词,然后利用这些单词搜索相关信息。近日,微软的WindowsIoT团队发布了一款基于面部识别的安全系统,该系统使用深度学习技术在识别到用户面部时自动解锁门。物联网设备上的深度学习应用程序通常具有苛刻的实时要求。例如,基于物体识别的安防摄像头通常需要小于500毫秒的检测延迟来捕获和处理目标事件,以便能够及时响应家中出现的陌生人。消费级物联网设备通常使用云服务来提供某种智能。然而,他们所依赖的高质量互联网连接仅在某些地区可用,而且往往需要高昂的成本。这引发了有关设备是否可以满足实时要求的问题。挑战。相比之下,直接在物联网设备上实现深度学习可能是更好的选择,这样它就不会受到连接质量的影响。然而,直接在嵌入式设备上实现深度学习是困难的。事实上,低功耗是移动物联网设备的主要特征,而这通常意味着有限的计算能力和较小的内存容量。在软件方面,为了减少内存占用,应用程序通常直接运行在裸机上,或者运行在包含很少第三方库的轻量级操作系统上。相比之下,深度学习意味着高性能计算,伴随着高功耗。此外,现有的深度学习库通常需要调用很多第三方库,难以移植到物联网设备上。在深度学习任务中,使用最广泛的神经网络是卷积神经网络(CNN),它能够将非结构化图像数据转换为结构化对象标签数据。一般来说,CNNs的工作流程如下:首先,卷积层扫描输入图像,生成特征向量;其次,激活层确定在图像推理过程中应激活哪些特征向量;第三,使用池化层减少了特征向量的大小;***,使用全连接层将池化层的所有输出连接到输出层。在本文中,我们讨论了如何使用CNN推理引擎在IoT设备上实施深度学习。将服务迁移到云端对于低功耗物联网设备,问题是是否有可靠的解决方案在云端部署深度学习,同时满足功耗和性能要求。为了回答这个问题,我们在NvidiaJetsonTX1设备上实现了基于CNN的对象推理,并将其性能、功耗与将这些服务迁移到云端后的性能、功耗进行了比较。为了确定将服务迁移到云端是否可以降低功耗并满足目标识别任务的实时性要求,我们将图像发送到云端并等待云端返回结果。研究表明,对于物体识别任务,本地执行的功耗为7W,迁移到云端后功耗降至2W。由此可见,业务上云确实是降低功耗的有效途径。但是迁移到云端会造成至少2秒的延迟,甚至可能高达5秒,无法满足我们500ms的实时性要求。此外,延迟的大抖动使服务非常不可靠(为了比较,我们在美国进行了这些实验,并在中国进行了观察)。通过这些实验,我们得出结论,在当前的网络环境下,将实时深度学习任务迁移到云端是一种不可行的解决方案。与迁移到云端相比,将深度学习平台移植到嵌入式设备是不切实际的。一种选择是将现有的深度学习平台移植到物联网设备上。为此,我们选择移植谷歌开发并开源的深度学习平台TesnsorFlow,构建具有对象推理能力的物联网设备Zuluko——PerceptIn的裸机ARM片上系统。Zuluko由四个运行频率为1GHz的ARMv7内核和512MBRAM组成,峰值功耗约为3W。根据我们的研究,TensorFlow可以在基于ARM-Linux的片上系统上提供最佳性能,这就是我们选择它的原因。我们希望能够在几天内完成移植,但是移植TensorFlow并不容易,并且依赖于许多第三方库(见图1)。为了减少资源消耗,大多数物联网设备都在裸机上运行,??因此移植所有依赖项可能是一项艰巨的任务。我们花了一周的时间才让TensorFlow在Zuluko上运行。这段经历也让我们重新思考是否值得从头开始构建一个新平台,而不是移植一个现有的平台。然而,由于缺乏卷积运算符等基本构建块,从头开始构建并不容易。此外,从头开始构建的推理引擎很难胜过经过充分测试的深度学习框架。图1TensorFlow对第三方库的依赖。由于对许多第三方库的依赖,将现有的深度学习平台(如TensorFlow)移植到物联网设备并不是一个容易的过程。从头开始构建推理引擎ARM最近发布了其ComputeLibrary(ACL,developer.arm.com/technologies/compute-library),全面集成了ARMCortex-A系列CPU处理器和ARMMali系列GPU的软件功能。具体来说,ACL为CNN提供基本构建块,包括激活、卷积、完全和局部连接、归一化、池化和softmax函数。这些函数正是我们构建推理引擎所需要的。我们使用ACL构建块构建了一个带有SqueezeNet架构的CNN推理引擎,该构建块具有适用于嵌入式设备的小内存占用空间。SqueezeNet使用1×1卷积核来减少3×3卷积层的输入大小,同时保持相似的推理精度。然后,我们将SqueezeNet推理引擎的性能与Zuluko上的TensorFlow进行比较。为了确保公平比较,我们在TensorFlow中启用了ARMNEON矢量计算优化,并在创建SqueezeNet引擎时使用了支持NEON的构建块。确保两个引擎都使用NEON矢量计算,这样任何性能差异都将仅由平台本身引起。如图2所示,平均而言,TensorFlow需要420毫秒来处理227×227像素的RGB图像,而SqueezeNet将处理相同图像的时间缩短到320毫秒,这是25%的加速。图2在TensorFlow上运行的SqueezeNet推理引擎与使用ARMComputeLibrary(ACL)构建的SqueezeNet推理引擎的性能对比。从头开始构建一个简单的推理引擎不仅需要更少的开发时间,而且性能优于现有的深度学习引擎,如TensorFlow。为了更好地理解性能增益从何而来,我们将执行分为两部分:第一部分包括卷积、ReLU(整流线性函数)激活和连接;第二部分包括池化和softmax函数。图2所示的分析表明,SqueezeNet在第一部分中优于TensorFlow23%,在第二部分中优于TensorFlow110%。考虑资源利用率,在TensorFlow上运行时,平均CPU使用率为75%,平均内存使用率为9MB;在SqueezeNet上运行时,平均CPU使用率为90%,平均内存使用量约为10MB。性能提升的原因有两个:首先,SqueezeNet提供了更好的NEON优化,所有ACL算子都是直接使用NEON提供的算子开发的,而TensorFlow依赖于ARM编译器提供NEON优化。其次,TensorFlow平台本身可能会造成一些额外的性能开销。接下来,我们希望从TensorFlow中榨取更多的性能,看看它是否能胜过我们构建的SqueezeNet推理引擎。一种常见的技术是使用矢量量化,使用8位权重来牺牲性能的精度。8位权重的使用使我们能够通过向量运算仅用一条指令计算多个数据单元。然而,这种优化是有代价的:它引入了重新量化和反量化操作。我们在TensorFlow中实现了这种优化,图3比较了优化和未优化的性能。使用矢量量化可将卷积性能提高25%,但由于反量化和重新量化操作也会显着增加开销。总体而言,它使整个推理过程减慢了100多毫秒。图3使用和不使用矢量量化的TensorFlow性能。手动优化现有的深度学习平台(例如TensorFlow)很困难,而且可能不会带来显着的性能提升。网络连接是不稳定的,因此我们希望确保我们可以在本地设备上实现某种形式的智能,以便它可以在ISP或网络出现故障时继续运行。然而,要实现它,需要很高的计算性能和功耗。将服务迁移到云端虽然可以降低物联网设备的功耗,但很难满足实时性要求。此外,现有的深度学习平台都是为通用任务设计和开发的,同时适用于训练和推理任务,这意味着这些引擎并未针对嵌入式推理任务进行优化。而且它们还依赖于裸机嵌入式系统上不容易获得的其他第三方库,这使得移植非常困难。通过使用ACL构建块构建嵌入式CNN推理引擎,我们可以充分利用SoC的异构计算资源来实现高性能。所以问题就变成了选择移植现有引擎还是从头开始构建它们更容易。我们的经验表明,如果模型很简单,则从头开始构建模型会容易得多。随着模型越来越复杂,在某些情况下,我们迁移现有的引擎可能会相对更高效。然而,考虑到嵌入式设备实际执行的任务,不太可能需要复杂的模型。因此,我们得出结论,从头开始构建嵌入式推理引擎可能是为物联网设备提供深度学习功能的可行方法。更进一步我们需要一种更方便的方式来在物联网设备上提供深度学习功能,而不是从头开始手动构建模型。一种解决方案是实现一个深度学习模型编译器,它可以优化给定的模型并将其编译成目标平台上的可执行代码。如图4中图所示,该编译器前端可以解析主流深度学习平台(包括MXNet、Caffe、TensorFlow等)的模型。然后,优化器可以执行其他优化,包括模型修剪、量化和异构执行。优化后,代码生成器在目标平台上生成可执行代码,可以是ACL(用于ARM设备)、TensorRT(用于NvidiaGPU)或其他ASIC设备。图4物联网设备服务架构。我们需要一个新的系统架构来实现物联网设备上的深度学习:首先,我们需要直接编译和优化深度学习模型,生成目标设备上的可执行代码;其次,我们需要一个非常轻量级的操作系统,来实现多任务处理和它们之间的高效通信。IMU:惯性测量单元。NNVM项目(github.com/dmlc/nnvm)是实现这一目标的第一步。我们已经成功地扩展了NNVM来生成代码,这样我们就可以使用ACL来加速ARM设备上的深度学习操作。这种方法的另一个好处是,即使模型变得更加复杂,我们仍然可以轻松地在物联网设备上实现它们。由于计算资源的限制,当前的物联网设备通常执行单一任务。然而,我们预计很快就会有能够执行多项任务的低功耗物联网设备(例如,我们的Zuluko设备包含四个内核)。为了使用这些设备,我们需要一个非常轻量级的消息协议来连接不同的服务。如图4所示,物联网设备的基础服务包括感知、感知和决策。传感节点涉及处理来自例如相机、惯性测量单元和车轮里程计的原始传感器数据。感知节点使用处理过的传感器数据并解释捕获的信息,例如对象标签和设备位置。动作节点包含一组规则,用于确定在检测到特定事件时如何响应,例如在检测到主人的脸时打开门锁,或在检测到障碍物时调整机器人的运动路径。Nanomsg(nanomsg.org)是一个非常轻量级的消息传递框架,非常适合类似的任务。另一个选择是RobotOS,尽管我们发现它在内存占用和物联网设备的计算资源要求方面过于繁重。为了有效地将深度学习与物联网设备集成,我们开发了自己的操作系统,包括用于消费级传感器输入的传感器接口,基于NNVM的编译器,将现有的深度学习模型编译和优化为可执行代码,以及基于Nanomsg的连接所有节点的消息传输框架。作者希望本文能激发研究人员和开发人员在更小的嵌入式设备中设计更智能的物联网系统。