新闻中心

EEPW首页 > 设计应用 > 在MCU上运用机器学习实现轻智能

在MCU上运用机器学习实现轻智能

—— (5月刊)在MCU上运用机器学习实现轻智能
作者:宋岩时间:2019-04-28来源:电子产品世界收藏

  Enable light intelligence by using machine learning on s

本文引用地址:http://www.eepw.com.cn/article/201904/400009.htm

      作者/宋岩 恩智浦(中国)管理有限公司 高级系统工程师 (北 京  100022)

  摘要:简要探讨了人工的主要实现方式——,尤其是深度学习应用于的可行性与特点。结合自己的实践,介绍了在这类资源受限的平台上建模的要点、工作流程、配套工具、优化方法,以及实践的例子。笔者认为,在物联时代,也就是AIoT时代的蓬勃发展下,与MCU都在飞速发展,它们的有机结合会与日俱增,大放异彩。

  关键词:MCU;

  虽然在现今的生产生活中,以机器学习和深度学习为主力的人工智能应用已无处不在,但是承载的计算平台绝大多数是具备加速器的服务器、PC,以及智能手机,而在微控制器(MCU)等级的平台上的运用却寥寥无几。究其原因,传统MCU的定位使其在算力和存储资源上捉襟见肘,硬件的限制也导致应用深度学习所需的配套软件和工具几近为0。

  但近年来MCU的资源有着突飞猛进地发展,有代表性的是NXP的i.MX RT1060系列,使用高达600 MHz并且带DSP扩展的Cortex-M7内核,理论整数算力已达1.2 GOPS;片内有1 MB快速内存并且可扩展,已能胜任相当多的机器学习应用。

  同时,由于MCU具有价格低,实时性强等自身的特点,基于MCU的机器学习也要与MCU的应用结合才能相得益彰,一般来说,“轻”是最显著的特征。在这样的背景下,笔者摸索和实践了在MCU上如何应用深度学习,撰文以分享和总结相关的工作。

  1 在MCU上部署机器学习

  1.1 物联网环境下的智能应用分布

  在智能物联环境下,嵌入式系统一般位于网络的,因此在嵌入式系统中的智能也常常被称为轻智能。不过,嵌入式系统也是一个很宽泛的概念,其智能应用在边缘上的分布也各有特色,如图1所示。

  最边缘的是IoT节点与离线节点——也就是传统的嵌入式系统,它们通常使用MCU、DSP以及低功耗的MPU,运行最轻量级的智能模型,可以永远在线。如果位于更复杂系统的前级处理,则完成初步的计算,视情况决定是否唤醒主系统。

  另一类可称为富功能节点与边缘门户,它们使用更加强劲的处理器,或者是带机器学习IP的MCU,能运行更加大型的模型,并常常作为IoT网关。对于复杂度很高的问题,比如语音识别,仍然能调用云端服务来完成。

  近年来,以i.MX RT (600 MHz) 和STM32H7 (400MHz)等为代表的高配置MCU逐渐丰富,模糊了节点与门户的界限,使得产品设计得以更加一脉相承,并且能让开发者以MCU简单易用的方式上手。

1556603946474992.jpg

  1.2 MCU上机器学习应用的特点

  MCU强调降低功耗、节约成本、加快上市,以及实时响应。所以在MCU上一般都要精简AI模型,在精度与算力上合理取舍,改进已有算法的性能。在一些分级响应的大型系统中,可以发挥MCU低功耗的优势,在本地跑轻量级的AI模型,担任永远在线的前级处理。例如 ,语音识别系统的唤醒词检测就可以由MCU来完成。又如,物体识别系统可以先由MCU快速处理,遇到识别困难时再唤醒主系统来判定。

  下面列举了一些适合MCU上部署的AI,为嵌入式系统属性加成的常见场景:

  在强化图像分类性能方面,可用于智能电器、生产线次品检测、智能家居;

  在强化音频分类性能方面,主要用于识别口令关键字;在工业应用方面,可改进电机与传动、电源转换,以及自动控制算法;MCU上AI还适合做异常检测,判断部件损坏、过程稳定性、异常情况的发生。

  1.3 MCU上机器学习应用的难点

  尽管MCU上的AI应用有自己的特色,但目前普及率还比较低。首要的难点就是算力弱,较专业的AI加速器可有成百上千倍的差距。拿AI模型常常需要的乘累加操作性能为例,即使是目前性能最高的MCU,i.MXRT1050/60主频为600 MHz,其M7内核单周期能处理2个16位整数乘累加,其int16算力也只有1.2 GOPS,而目前的AI加速器动辄就是1 TOPS以上的算力。

  因此,我们首先采用先进的模型结构,并谨慎合理地精简模型规模,配合高度优化的底层代码,今后还要结合器件的特色充分利用异构多计算单元。其次,MCU上缺少建模工具,这方面我们可以借助PC/服务器上的建模软件来建模与训练。再次,MCU上缺少集成和部署工具,这方面我们“自己动手,丰衣足食”,下文会详细报告具体的工作。最后,MCU上缺少标准运行环境。这方面,我们通过把模型转换成C代码以及开发执行引擎的方法来填补空白。

  1.4 部署机器学习模型的过程

  MCU的弱算力决定了通常不适合训练模型。因此,整个工作分为在PC端的部分和设备端的部分(如图2)。在PC端要完成建模与训练、模型的转换与量化,以及模型部署的上位机工作,比如把模型与工程合并,以及模型数据的下载等。在设备端则要完成模型部署的下位机部分,主要是把AI模型与其它模块对接,采集模型输入数据并运行模型。

  这里再详细介绍一下模型的部署,这也是连接2个世界的关键环节。对于在上位机上训练好的模型,一个关键的步骤就是转换与量化。这是要根据目标计算平台的硬件和软件接口,把模型做格式的转换、量化(参数由浮点转成整数),并对接到目标平台上的NN库或执行引擎的API,生成可以部署的形式,如图3所示。

  主要有两种方式。


