通过深度学习技术,物联网(IoT)设备能够得以解析非结构化的多媒体数据,智能地响应用户和环境事件,但是却伴随着苛刻的性能和功耗要求。本文作者探讨了两种方式以便将深度学习和低功耗的物联网设备成功整合。
近年来,越来越多的物联网产品出现在市场上,它们采集周围的环境数据,并使用传统的机器学习技术理解这些数据。一个例子是Google的Nest恒温器,采用结构化的方式记录温度数据,并通过算法来掌握用户的温度偏好和时间表。然而,其对于非结构化的多媒体数据,例如音频信号和视觉图像则显得无能为力。
新兴的物联网设备采用了更加复杂的深度学习技术,通过神经网络来探索其所处环境。例如,Amazon Echo可以理解人的语音指令,通过语音识别,将音频信号转换成单词串,然后使用这些单词来搜索相关信息。最近,微软的Windows物联网团队发布了一个基于面部识别的安全系统,利用到了深度学习技术,当识别到用户面部时能够自动解开门锁。
物联网设备上的深度学习应用通常具有苛刻的实时性要求。例如,基于物体识别的安全摄像机为了能及时响应房屋内出现的陌生人,通常需要小于500毫秒的检测延迟来捕获和处理目标事件。消费级的物联网设备通常采用云服务来提供某种智能,然而其所依赖的优质互联网连接,仅仅在部分范围内可用,并且往往需要较高的成本,这对设备能否满足实时性要求提出了挑战。与之相比,直接在物联网设备上实现深度学习或许是一个更好的选择,这样就可以免受连接质量的影响。
然而,直接在嵌入式设备上实现深度学习是困难的。事实上,低功耗是移动物联网设备的主要特征,而这通常意味着计算能力受限,内存容量较小。在软件方面,为了减少内存占用,应用程序通常直接运行在裸机上,或者在包含极少量第三方库的轻量级操作系统上。而与之相反,深度学习意味着高性能计算,并伴随着高功耗。此外,现有的深度学习库通常需要调用许多第三方库,而这些库很难迁移到物联网设备。
在深度学习任务中,最广泛使用的神经网络是卷积神经网络(CNNs),它能够将非结构化的图像数据转换成结构化的对象标签数据。一般来说,CNNs的工作流程如下:首先,卷积层扫描输入图像以生成特征向量;第二步,激活层确定在图像推理过程中哪些特征向量应该被激活使用;第三步,使用池化层降低特征向量的大小;最后,使用全连接层将池化层的所有输出和输出层相连。
在本文中,我们将讨论如何使用CNN推理机在物联网设备上实现深度学习。
将服务迁移到云端
对于低功耗的物联网设备,问题在于是否存在一个可靠的解决方案,能够将深度学习部署在云端,同时满足功耗和性能的要求。为了回答这个问题,我们在一块Nvidia Jetson TX1设备上实现了基于CNN的物体推理,并将其性能、功耗与将这些服务迁移到云端后的情况进行对比。
为了确定将服务迁移到云端后,是否可以降低功耗并满足对物体识别任务的实时性要求,我们将图像发送到云端,然后等待云端将结果返回。研究表明,对于物体识别任务,本地执行的功耗为7 W,而迁移到云端后功耗降低为2W。这说明将服务迁移到云端确实是降低功耗的有效途径。
然而,迁移到云端会导致至少2秒的延迟,甚至可能高达5秒,这不能满足我们500ms的实时性要求。此外,延迟的剧烈抖动使得服务非常不可靠(作为对比,我们在美国和中国分别运行这些实验进行观察)。通过这些实验我们得出结论,在当前的网络环境下,将实时性深度学习任务迁移到云端是一个尚未可行的解决方案。
移植深度学习平台到嵌入式设备
相比迁移到云端的不切实际,一个选择是将现有的深度学习平台移植到物联网设备。为此,我们选择移植由Google开发并开源的深度学习平台TesnsorFlow来建立具有物体推理能力的物联网设备Zuluko——PerceptIn的裸机ARM片上系统。Zuluko由四个运行在1 GHz的ARM v7内核和512 MB RAM组成,峰值功耗约为3W。根据我们的研究,在基于ARM-Linux的片上系统上,TensorFlow能够提供最佳性能,这也是我们选择它的原因。
我们预计能够在几天内完成移植工作,然而,移植TensorFlow并不容易,它依赖于许多第三方库(见图1)。为了减少资源消耗,大多数物联网设备都运行在裸机上,因此移植所有依赖项可以说是一项艰巨的任务。我们花了一个星期的精力才使得TensorFlow得以在Zuluko上运行。此次经验也使我们重新思考,相比移植一个现有的平台,是否从头开始构建一个新平台更值得。然而缺乏诸如卷积算子等基本的构建块,从头开始构建并不容易。此外,从头开始构建的推理机也很难比一个久经测试的深度学习框架表现更优。