边缘端的微型机器学习是未来发展中一个重要的方向,看到一篇相关的文章,想趁着晚上闲下来的时候整体读一下,本文是自己对原文的阅读记录,感兴趣的话可以参考一下,如果想要进一步了解研究工作内容详情的话,建议直接移步阅读原论文,地址在这里,如下所示:
摘要
微型机器学习(TinyML)是机器学习的一个新前沿。通过将深度学习模型压缩到数十亿物联网设备和微控制器(MCU)中,我们扩展了人工智能应用的范围,并实现了无处不在的智能。然而,TinyML由于硬件限制而具有挑战性:微小的内存资源使得难以容纳为云和移动平台设计的深度学习模型。此外,裸机设备的支持编译器和推理引擎有限。因此,我们需要共同设计算法和系统堆栈以实现TinyML。在这篇综述中,我们将首先讨论TinyML的定义、挑战和应用。然后,我们将调查TinyML和MCU上深度学习的最新进展。接下来,我们将介绍MCUNet,展示我们如何通过系统-算法共同设计在物联网设备上实现ImageNet规模的AI应用。我们还将从推理扩展到训练,并介绍微型设备上的训练技术。最后,我们将介绍该领域的未来方向。今天的"大型"模型可能是明天的"微型"模型。TinyML的范围应随时间演变和适应。
关键词:TinyML,高效深度学习,设备上训练,边缘学习
I. TinyML概述
机器学习(ML)在视觉、语言和音频等领域产生了重大影响。然而,最先进的模型往往以高计算和内存为代价,使得部署成本高昂。为了解决这个问题,研究人员一直在努力开发高效的算法、系统和硬件,以在各种部署场景中降低机器学习模型的成本。高效ML有两个主要子领域:边缘ML和云ML(图1)。云ML专注于提高云服务器上的延迟和吞吐量,而边缘ML则专注于提高边缘设备上的能效、延迟和隐私。这两个领域在混合推理[1, 2]、空中(OTA)更新以及边缘和云之间的联邦学习[3]等领域也有交叉。近年来,边缘ML的范围已扩展到超低功耗设备,如物联网设备和微控制器,被称为TinyML。
图1. 效率对于CloudML、EdgeML和TinyML至关重要。CloudML针对高性能加速器,如GPU,而EdgeML专注于便携式设备,如移动电话。TinyML进一步推动了效率边界,使强大的ML模型能够在超低功耗设备上运行,如微控制器。
TinyML有几个关键优势。它仅使用几百千字节的内存即可实现机器学习,从而大大降低了成本。随着数十亿物联网设备在我们日常生活中产生越来越多的数据,对低功耗、始终在线的设备上AI的需求不断增长。通过在传感器附近进行设备上推理,TinyML可以提高响应速度和隐私性,同时减少无线通信的能耗。设备上的数据处理对于需要实时决策的应用(如自动驾驶车辆)非常有益。
除了推理,我们将TinyML的前沿推向了在物联网设备上进行设备上训练。它通过持续和终身学习革新了边缘AI。边缘设备可以在自身上微调模型,而不是将数据传输到云服务器,从而保护隐私。设备上学习有许多好处和各种应用。例如,家用摄像头可以持续识别新面孔,电子邮件客户端可以通过更新定制的语言模型逐渐提高其预测能力。它还使没有物理互联网连接的物联网应用能够适应环境,如精准农业和海洋传感。
表I. 左侧:与移动电话相比,微控制器的内存和存储少3个数量级,比云GPU少5-6个数量级。极其有限的内存使得深度学习部署变得困难。右侧:广泛使用的深度学习模型的峰值内存和存储使用情况。ResNet-50超过微控制器的资源限制100倍,MobileNet-V2超过20倍。即使是int8量化的MobileNetV2也需要5.3倍更大的内存,无法适应微控制器。
图2. 我们不能直接为TinyML扩展移动ML或云ML模型。实验使用了宽度为1.4的MobilenetV2 [4]。推理的批量大小设置为1,训练的批量大小设置为8。虽然MobilenetV2的参数数量比ResNet减少了4.2倍,但推理的峰值内存使用量增加了2.3倍,训练的峰值内存使用量仅改善了1.1倍。此外,总训练所需的内存比推理所需的内存大6.9倍。这些结果表明TinyML存在显著的内存瓶颈,瓶颈在于激活内存,而不是参数数量。
在这篇综述中,我们将首先讨论TinyML的定义和挑战,分析为什么我们不能直接为TinyML扩展移动ML或云ML模型。然后,我们将深入探讨TinyML中系统-算法共同设计的重要性。接下来,我们将调查该领域的最新文献和进展,并在表II和表III中提供全面的调查和比较。然后,我们将介绍我们的TinyML项目MCUNet,该项目结合了高效的系统和算法设计,以实现从推理到训练的TinyML。最后,我们将讨论该领域的几个新兴研究方向。
TinyML的挑战
深度学习模型的成功往往以高计算为代价,这在TinyML应用中由于设备的严格资源限制而不可行。在MCU上部署和训练AI模型非常困难:没有动态随机存取存储器(DRAM),没有操作系统(OS),并且内存限制严格(SRAM小于256kB,FLASH是只读的)。这些设备上的可用资源比移动平台上的资源小几个数量级(见表I)。该领域以前的工作要么(I)专注于减少模型参数而没有解决激活的真正瓶颈,要么(II)仅优化操作符内核而没有考虑改进网络架构设计。这两种方法都没有从共同设计的角度考虑问题,这导致了TinyML应用的次优解决方案。我们观察到TinyML的几个独特挑战,并推测如何克服这些挑战:
1、为移动平台设计的模型不适用于TinyML
已经有很多努力优化深度学习模型以适应移动平台,如MobileNets[5, 4]和ShuffleNet[6]。然而,由于移动设备有足够的内存资源(表I),模型设计主要集中在参数/FLOPs/延迟的减少上,而不是峰值内存使用。如图2左图和中图所示,比较两个具有相同ImageNet精度的模型,MobileNetV2-1.4的模型大小比ResNet-50小4.2倍,但其峰值内存甚至大2.3倍。使用MobileNet设计并不能充分解决SRAM限制,实际上比ResNet更糟糕。因此,我们需要重新思考TinyML的模型设计原则。
2、直接适应推理模型不适用于微型训练
训练在资源约束方面提出了更大的挑战,因为中间激活必须存储以计算反向梯度。当从推理转向全反向传播训练时,所需的内存增加了6.9倍。如图2所示,MobileNets的训练内存需求并不比ResNets好多少(仅改善了10%)。Tiny IoT设备(如微控制器)通常具有有限的SRAM大小,如256KB,这对于深度学习模型的推理来说几乎不够,更不用说训练了。云和移动AI中的先前工作主要集中在减少FLOPs[5, 4, 7]或仅优化推理内存[8, 9]。然而,即使使用内存高效的推理模型(如MCUNet[8])来弥合三个数量级的差距,训练对于微型平台来说仍然过于昂贵。如果我们遵循传统的全模型更新方案,模型必须大幅缩小以适应严格的内存限制,导致精度降低。这突显了需要重新设计反向传播方案并研究新的学习算法,以减少主要的激活内存瓶颈,并在微型设备上实现快速准确的训练。在第IV节中,我们将详细讨论这个问题,并介绍稀疏层和稀疏张量更新的概念。
3、共同设计对于TinyML是必要的
共同设计对于TinyML是必要的,因为它允许我们为微型设备的独特约束定制优化的解决方案。以前的神经架构,如MobileNets[5, 4]和ResNets[10],是为移动/云场景设计的,但不适用于微型硬件。因此,我们需要设计适用于TinyML应用的神经架构。另一方面,现有的深度训练框架是为云服务器优化的,缺乏对内存高效的前向和反向传播的支持,因此无法适应微型设备。微型物联网设备和当前框架的需求之间存在巨大的差距(>1000倍),禁止了使用。为了解决这些挑战,有必要开发专门针对这些微型平台设置的算法、系统和训练技术。
TinyML的应用
通过将昂贵的深度学习模型民主化到物联网设备上,TinyML有许多实际应用。一些示例应用包括:
-
个性化医疗:TinyML可以使可穿戴设备(如智能手表)持续跟踪用户的活动和血氧饱和度状态,以提供健康建议[11, 12, 13, 14]。身体姿态估计对于老年人健康护理也是一个关键应用[15]。
-
可穿戴应用:TinyML可以帮助人们使用可穿戴或物联网设备进行语音应用,如关键词检测、自动语音识别和说话人验证[16, 17, 18]。
-
智能家居:TinyML可以在物联网设备上实现对象检测、图像识别和人脸检测,以构建智能环境,如智能家居和医院[19, 20, 21, 22, 23]。
-
人机接口:TinyML可以实现人机接口应用,如手势识别[24, 25, 26, 27]。TinyML还能够预测和识别手语[28]。
-
智能车辆和交通:TinyML可以在没有云连接的情况下执行对象检测、车道检测和决策,为自动驾驶场景实现高精度和低延迟的结果[29, 30, 31]。
-
异常检测:TinyML可以使机器人和传感器具备执行异常检测的能力,减少人力[32, 33, 34]。
-
生态和农业:TinyML还可以帮助生态、农业、环境和表型学应用,以保护濒危物种或预测天气活动[35, 36, 37, 38, 39, 40]。
总的来说,TinyML的潜在应用是多样且众多的,并将随着该领域的不断发展而扩展。
II. TinyML的最新进展
TinyML推理的最新进展
近年来,TinyML和MCU上的深度学习在工业界和学术界都取得了快速增长。在MCU上部署深度学习模型进行推理的主要挑战是这些设备上的有限内存和计算资源。例如,流行的ARM Cortex-M7 MCU,STM32F746,只有320KB的SRAM和1MB的闪存。在深度学习场景中,SRAM限制了激活的大小(读写),而闪存限制了模型的大小(只读)。此外,STM32F746的处理器时钟速度为216 MHz,比笔记本电脑低10到20倍。为了在MCU上实现深度学习推理,研究人员提出了各种设计和解决方案来解决这些问题。表II总结了近年来针对MCU的TinyML相关研究,包括算法解决方案和系统解决方案。在表III中,我们在相同的MCU(STM32H743)和相同的数据集(VWW和ImageNet)上测量了四个代表性相关研究的三个不同指标(即延迟、峰值内存和闪存使用),以提供更准确和透明的比较。
算法解决方案
神经网络的效率对深度学习系统的整体性能至关重要。通过剪枝[57, 58, 59, 60, 61, 62]和量化[63, 64, 65, 66, 67, 68, 69, 70]去除现成网络中的冗余和减少复杂性,是提高网络效率的两种流行方法。张量分解[71, 72, 73]也是一种有效的压缩技术。为了增强网络效率,知识蒸馏也是一种将一个教师模型学习到的信息转移到另一个学生模型的方法[74, 75, 76, 77, 78, 79, 80, 81]。另一种方法是直接设计微小且高效的网络结构[5, 4, 6, 7]。最近,神经架构搜索(NAS)主导了高效网络的设计[82, 83, 84, 85, 86, 87]。
为了使深度学习在MCU上可行,研究人员提出了各种算法解决方案。Rusci等人提出了一种基于规则的量化策略,以最小化激活和权重的比特精度,从而减少内存使用[45]。根据各种设备的内存约束,该方法可以将激活和权重量化为8位、4位或2位的混合精度。另一方面,尽管神经架构搜索(NAS)在寻找高效网络架构方面取得了成功,但其有效性高度依赖于搜索空间的质量[88]。对于内存有限的MCU,标准模型设计和适当的搜索空间尤其缺乏。为了解决这个问题,MCUNet的一部分TinyNAS采用了一种两步NAS策略,根据可用资源优化搜索空间[8]。TinyNAS然后在优化的搜索空间内专门化网络架构,使其能够自动处理各种约束(如设备、延迟、能量、内存),并以低搜索成本进行处理。MicroNets观察到,MCU的NAS搜索空间中网络的推理延迟与模型中的FLOPs数量线性变化[48]。因此,它提出了差异化NAS,将FLOPs作为延迟的代理,以实现低内存消耗和高速度。MCUNetV2发现,大多数卷积神经网络设计的内存分布不平衡是主要的内存瓶颈,其中前几个块的内存使用量比网络其余部分大一个数量级[9]。因此,该研究提出了感受野重分配,将感受野和FLOPs转移到后期阶段,减少重叠补丁的计算开销。为了最小化手动重分配感受野的难度,该研究还自动化了神经架构搜索过程,以同时优化神经架构和推理调度。UDC探索了更广泛的设计搜索空间,以生成高精度的可压缩神经网络,用于神经处理单元(NPU),通过广泛的权重量化和稀疏性来解决内存问题[51]。
系统解决方案
近年来,流行的训练框架如PyTorch[89]、TensorFlow[90]、MXNet[91]和JAX[92]为深度学习的成功做出了贡献。然而,这些框架通常依赖于主机语言(如Python)和各种运行时系统,这增加了显著的开销,并使其与微型边缘设备不兼容。新兴框架如TVM[93]、TF-Lite[94]、MNN[95]、NCNN[96]、TensorRT[97]和OpenVino[98]为移动设备提供了轻量级运行时系统,但它们对于MCU来说还不够小。
表II. 针对微控制器的TinyML研究最新进展的规范和性能比较。
1由CMix-NN论文[46]测量。2根据相应MCU的规格推测。3由MCUNet论文[8]测量。4在2022年12月22日的私人邮件中,论文作者回复称,论文中的能量消耗应解释为mJ而非µJ。
表III. 在STM32H743上的各种微型模型和推理框架的性能比较,该设备运行频率为480MHz,资源限制为512KB峰值内存和2MB存储。
1本次测量中使用的所有推理框架均为截至2022年12月19日的最新版本。2X-Cube-AI(v7.3.0)的测量结果为默认编译设置,即平衡优化。3OOM表示内存不足。4所有模型均可在以下网址获取:https://github.com/mit-han-lab/mcunet。
CMSIS-NN实现了优化的内核,以提高ARM Cortex-M处理器上深度学习模型的推理速度,最小化内存占用并增强能效[41]。X-Cube-AI由STMicroelectronics设计,能够自动将预训练的深度学习模型转换为在STM MCU上运行,并使用优化的内核库[42]。TVM[93]和AutoTVM[99]也支持微控制器(称为µTVM/microTVM[43])。编译技术也可以用于减少内存需求。例如,Stoutchinin等人提出通过优化卷积循环嵌套来提高MCU上的深度学习性能[100]。Liberis等人[44]和Ahn等人[101]提出重新排序操作符执行以最小化峰值内存,而Miao等人[102]则通过暂时将数据交换出SRAM来实现更好的内存利用率。为了减少峰值内存,其他研究人员进一步提出在多层之间计算部分空间区域[103, 104, 105]。此外,CMix-NN支持MCU上量化激活和权重的混合精度内核库,以减少内存占用[46]。TinyEngine作为MCUNet的一部分,被提出为一个内存高效的推理引擎,以扩展搜索空间并适应更大的模型[8]。TinyEngine在生成TinyNAS模型将执行的代码之前,将大部分操作从运行时转移到编译时。此外,TinyEngine根据整体网络拓扑而不是逐层优化来适应内存调度。TensorFlow-Lite Micro(TF-Lite Micro)是首批支持裸机微控制器的深度学习框架之一,以在内存紧张的MCU上实现深度学习推理[47]。然而,上述框架仅支持逐层推理,这限制了可以在只有少量内存的情况下执行的模型容量,并使更高分辨率的输入变得不可能。因此,MCUNetV2提出了一种通用的逐补丁推理调度,该调度在特征图的小空间区域上运行,并大幅减少峰值内存使用,从而使在MCU上进行高分辨率输入的推理成为可能[9]。TinyOps通过直接内存访问(DMA)外设将快速内部内存与额外的慢速外部内存相结合,以扩大内存大小并加速推理[49]。TinyMaix与CMSIS-NN类似,是一个优化的推理内核库,但它避免使用新但罕见的功能,并寻求保持代码库的可读性和简单性[50]。
TinyML训练的最新进展
在小设备上的设备上训练越来越受欢迎,因为它使机器学习模型能够在小而低功耗的设备上直接训练和微调。设备上训练提供了几个好处,包括提供个性化服务和保护用户隐私,因为用户数据从未传输到云端。然而,与设备上推理相比,设备上训练提出了额外的挑战,因为存储中间激活和梯度需要更大的内存占用和增加的计算操作。
研究人员一直在探索减少深度学习模型内存占用的方法。一种方法是手动设计轻量级网络结构或利用NAS[106, 85, 107]。另一种常见的方法是通过释放推理期间的激活并在反向传播期间重新计算丢弃的激活来交换计算以提高内存效率[108, 109]。然而,这种方法以增加计算时间为代价,这对于计算资源有限的微型设备来说是不可承受的。另一种方法是逐层训练,与端到端训练相比,逐层训练也可以减少内存占用。然而,它在实现高精度水平方面效果不佳[110]。另一种方法通过构建动态和稀疏的计算图进行训练,通过激活剪枝减少内存占用[111]。一些研究人员提出了不同的优化器[112]。量化也是一种常见的方法,通过减少训练激活的比特宽度来减少训练期间的激活大小[113, 114]。
图3. 专为微型设备设计的技术。为了充分利用有限的可用资源,我们需要仔细考虑系统和算法。共同设计方法不仅使在广泛的物联网平台上实现实用的AI应用成为可能(推理),还允许AI随着时间的推移持续学习,适应快速变化的世界(训练)。
图4. MCUNet联合设计神经架构和推理调度,以适应微控制器上的紧张内存资源。TinyEngine充分利用MCU上的有限资源,允许更大的架构搜索空间。与使用现有框架相比,更大的设计自由度使TinyNAS更有可能找到高精度的模型。
由于有限的数据和计算资源,设备上训练通常专注于迁移学习。在迁移学习中,神经网络首先在大规模数据集(如ImageNet[115])上进行预训练,并作为特征提取器[116, 117, 118]。然后,仅在较小的任务特定数据集上微调最后一层[119, 120, 121, 122]。这种方法通过消除训练期间存储中间激活的需要来减少内存占用,但由于有限的能力,当领域转移较大时,精度可能较差[52]。微调所有层可以实现更好的精度,但需要大量内存来存储激活,这对于微型设备来说是不可承受的[117, 116]。最近,提出了几个内存友好的设备上训练框架[123, 124, 125],但这些框架针对较大的边缘设备(即移动设备),无法在MCU上采用。另一种方法是仅更新批量归一化层的参数[126, 127]。这减少了可训练参数的数量,但这并不转化为内存效率[52],因为批量归一化层的中间激活仍然需要存储在内存中。
已经表明,神经网络的激活是限制在小设备上训练能力的主要因素。Tiny-Transfer-Learning(TinyTL)通过冻结网络的权重并仅微调偏置来解决这个问题,这允许在反向传播期间丢弃中间激活,从而减少峰值内存使用[52]。TinyOL仅训练最后一层的权重,允许在保持激活足够小以适应小设备的同时进行权重训练[53]。这使得增量设备上数据流训练成为可能。然而,仅微调偏置或最后一层可能无法提供足够的精度。为了在内存有限的设备上训练更多层,POET(私有最佳能量训练)[54]引入了两种技术:重构,通过释放激活早期以重新计算为代价来释放激活,以及分页,允许激活转移到辅助存储。POET使用整数线性规划来找到设备上训练的能量最优调度。为了进一步减少存储训练权重的内存需求,MiniLearn应用量化和反量化技术以整数精度存储权重和中间输出,并在训练期间将它们反量化为浮点精度[55]。在微型设备上部署深度学习模型时,通常会对参数和激活进行量化以减少内存使用。然而,即使经过量化,参数可能仍然太大,无法适应有限的硬件资源,从而阻止了全反向传播。为了解决这些挑战,MCUNetV3提出了一种算法-系统共同设计方法[56]。算法部分包括量化感知缩放(QAS)和稀疏更新。QAS校准梯度缩放并稳定8位量化训练,而稀疏更新则跳过不太重要层的梯度计算和子张量。系统部分包括Tiny Training Engine(TTE),该引擎已开发以支持QAS和稀疏更新,从而在内存有限的微控制器(如256KB或更少)上实现设备上学习。
III. 微型推理
在本节中,我们将讨论我们最近的工作,MCUNet家族[8, 9],这是一个系统-算法共同设计框架,在同一循环中联合优化神经网络架构(TinyNAS)和推理调度(TinyEngine)(图4)。与传统方法相比,MCUNet可以更好地利用资源,在微控制器上实现更好的性能。推理部分的设计空间如图3(左)所示。
TinyNAS:自动化微型模型设计
TinyNAS是一种两阶段神经架构搜索方法,首先优化搜索空间以适应微小和多样的资源约束,然后在优化的空间内进行神经架构搜索。通过优化搜索空间,它显著提高了最终模型的精度。
图5. (a) TinyNAS是一种两阶段的神经架构搜索方法。它首先根据约束指定一个子空间,然后进行模型专业化。(b) TinyNAS通过分析不同搜索空间的FLOPs CDF选择最佳搜索空间。每条曲线代表一个设计空间。我们的见解是,在内存约束下更有可能产生高FLOPs模型的设计空间具有更高的模型容量,因此更有可能实现高精度。
图6. Once-For-All [129]训练一个单一的超网络,通过权重共享支持广泛的子网络,并为不同的MCU硬件专门化不同的子网络架构。
自动化搜索空间优化
TinyNAS提出通过分析满足模型的计算分布来自动优化搜索空间,以低成本进行。为了适应不同微控制器的微小和多样资源约束,TinyNAS按比例缩放移动搜索空间的输入分辨率和宽度乘数[86]。它从输入分辨率R = {48, 64, 80, ..., 192, 208, 224}和宽度乘数W = {0.2, 0.3, 0.4, ..., 1.0}中选择,以覆盖广泛的资源约束。这导致12 × 9 = 108种可能的搜索空间配置S = W × R。每个搜索空间配置包含3.3 × 10^25种可能的子网络。目标是找到包含满足资源约束且精度最高的模型的最佳搜索空间配置S*。
找到S*并不简单。一种方法是对每个搜索空间进行神经架构搜索并比较最终结果。但计算量将是天文数字。相反,TinyNAS通过从搜索空间中随机采样m个网络并比较满足模型的分布来评估搜索空间的质量。它不是收集每个满足模型的累积分布函数(CDF)的精度[88],这由于大量训练而计算量大,而是仅收集FLOPs的CDF(见图5(b))。直觉是,在同一模型家族内,精度通常与计算正相关[128, 61]。计算较大的模型具有更大的容量,更有可能达到更高的精度。
以在STM32F746上对ImageNet-100(从原始ImageNet中提取的100类分类任务)的最佳搜索空间进行研究为例。我们在图5(b)中展示了前10个搜索空间配置的FLOPs分布CDF。仅保留满足TinyEngine最佳调度的内存要求的模型。例如,根据ImageNet-100的实验结果,使用实线红色空间(平均FLOPs 52.0M)比使用实线绿色空间(平均FLOPs 46.9M)的精度高2.3%,显示了自动化搜索空间优化的有效性。
资源约束模型专业化与Once-For-All NAS
为了为各种微控制器专门化网络架构,我们需要保持低神经架构搜索成本。给定一个优化的搜索空间,TinyNAS进一步执行一次性神经架构搜索[130, 131]以高效找到一个好的模型。具体来说,它遵循Once-For-All(OFA)NAS[129]进行网络专业化(图6)。我们通过权重共享训练一个包含所有可能子网络的超网络,并使用它来估计每个子网络的性能。搜索空间基于广泛使用的移动搜索空间[86, 85, 87, 129],并支持深度卷积的可变核大小(3/5/7)、倒瓶颈的可变扩展比(3/4/6)和可变阶段深度(2/3/4)。TinyNAS可以在搜索空间中覆盖的子网络数量很大:2 × 10^19。对于每批数据,它随机采样4个子网络,计算损失,为每个子网络反向传播梯度,并更新相应的权重。然后,它执行进化搜索,在搜索空间中找到满足板载资源约束并实现最高精度的最佳模型。对于每个采样的网络,它使用TinyEngine优化内存调度以测量最佳内存使用。通过这种共同设计,我们可以高效地适应微小的内存预算。
TinyEngine:内存高效的推理库
研究人员曾经假设使用不同的深度学习框架(库)只会影响推理速度,而不会影响精度。然而,这对于TinyML并非如此:推理库的效率对搜索模型的延迟和精度都有很大影响。具体来说,一个好的推理框架将充分利用MCU上的有限资源,避免内存浪费,并允许更大的架构搜索空间。有了更大的设计自由度,TinyNAS更有可能找到高精度的模型。因此,TinyNAS与内存高效的推理库TinyEngine共同设计。
图7. TinyEngine在减少内存使用的同时,实现了比现有推理框架更高的推理效率。左侧:TinyEngine比TF-Lite Micro快22倍,比CMSIS-NN快2.3倍,比X-Cube-AI快1.5倍。右侧:通过减少内存使用,TinyEngine可以在微小的内存下运行各种模型设计,扩大了TinyNAS在MCU有限内存下的设计空间。
图8. TinyEngine通过消除运行时开销、专门化每种优化技术和采用原地深度卷积,优于现有库。这有效地扩大了在给定延迟/内存约束下TinyNAS的设计空间。
代码生成
大多数现有的推理库(如TF-Lite Micro、CMSIS-NN)是基于解释器的。虽然它易于支持跨平台开发,但它需要额外的内存(MCU上最昂贵的资源)来存储元信息(如模型结构参数)。相反,TinyEngine仅关注MCU设备并采用基于代码生成器的编译。这不仅避免了运行时解释的时间,还释放了内存使用,允许设计和推理更大的模型。与CMSIS-NN相比,TinyEngine通过代码生成将内存使用减少了2.1倍,并通过代码生成提高了推理效率22%,如图7和图8所示。
TinyEngine的二进制大小轻量级,使其对MCU非常内存高效。由著名的深度学习编程语言(如Python、Cython等)直接编译的模型无法在MCU上运行,因为它们的依赖项和包的大小已经大于MCU的闪存大小,更不用说编译模型的大小了。此外,与为支持跨模型推理而准备每种操作(如conv、softmax)的代码的基于解释器的TF-Lite Micro不同,即使它们未被使用,这也具有高冗余性。TinyEngine仅将给定模型使用的操作编译到二进制文件中。也就是说,由TinyEngine编译的模型二进制大小的减少不仅来自于编译优于解释的好处,还来自于模型特定的优化/专业化。如图9所示,这种模型自适应编译与TF-Lite Micro和CMSIS-NN相比,代码大小减少了最多4.5倍和5.0倍。
原地深度卷积
TinyEngine支持原地深度卷积以进一步减少峰值内存。与标准卷积不同,深度卷积不跨通道执行过滤。因此,一旦通道的计算完成,通道的输入激活可以被覆盖并用于存储另一个通道的输出激活,允许深度卷积的激活原地更新,如图10所示。这种方法将测量的内存使用减少了1.6倍,如图8所示。
基于补丁的推理
TinyNAS和TinyEngine在相同精度水平上显著减少了峰值内存。但我们仍然注意到每个块的峰值内存使用非常不平衡。
图10. TinyEngine通过执行原地深度卷积来减少峰值内存。左侧:传统的深度卷积需要2N的激活内存占用。右侧:原地深度卷积将深度卷积的内存减少到N+1。具体来说,第一个通道的输出激活存储在临时缓冲区中。然后,对于每个后续通道,输出激活覆盖其前一个通道的输入激活。最后,存储在缓冲区中的第一个通道的输出激活被写回到最后一个通道的输入激活。
图11. MobileNetV2 [4]具有非常不平衡的内存使用分布。峰值内存由前5个具有高峰值内存的块决定,而后续块的内存使用量都很小。通过使用逐补丁推理(4 × 4补丁),我们能够显著减少前5个块的内存使用量,并将总体峰值内存减少8倍,适应具有256kB内存预算的MCU。请注意,两种设置下的模型架构和精度没有变化。内存使用量以int8测量。
图12. 逐补丁推理可以显著减少执行一系列卷积层所需的峰值内存。我们研究了两个卷积层(步幅1和2)。在逐层计算(a)中,第一个卷积具有大的输入/输出激活大小,主导了峰值内存需求。通过逐补丁计算(b),我们分配缓冲区来承载最终的输出激活,并逐补丁计算结果。我们只需要存储一个补丁的激活,而不是整个特征图,从而减少了峰值内存(第一个输入是图像,可以部分从压缩格式(如JPEG)解码)。
图13. 重分配的MobileNetV2(MbV2-RD)在逐补丁推理阶段减少了感受野,在逐层阶段增加了感受野。两个网络具有相同水平的性能,但MbV2-RD在基于补丁的推理下具有更小的开销。移动倒置块表示为MB{扩展比率} {核大小}。虚线边框表示步幅=2。
不平衡的内存分布
例如,MobileNetV2[4]的每个块的峰值内存使用如图11所示。分析在int8中完成。有一个明显的内存使用不平衡模式。前5个块具有高峰值内存,超过了MCU的内存约束,而其余13个块的内存使用量很小。第三个块的内存使用量是网络其余部分的8倍,成为内存瓶颈。其他高效网络设计也存在类似模式,这在不同的CNN主干中非常常见,即使是为内存受限的微控制器专门设计的模型[8]。
这种现象适用于大多数单分支或残差CNN设计,由于分层结构:在每个阶段之后,图像分辨率减半,导致像素减少4倍,而通道数仅增加2倍[132, 10, 5]或甚至更小的比例[133, 135, 106],导致激活大小减小。因此,内存瓶颈往往出现在网络的早期阶段,之后峰值内存使用量要小得多。
通过基于补丁的推理打破内存瓶颈
TinyEngine通过基于补丁的推理打破了初始层的内存瓶颈(图12)。现有的深度学习推理框架(如TensorFlow Lite Micro[90]、TinyEngine[8]、microTVM[93]等)使用逐层执行。对于每个卷积层,推理库首先在SRAM中分配输入和输出激活缓冲区,并在整个层计算完成后释放输入缓冲区。基于补丁的推理以逐补丁的方式运行初始内存密集阶段。每次,它仅在小的空间区域(比整个区域小10倍以上)上运行模型,这有效地减少了峰值内存使用。完成此阶段后,具有小峰值内存的网络的其余部分以逐层方式执行(图11中的上部符号)。
两个卷积层(步幅1和2)的示例如图12所示。对于传统的逐层计算,第一个卷积层具有大的输入和输出激活大小,导致高峰值内存。通过空间部分计算,它为最终输出分配缓冲区,并逐补丁计算其值。在这种方式下,它只需要存储一个补丁的激活,而不是整个特征图。
通过重分配感受野减少计算开销
显著的内存节省以计算开销为代价。为了保持与逐层推理相同的输出结果,非重叠的输出补丁对应于输入图像中的重叠补丁(图12(b)中的阴影区域)。这是因为核大小>1的卷积滤波器有助于增加感受野。计算开销与基于补丁的初始阶段的感受野有关。考虑基于补丁阶段的输出,它在输入图像上的感受野越大,每个补丁的分辨率越大,导致重叠区域和重复计算越大。有一些方法从硬件角度解决这个问题[103]。然而,由于这种做法可能不适用于所有设备,TinyEngine从网络架构方面解决问题。
MCUNet提出重分配CNN的感受野(RF)以减少计算开销。基本思想是:(1)减少基于补丁的初始阶段的感受野;(2)增加后期阶段的感受野。减少初始阶段的RF有助于减少每个输入补丁的大小和重复计算。然而,如果整体RF较小,某些任务的性能可能会下降(例如,检测大对象)。因此,它进一步增加后期阶段的RF以补偿性能损失。MobileNetV2的手动调整示例如图13所示。重分配感受野("MbV2-RD")后,计算开销可以忽略不计。
MCUNet通过联合搜索自动化了这一过程(在下一节中介绍)。
共同设计:联合神经架构和推理调度搜索
共同设计循环
模型架构和推理引擎的优化算法紧密耦合。例如,重分配感受野允许我们在最小计算/延迟开销的情况下享受内存减少的好处,这允许在设计主干架构时具有更大的自由度(例如,我们现在可以使用更大的输入分辨率)。为了探索如此大的设计空间,MCUNet以自动化方式联合优化神经架构和推理调度。给定某个数据集和硬件约束(SRAM限制、闪存限制、延迟限制等),我们的目标是实现最高精度同时满足所有约束。对于模型优化,它使用NAS找到一个好的候选网络架构;对于调度优化,它优化补丁数量p和块数量n等旋钮以执行基于补丁的推理,以及TinyEngine中的其他旋钮[8]。
在共同设计过程中存在一些权衡。例如,给定相同的约束,它可以选择使用较小的模型,该模型适合逐层执行(p = 1,没有计算开销),或者使用较大的模型和逐补丁推理(p > 1,具有小的计算开销)。因此,MCUNet将双方放在同一循环中,并使用进化搜索找到满足约束的最佳集合(k[ ],e[ ],d[ ],w[ ],r,p,n)。因此,这两个维度在同一循环中通过进化搜索联合搜索。
实验结果
在MCU上推动ImageNet记录
通过神经架构和推理调度的联合优化,MCUNet显著推动了MCU上微型图像分类的最先进结果。
表IV. MCUNet显著提高了微控制器上的ImageNet精度,在256kB SRAM下比最先进的方法高出4.6%,在512kB下高出3.3%。较低或混合精度(标记为灰色)是正交技术,我们将其留给未来的工作。内存不足(OOM)的结果被划掉。
图14. 左侧:MCUNet在视觉唤醒词(VWW)精度与峰值SRAM的权衡上表现更好。与MCUNet [8]相比,MCUNet在4.0倍更小的峰值内存下实现了更好的精度。它在<32kB内存下实现了>90%的精度,便于在极小硬件上部署。右侧:基于补丁的方法扩展了适合MCU的搜索空间,允许更好的精度与延迟的权衡。
我们在两种硬件设置下将MCUNet与现有的最先进解决方案进行了比较:256kB SRAM/1MB Flash和512kB SRAM/2MB Flash。前者代表广泛使用的Cortex-M4微控制器;后者对应于高端Cortex-M7。目标是实现资源受限MCU上的最高ImageNet精度(表IV)。MCUNet显著提高了微型深度学习在微控制器上的ImageNet精度。在256kB SRAM/1MB Flash下,MCUNet比最先进的方法[8]提高了4.6%的ImageNet精度,峰值SRAM降低了18%。在512kB SRAM/2MB Flash下,MCUNet在商用微控制器上实现了71.8%的新ImageNet精度记录,比相同量化策略下的最佳解决方案提高了3.3%。较低位(int4)或混合精度量化可以进一步提高精度(表中标记为灰色)。
表V. MCUNet通过允许更高的输入分辨率显著提高了MCU上的Pascal VOC [134]对象检测。在STM32H743 MCU约束下,MCUNet-H7比[8]提高了16.9%的mAP,在MCU上实现了创纪录的性能。它还可以缩小到仅256kB SRAM的更便宜的MCU STM32F412,同时在1.9倍更小的峰值SRAM和相似的计算量下仍将mAP提高13.2%。
表VI. MCUNet在WIDER FACE [136]数据集上的内存高效人脸检测中优于现有方法。与RNNPool-Face-C [105]相比,MCUNet-L可以在3.4倍更小的峰值SRAM和1.6倍更小的计算量下实现相似的mAP。模型统计数据根据[105]在640 × 480 RGB输入图像上进行分析。
在32kB SRAM下的视觉唤醒词
视觉唤醒词(VWW)反映了TinyML的低能量应用。MCUNet允许以适度的内存需求运行VWW模型。如图14+所示,MCUNet在精度与峰值内存和精度与延迟的权衡方面优于最先进的方法[8]。与逐层推理相比,MCUNet可以使用4.0倍更小的内存实现更好的精度。实际上,它在32kB SRAM要求下可以实现>90%的精度,允许在低端的STM32F410上部署模型,成本仅为1.6美元。基于补丁的推理还扩展了搜索空间,使我们更有自由找到具有更好精度与延迟权衡的模型。
在Pascal VOC上的MCU检测
对象检测对较小的输入分辨率敏感[9]。由于分辨率瓶颈,当前的最先进方法[8]无法在MCU上实现像样的检测性能。MCUNet打破了检测器的内存瓶颈,并将mAP提高了两位数。
在Pascal VOC上使用YOLOv3[135]训练的对象检测结果如表V所示,包括M4 MCU(256kB SRAM)和H7 MCU(512kB SRAM)的结果。在H7 MCU上,MCUNet-H7比最先进的方法MCUNet[8]提高了16.7%的mAP。它还可以缩小以适应仅256kB SRAM的更便宜的商品Cortex-M4 MCU,同时在1.9倍更小的峰值SRAM下仍将mAP提高13.2%。请注意,MCUNet-M4与MCUNet(172M vs. 168M)具有类似的计算量,但mAP要好得多。这是因为基于补丁的推理扩展的搜索空间允许我们选择更好的配置,即更大的输入分辨率和更小的模型。
内存高效的人脸检测
MCUNet在WIDER FACE[136]数据集上的内存高效人脸检测性能如表VI所示。根据[105]报告了检测器主干在fp32中的分析内存使用。模型使用S3FD[140]进行训练,遵循[105]进行公平比较。报告的mAP是在样本上计算的,样本中最多有3张脸,这对于微型设备来说是一个更现实的设置。MCUNet在不同尺度下优于现有解决方案。MCUNet-L在3.4倍更小的峰值内存下实现了与RNNPool-Face-C[8]相当的性能,在9.9倍更小的峰值内存下实现了与LFFD[138]相当的性能。计算量也分别小1.6倍和8.4倍。MCUNet-S在1.8倍更小的峰值内存下始终优于RNNPool-Face-A[105]和EagleEye[139]。
IV. 微型训练
除了推理,微型设备上的训练是一个不断发展的方向,它允许我们在部署后将预训练模型适应新收集的传感器数据。通过在边缘本地训练和适应,模型可以不断改进其预测并执行终身学习和用户定制。通过将训练带到传感器附近,它在处理敏感数据(如医疗保健)时也有助于保护用户隐私。
然而,微型边缘设备上的设备上训练极其具有挑战性,并且与云训练根本不同。微型物联网设备(如微控制器)通常具有有限的SRAM大小,如256KB。如此小的内存预算对于深度学习模型的推理来说几乎不够[8, 9, 48, 141, 142, 143, 44, 45],更不用说训练了,训练需要额外的计算来进行反向传播和存储中间激活[109]。另一方面,现代深度训练框架(如PyTorch[89]、TensorFlow[144])通常设计用于云服务器,即使训练一个小模型(如MobileNetV2-w0.35[4]),批量大小为1,也需要大量内存占用(>300MB)。巨大的差距(>1000倍)使得在微型物联网设备上运行变得不可能。此外,像微控制器这样的设备是裸机的,没有操作系统和现有训练框架所需的运行时支持。因此,我们需要共同设计算法和系统以实现微型设备上的训练。
深度学习训练系统如PyTorch[89]、TensorFlow[144]、JAX[92]、MXNet[91]等不考虑边缘设备上的紧张资源。边缘深度学习推理框架如TVM[93]、TF-Lite[94]、NCNN[97]等提供了一个精简的运行时,但缺乏对反向传播的支持。有一些低成本的高效迁移学习算法,如仅训练最后一层分类器、仅更新偏置[52]等。然而,现有的训练系统无法将理论节省转化为实际节省。这种更新方案的下游精度也较低(图18)。需要能够有效利用边缘设备有限资源的训练系统。
为了弥合差距并通过算法-系统共同设计实现微型设备上的训练,微型设备上的训练面临两个独特挑战:(1)模型在边缘设备上进行量化。由于混合精度张量和缺乏批量归一化层[145],优化真实量化图很困难;(2)微型硬件的有限硬件资源(内存和计算)不允许全反向传播,因为内存使用量很容易超过微控制器的SRAM一个数量级以上。为了应对这些困难,TinyTraining提出了以下设计:
图15. 算法和系统共同设计将训练内存从303MB(PyTorch)减少到149KB,同时保持相同的迁移学习精度,导致2077倍的减少。这些数字是用MobilenetV2-w0.35 [4]测量的,批量大小为1,分辨率为128×128。它可以部署到具有256KB SRAM的微控制器上。
图16. 左侧:量化模型在训练时与浮点模型相比具有非常不同的权重/梯度范数比(即∥W∥/∥G∥)。QAS稳定了∥W∥/∥G∥比率并有助于优化。右侧:使用和不使用QAS的验证损失曲线。QAS有效地帮助收敛,导致更好的精度。结果来自在Cars数据集上更新MCUNet模型的最后两块。
表VII. 使用SGD更新真实量化图(int8)很困难:迁移学习精度落后于浮点对应物(fp32),即使使用自适应学习率优化器如Adam [148]和LARS [149]。QAS有助于弥合精度差距,而没有内存开销(略高)。这些数字用于更新MCUNet-5FPS [8]模型的最后两块。
图17. ProxylessNAS-Mobile [85]上的不同学习方案。全更新(a)消耗大量内存,因此无法适应TinyML。高效学习方法如仅最后(b)/仅偏置(c)节省内存,但无法匹配基线性能。稀疏更新(d)仅执行部分反向传播,导致较少的内存使用和计算,同时在下游任务中具有可比的精度。
图18. 左侧:更新偏置和权重的贡献分析。对于更新特定层的权重,后面的层似乎更重要;倒瓶颈块[4]中的第一个逐点卷积(pw1)似乎更重要;并且更新更多通道的收益更大。右侧:稀疏更新可以在4.5-7.5倍更小的额外内存(分析)下实现更高的迁移学习精度,相比于更新最后k层。对于仅分类器更新,由于容量有限,精度较低。仅偏置更新可以实现更高的精度,但很快达到平稳。
量化感知缩放
神经网络通常需要量化以适应边缘设备的有限内存[146, 8]。对于fp32线性层y_fp32 = W_fp32 * x_fp32 + b_fp32,int8量化对应为:
y_int8 = cast2int8[s_fp32 · (W_int8 * x_int8 + b_int32)],
其中τ表示张量被量化为定点数,s是浮点缩放因子,将结果投影回int8范围。权重的梯度更新可以表示为:W'_int8 = cast2int8(W_int8 - α · G_W),其中α是学习率,G_W是权重的梯度。在应用梯度更新后,权重被四舍五入回8位整数。
梯度尺度不匹配
与在云上微调浮点模型不同,优化真实量化图很困难:量化图具有不同比特精度的张量(int8、int32、fp32,见公式1),并且缺乏批量归一化层(融合),导致梯度更新不稳定。
优化量化图通常会导致比浮点对应物更低的精度。一个可能的假设是量化过程扭曲了梯度更新。为了验证这一想法,图16绘制了在CIFAR数据集[147]上训练开始时每个张量的权重范数与梯度范数之比(即||W||/||G||)。量化后的比率曲线与浮点模型非常不同:(1)比率大得多(可以通过调整学习率解决);(2)量化后的比率模式不同。以突出显示的区域(红色框)为例,量化比率具有锯齿形模式,与浮点曲线不同。如果所有张量都使用固定的学习率更新,那么每个张量的更新速度将与浮点情况非常不同,导致较低的精度。即使像Adam[148]这样的自适应学习率优化器也无法完全解决这个问题,如表VII所示。
无超参数的梯度缩放
为了解决这个问题,提出了一种无超参数的学习率缩放规则,QAS。考虑一个线性层的2D权重矩阵W ∈ R^c1×c2,其中c1、c2是输入和输出通道。为了进行逐张量量化[146],计算缩放率s_W ∈ R,使得W的最大幅度为2^7 - 1 = 127:
W = s_W · (W/s_W)^quantize ≈ s_W · W_int8,G_W ≈ s_W · G_W,
该过程(大致)在正向传播期间保留了数学功能(公式1),但它扭曲了权重与其对应梯度之间的幅度比:
||W_int8||/||G_W|| ≈ ||W/s_W||/||s_W · G_W|| = s_W^−2 · ||W||/||G||。
权重和梯度比率相差s_W^−2,导致图16中的扭曲模式:(1)缩放因子远小于1,使得权重-梯度比率大得多;(2)权重和偏置具有不同的数据类型(int8 vs. int32),因此具有非常不同幅度的缩放因子,导致锯齿形模式。为了解决这个问题,提出通过补偿公式3中的梯度来缩放量化图的梯度:
G_W = G_W · s_W^−2,G_b = G_b · s_W^−2 · s_x^−2 = G_b · s^−2,
其中s_x^−2是量化输入x的缩放因子(标量,遵循[146],注意s = s_W · s_x在公式1中)。应用QAS后的||W||/||G||曲线如图16(int8+scale)所示。
缩放后,梯度比率与浮点对应物匹配。它还提高了迁移学习精度(表VII),与没有内存开销的浮点对应物精度匹配。
实验结果
表VII的最后两行显示了在各种下游数据集上微调MCUNet的结果(模拟低成本微调)。使用动量SGD,量化模型(int8)的训练精度落后于浮点对应物,因为优化困难。自适应学习率优化器如Adam[148]可以提高精度,但仍低于fp32微调结果。由于二阶动量,它还消耗了3倍的内存,这在TinyML设置中是不希望的。LARS[149]在大多数数据集上收敛不佳,尽管进行了广泛的超参数调整(学习率和"信任系数")。LARS的激进梯度缩放规则使训练不稳定。应用QAS后,精度差距被缩小,实现了与浮点训练相同的精度,没有额外的内存成本。图16显示了在Cars数据集上使用和不使用QAS的TinyTraining训练曲线。QAS有效地改善了优化。
内存高效的稀疏更新
尽管QAS使优化量化模型成为可能,但更新整个模型(甚至最后几层)需要大量内存,这对于TinyML设置来说是不可承受的。为了解决这个问题,提出了稀疏更新层和稀疏更新张量
稀疏层/张量更新
修剪技术在实现稀疏性和减少模型大小方面非常成功[63, 61, 59, 58, 60, 62]。与为推理修剪权重不同,在反向传播期间修剪梯度,并稀疏更新模型。给定一个紧内存预算,跳过更新不太重要的参数以减少内存使用和计算成本。当更新线性层y = Wx + b时,梯度更新为G_w = f1(G_y, x)和G_b = f2(G_y),给定后一层的输出梯度G_y。请注意,更新偏置不需要保存中间激活x,导致较轻的内存占用[52];而更新权重更内存密集但更具表达性。对于像微控制器这样的硬件,由于原始参数存储在只读FLASH中[8],需要额外的副本来存储更新的参数。考虑到更新规则的不同性质,考虑了稀疏更新规则的三个方面(图17):(1)偏置更新:应该反向传播并更新多少层偏置(偏置更新便宜,如果层被反向传播,可以始终更新偏置)。(2)稀疏层更新:选择一组层来更新相应的权重。(3)稀疏张量更新:进一步允许更新权重通道的子集以减少成本。
然而,在内存预算下找到正确的稀疏更新方案具有挑战性,因为组合空间很大。对于具有43个卷积层的MCUNet[8]模型和权重更新比率从{0, 1/8, 1/4, 1/2, 1},组合约为10^30,使得穷举搜索不可能。
贡献分析自动选择
提出了贡献分析来自动推导稀疏更新方案,通过计算每个参数(权重/偏置)对下游精度的贡献。给定一个具有l层的卷积神经网络,测量从(1)偏置:更新最后k个偏置b_l, b_l−1, ..., b_l−k+1(仅偏置更新)与仅更新分类器的改进,定义为Δacc_b[i,k];(2)权重:更新一个额外层W_i(具有通道更新比率r)与仅偏置更新的改进,定义为Δacc_W_i,r。贡献分析的示例如图18左图所示(MCUNet在Cars[150]数据集上;在找到Δacc_b[i,k]和Δacc_W_i(1 ≤ k, i ≤ l)后,解决优化问题以找到:
k*, i*, r* = max_k,i,r(Δacc_b[i,k] + ∑_i∈I,r∈r Δacc_W_i,r),
s.t. Memory(k, i, r) ≤ constraint,
其中i是更新权重的层索引集合,r是相应的更新比率(1/8, 1/4, 1/2, 1)。直观地说,通过解决这个优化问题,找到了偏置更新的层数和权重更新的子集的组合,使得总贡献最大化,同时内存开销不超过约束。该问题可以通过进化搜索高效解决。稀疏更新假设每个张量的精度贡献可以相加。这种近似在我们的实验中被证明非常有效。
稀疏更新在较低内存下获得更好的精度
将我们搜索的稀疏更新方案的性能与两种基线方法进行了比较:仅更新最后k层的偏置和仅更新最后k层的权重和偏置。对于每种配置,在8个下游数据集上测量平均精度,并分析计算额外的内存使用。图18比较了结果与仅更新分类器的简单基线。由于有限的学习能力,分类器仅更新的精度较低。仅更新分类器是不够的;主干也需要更新。仅偏置更新优于分类器仅更新,但精度很快达到平稳,即使更多偏置被调整也不会提高。对于更新最后k层,随着更多层被调整,精度通常提高;然而,它具有非常大的内存占用。例如,更新MCUNet的最后两层导致额外的内存使用超过256KB,使得对于物联网设备/微控制器不可行。我们的稀疏更新方案可以在更低的内存成本下实现更高的下游精度。与更新最后k层相比,稀疏更新可以在4.5-7.5倍的较小内存开销下实现更高的下游精度。通过更新最后k层可以实现最高的精度,作为基线上限(表示为"上限")。有趣的是,我们的稀疏更新实现了比基线最佳统计更好的下游精度。稀疏更新方案缓解了过拟合或使无动量优化更容易。
图19. 我们的微型训练引擎(TTE)的工作流程。(a,b) 我们的引擎为给定模型跟踪前向图,并在编译时推导相应的反向图。红色圆圈表示梯度下降操作符。(c) 为了减少内存需求,与冻结权重相关的节点(浅蓝色)从反向计算中被修剪。(d) 为了最小化内存占用,梯度下降操作符被重新排序,与反向计算交错(黄色)。(e) TTE使用代码生成编译前向和反向图,并在微型物联网设备上部署训练(最好以彩色查看)。
图20. 通过操作符重排序减少内存占用。通过操作符重排序,TTE可以应用原地梯度更新并执行操作符融合,以避免大的中间张量,从而减少内存占用。我们在本图中分析了MobileNetV2-w0.35(与图15相同)。
微型训练引擎(TTE)
理论上的节省在现有的深度学习框架中无法转化为实际的内存节省,由于冗余的运行时和缺乏图修剪。MCUNetV3共同设计了一个高效的训练系统,Tiny Training Engine(TTE),将上述算法转化为精简的二进制代码(图19)。
编译时微分和代码生成
TTE将自动微分从运行时转移到编译时,生成一个可以修剪和优化的静态反向图(见下文),以减少内存和计算。TTE基于代码生成:它将优化的图编译为目标硬件上的可执行二进制文件,最小化运行时库大小并消除像Python这样的主机语言的需求(通常使用兆字节的内存)。
反向图修剪以实现稀疏更新
TTE在编译二进制代码之前修剪反向图中的冗余节点。对于稀疏层更新,TTE修剪冻结权重的梯度节点,仅保留偏置更新的节点。之后,TTE遍历图以找到由于修剪而未使用的中间节点(例如,保存的输入激活),并应用死代码消除(DCE)以去除冗余。对于稀疏张量更新,TTE引入了一个子操作切片机制,将层的权重分成可训练和冻结部分;冻结子集的反向图被移除。TTE的编译将稀疏更新算法转化为实际的内存节省,减少了训练内存7-9倍,而不会损失精度(图21(a))。
操作符重排序和图优化
不同操作的执行顺序影响张量的生命周期和整体内存占用。这对于推理已经得到了很好的研究[101, 44],但对于训练由于额外的复杂性而没有得到很好的研究。传统的训练框架通常在应用更新之前推导所有可训练参数的梯度。这种做法导致存储梯度的显著内存浪费。通过重排序操作符,特定张量的梯度更新可以在反向传播到更早层之前立即应用(原地更新),从而可以释放梯度。因此,TTE跟踪所有张量(权重、梯度、激活)的依赖关系并重排序操作符,以便一些操作符可以融合以减少内存占用(2.4-3.2倍,图21(a))。图20提供了一个示例,反映了通过重排序实现的内存节省。
内存节省和更快的训练
图21(a)显示了三个模型在STM32F746 MCU上的训练内存,以比较TTE的内存节省。稀疏更新通过图修剪机制有效地减少了峰值内存7-9倍,与全更新相比,实现了相同或更高的迁移学习精度(比较图18中由箭头连接的数据点)。通过操作符重排序进一步减少了内存,导致总内存节省20-21倍。通过这两种技术,所有3个模型的训练都适合256KB SRAM。
图21. 测量的峰值内存和延迟:(a) 稀疏更新与TTE图优化可以减少不同模型的测量峰值内存20-21倍,使训练在微型边缘设备上变得可行。(b) 图优化一致地减少了不同稀疏更新方案的峰值内存(由不同的平均迁移学习精度表示)。(c) 稀疏更新与TTE操作符相比全更新与TF-Lite Micro操作符实现了23-25倍的更快速度,导致更少的能量使用。注意:对于稀疏更新,我们选择实现与全更新相同精度的配置。
在STM32F746 MCU上每张图像的训练延迟如图21(c)所示。通过图优化和利用多种编译优化方法(如循环展开和分块),我们的稀疏更新+TTE内核显著提高了训练速度23-25倍,与全更新+TF-Lite Micro内核相比,导致能量节省并使训练变得实际。
V. 结论与展望
总之,TinyML是一个快速发展的领域,使深度学习能够在资源受限的设备上运行。它在边缘设备上实现了广泛定制和私有的AI应用,可以在数据源处处理从传感器收集的数据。我们指出了TinyML的几个独特挑战。首先,我们需要重新设计模型设计空间,因为为移动和其他平台设计的深度模型不适用于TinyML。其次,我们需要重新设计反向传播方案并研究新的学习算法,因为直接适应推理模型不适用于微型训练。第三,共同设计对于TinyML是必要的。我们总结了旨在克服这些挑战的算法和系统方面的相关工作。此外,我们介绍了TinyML技术,这些技术不仅使在广泛的物联网平台上实现实用的AI应用成为可能,还允许AI随着时间的推移持续学习,适应快速变化的世界。展望未来,TinyML将继续成为一个活跃且快速发展的领域,需要持续努力以提高性能和能效。我们讨论了TinyML未来发展的几个可能方向。
更多应用和模态
这篇综述主要关注卷积神经网络(CNN),因为计算机视觉广泛应用于微型设备。然而,TinyML的应用远不止计算机视觉,还包括但不限于音频处理、语言处理、异常检测等,传感器输入包括温度/湿度传感器、加速度计、电流/电压传感器等。TinyML使本地设备能够处理多传感器输入以处理多任务工作负载,为众多潜在应用开辟了未来的途径。我们将进一步探索这些可能性留给未来的工作。
自监督学习
在边缘设备上进行设备上学习获取准确标记的数据可能具有挑战性。在某些情况下,如键盘输入,我们可以使用下一个输入词作为模型的预测目标。然而,对于大多数应用,如视觉任务的领域适应(如分割、检测),获取监督可能昂贵且困难。一个潜在的解决方案是为设备上训练设计自监督学习任务,正如最近的研究[151]所提出的。
TinyML与大型ML之间的关系
TinyML和大型ML都旨在在内存、计算、工程努力和数据等资源约束下开发高效模型。虽然TinyML主要关注使模型在小型设备上高效运行,但其许多技术也可以应用于云环境中进行大规模机器学习场景。例如,量化技术在TinyML[8, 9]和大型ML设置[152, 153]中都有效,稀疏学习的概念在两种场景中都被用于在有限资源下高效运行模型[154, 56]。这些高效技术通常是普遍适用的,不应局限于TinyML设置。
TinyML的概念不断演变和扩展。当ResNet-50[10]在2016年首次引入时,它被认为是一个具有25M参数和4G MACs的大型模型。然而,6年后,随着硬件的快速进步,它现在可以在智能手机DSP(高通骁龙8Gen1)上实现亚毫秒的推理。随着硬件的不断改进,曾经被认为是"大型"的模型在未来可能被认为是"微型"的。TinyML的范围应随时间演变和适应。