1557132209120155.jpg

1557132209521197.jpg1557132209468092.jpg

  第一种是生成与模型相对应的C/C++代码,它们包括训练出来的权重——用数组表示;模型各层的定义——用宏定义表示;以及模型所执行的操作——包装成一个函数,由它来把模型操作映射成对目标平台NN库API的调用。这样,模型就直接化成了C/C++工程的一部分,一起编译链接到固件中了。这样做的优势是深度整合,效率高、代码小;但进行模型修改的同时需要重新生成固件,非常死板,比较适合较单一的系统。

  另一种是在目标平台上运行通用的模型执行引擎——也叫Inference Engine (IE)。IE接收模型的操作与参数,并调用目标平台NN库中对应的API。而转换工具则把模型的参数和结构转换成IE能识别的方式,再由IE来贯彻执行模型的操作。这样,模型化成了一个文件或者是结构体实例。系统需要调用IE并把模型文件作为数据送给它,由IE解析和执行模型指定的操作。这样,显然更加灵活,模块化。可以存储多个模型文件,改模型无需重新生成固件,只是要承担IE的资源开销,在性能与体积上有所舍弃。

  无论哪一种,神经网络底层库都是关键的一环。在ARM Cortex-M系列MCU上,CMSIS-NN扮演这个角色,并且针对DSP和SIMD指令集高度优化,和基线的标准C实现相比性能提高可达4.5倍。不过它仅提供了神经网络操作的API,需要另行生成上层代码或提供执行引擎才能使用,另外对神经网络建模方式的支持略有不足。而谷歌的TensorFlow-Lite自带的NN库则支持更丰富的神经网络构建块与连接方式,并且是通用的,但是并没有针对Cortex-M优化,性能远远不如CMSIS-NN。

  目前笔者实现了把Keras模型转换成调用CMSIS-NN的C代码以及对应的权重表,得以充分发挥CMSIS-NN在Cortex-M上高性能的优点。把生成的C源文件加入到现有的工程中,即可应用深度学习。

  2 适用于MCU的深度学习建模方式

  深度学习的基础是构建多层神经网络(NN)。神经网络作为深度学习的基础技术,模型表达能力强,尤其是善于处理非结构化的多媒体数据。对于开发者而言,神经网络相比众多机器学习算法,需要的数学基础更少,相对单纯,容易掌握。这些最终使软硬件开发资源也最为丰富。

  搭建适合在MCU端使用的神经网络非常简洁,如图4所示:

  一般只需要3种主运算和对主运算的3种后加工操作。使用这三种基本构建块并且适当处理输出后,形成神经网络的一级运算,也称为一个层。每个层就犹如电路中的一个基本元件,按串联、并联、混联的方式搭建在一起,就能组成强大的神经网络。此外,在训练模型期间,还会加入一些辅助运算,比如批正则化(batchnormalization)、随机丢弃(dropout)等,以提高训练效率。在把模型转换成可供部署的形式时,会去掉或合并它们。

  这其中,普通卷积层(CNN)是最“万能”的。在设计一个新的模型时,常常可以先用若干个卷积层提取特征,如果需要分类,尾部再追加一个全连接层。如果MCU算力强大或存储空间不足,可以把CNN拆分成逐通道卷积(DS-CNN)尾随一个 1x1 CNN,以在相同参数下获取更强的表达能力,或在相同表达能力下节省空间。反之对于算力较弱的MCU,则可适当把CNN替换成全连接层(FC),它们虽然参数多,但算力需求通常远远小于CNN。

  前面提到的层层堆积的方法,好比是穿糖葫芦,它只是构建神经网络最常用最简单的一种,这是微型/小型网络的首选,已能应对大部分MCU上深度学习问题。如果把直筒结构稍加改造,使某层的输出还加到后续几层后,就可以轻松创建容易训练的更深的网络,能胜任更复杂的问题,如人脸识别,以及分辨上百种以上的种类,像用于MobileNet和MobileFaceNet的反向残差连接就是典型的实例。

  早期的神经网络构建块中包含的参数较多,比如卷积核常用5x5,后面创新的结构常常把单个构建块化整为零成一个小型的子网络,既减少了参数又改进了性能。

