在我们的生活中,IoT设备已变得非常常见(据统计已达250B),并用于方方面面(比如智能制造、个性化医疗、农业生产、自助零售等等)。这种低成本、低功耗的微处理器也为微型机器学习的应用带来了新的机会,如能在这类设备上运行AI算法,那么我们可以在端上直接进行数据分析,进而扩大了AI的应用领域。 然而,微处理器具有非常有限的资源负载,尤其是SRAM和Flash,要比手机端或者GPU的资源小的多,这也使得深度学习在IoT设备上的部署具有挑战性。下图对比了GPU、手机端以及微处理器的资源信息,很明显在微处理器上运行ResNet50、MobileNetV2是不可行的。峰值内存占用远远超出微处理的最大内存,两者之间存在巨大的差距。 注:SRAM可以进行读写,约束了feature-map的大小;flash只可以进行读,约束了模型大小。 不同于云端或者手机端设备,微处理器是一种“裸设备”,它不具有操作系统。所以需要同时进行网络架构与推理库的设计以更高效的管理有限的资源并是配合内存与存储负载。而现有的NAS或手工网络架构往往聚焦于GPU端或手机端,它们仅仅对FLOPs或者推理延迟进行优化,所得模型并不适合于微处理器。 该文提出了一种系统-模型联合设计的方案MCUNet,它可以在微处理器上处理ImageNet级别的任务。为解决微处理器上稀缺内存问题,作者联合优化TinyNAS与TinyEngine以降低内存占用。TinyNAS的设计基于这样的一个假设:a search space that can accommodate higher FLOPs under memory constraint can produce better model。为处理微处理器上非常紧张的资源约束,还需要设计一种内存高效的推理库以消除不必要的内存占用。TinyEngine的改进为:TinyEngine improves over the existing inference library with code generator-based compilation method to eliminate memory overhead。它可以降低2.7x的内存占用并提升22%推理速度。
研究人员往往假设:不同的深度学习框架仅仅影响推理速度而不会影响模型精度。然而,对于TinyML而言,推理库的高效性不仅影响推理速度,同时还会影响搜索到的模型精度。一个好的推理框架可以更充分的利用MUC的有效资源,避免内存占用,从而允许更大的架构设计空间,而更大的架构设计空间也意味着更高精度模型。因此,作者将TinyNAS与TinyEngine进行协同设计,以获得内存高效的推理库。 上图给出了TinyEngine与现有推理框架在不同维度的对比。现有的TF-Lite Micro与CMSIS-NN是解释型推理框架,它们易于跨平台部署,但同时需要额外的内存(在MCU上内存是最昂贵的资源)保存架构的元信息(比如网络架构参数);相反TinyEngine仅仅聚焦于MCU设备,采用code generator-based进行编译。它不仅避免了运行时解释耗时,同时释放了额外的内存占用,从而允许更大的模型。相比CMSIS-NN,TinyEngine可以降低2.7x内存占用,提升22%推理速度。 与此同时TinyEngine的库文件非常轻量,这使得其非常适合于MCU。不同于TF-Lite Micro需要准备所有的操作(比如conv、softmax)以支持跨模型推理;而TinyEngine仅仅需要编译必要的操作。下图给出了TF-Lite Micro、CMSIS-NN与TinyEngien的大小对比。 TinyEngine为不同层制作特定的核优化方案:loops tiling is based on the kernel size and available memory; inner loop unrolling is also specialized for different kernel size。同时,TinyEngine还进行了操作合并,比如Conv+PAd+BN+ReLU。上述优化方案可以为模型推理带来22%的加速。
Experiments
在实验方面,作者选用了ImageNet、Visual Wake Word以及Speech Command三个数据集。ImageNet代表了大尺度图像分类任务,VWW用于判别是否有人存在,而SC代表了主流的微处理器应用场景:语音唤醒。 在模型部署方面,作者采用int8线性量化后部署。MCU选型为STM32F746,它具有320kb SRAM与1MB Flash。直接上结果咯。Table2的结果很震撼哦,最优模型可达60.1%精度。 好了,全文到底结束。上面已经对该文的核心进行了简单的介绍。但美中不足的是:该文尚未开源。