1557132240936321.jpg

  尽管神经网络的结构很丰富,但整体上看仍然是直筒式的顺序处理结构。在搭建较深的神经网络时,一些片段常常重复出现,于是在设计网络时可以像宏定义一般预制复合结构,再串在一起,这样可以简化设计,并且灵活多用。

  基于以上建模方式,我们在NXP i.MX RT1062上实践了多种模型,表1列出了典型的几种。

  图5展开介绍了10项物体分类所使用的NN结构。

  它是个小型直筒式结构,串了3个普通卷积层,以分级提取出1024个特征,再用一个全连接层来分类。卷积层用于从输入的32x32 RGB图片中分3次提取出特征来,每过一层都通过池化来减少特征,这体现了从前一层精练更高级特征的思想。最后的全连接层有十个输出,每个输出对应了各类物体中每个特征的重要程度。全连接层的运算通过矩阵乘向量的方式呈现,最终得到10个数,决定和每类物体的相似程度。整个网络一共有87.3 k个参数,对M7的乘累加算力需求约为13 MOPs。模型使用8位整数量化,在Cortex-M7上,还需要数据搬运和8位转16位,在无内存访问怠机的情况下,理论算力利用率约42%。在理论乘累加算力为1.2 GOPS的i.MX 1060上,按100% CPU时间全额投入,每次运算需要约26 ms。

  2.1 借助CNN实现语音口令检测

  我们再看一下深度学习在话音口令关键词检测——简称KWS中的应用。为了重用图像处理的神经网络技术,常常先把时域信号分割变换成多个频谱,再拼接成一个灰度图像。鉴于这类图像经常出现比较长的水平线,在应用卷积网络时对卷积核的设计一般也采用较扁的矩形而不再是常见的正方形。顺便一提,另一种循环神经网络,简称RNN,在处理这种前后联系比较丰富的事物时往往更加得心应手,但是目前在MCU上还没有优化支持,而在简单短口令的检测上,CNN系建模方案的效率也能媲美RNN。

  3 小结与未来展望

  MCU自身的综合能力和机器学习的优化会不断升级。比如广泛用于MCU的ARM Cortex-M系列内核,先后加入了SIMD与DSP扩展,半精度浮点数,它们都有助于加速机器学习应用和提高效率;最新又发布的MVE(又称Helium)技术,加入了128位宽矢量运算能力,最高可为机器学习再提速15倍!基于开源RISC-V指令集扩展机器学习加速也正在异军突起。在内核周边,MCU在存储容量、主频,以及多种数据输入接口也在不断升级,这一切为在MCU上部署更多更先进的智能应用提供坚实的支撑。

1557132254253094.jpg

  在基础软件方面,适用于MCU平台的机器学习的库也已经历了从无到有,目前正在从简陋向完善发展。比如, CMSIS-NN目前还只支持CNN、DS-CNN、FC层,今后可能会支持多种RNN;另一方面,支持多种传统机器学习算法的软件包也一定正在路上。


  在生态上,MCU上图像分类、语音口令触发、异常检测这三大应用场景的相关的示例正在不断丰富,模型转换与部署工具也在不断完善,今后用户会得到越来越多的参考资源与开发工具。

  硬件、软件和生态的发展,使MCU在工业、控制与物联传感领域中的智能化大显身手的同时,也会渐渐胜任更多实时图像处理和语音数据智能应用。智能物联时代正滚滚而来,在功能安全(safety)与信息安全(security)的保障下,基于机器学习的边缘轻型智能越发成为嵌入式系统创造新价值的关键,而MCU硬件和固件就责无旁贷地成为了承载智能物联应用的主力军。

  作者简介

  宋岩 :MCU高级系统工程师,有近15年MCU与嵌入式系统从业经验,近期专注于微控制器在人工智能、机器视觉以及高级语言开发等方面的开发资源与应用。

本文来源于科技期刊《电子产品世界》2019年第5期第页,欢迎您写论文时引用,并注明出处



评论


相关推荐

技术专区

关闭