一、参考资料
技术干货|极速、极智、极简的昇思MindSpore Lite:助力华为Watch更加智能
二、相关概念
MCU
MCU的全称是Microcontroller Unit,中文可以称为微控制器或者单片机。MCU既可用于汽车电子、工业控制等领域,也可应用于小型和低功耗设备中。全球有数十亿台物联网(IOT)设备,大到扫地机器人、微波炉、音箱,小到手表、手环、电动牙刷等,都离不开MCU。MCU不仅承担计算任务,还可扩展接入众多外设,比如按键、麦克风、扬声器、摄像头和传感器等,实现与周围环境的互动。即便五年前,大部分MCU小型设备都不具备智能能力。
近几年,随着深度神经网络技术的快速发展,出现了TinyML的细分领域。**TinyML(微型机器学习)**是指机器学习或者深度学习应用于微型设备上的场景。简单来说,它是指在MCU设备上进行AI模型训练和推理。有了TinyML,再小的设备也可以具备智能化,而无需依赖昂贵的硬件或者可靠的互联网传输。TinyML的另一项优势是隐私保护,所有操作均在本地完成,无需向云侧发送任何数据。
智能手表是华为消费者业务除手机外另一个重要的产品,也是典型的MCU设备。华为在2015年发布了第一款智能手表。前两代手表自发布后,经常收到用户反馈在抬腕亮屏这个功能上体验不佳,比如亮屏时延较大、概率性不亮屏和误亮等,这些问题也间接造成了手表续航时间的减少,对华为品牌声誉造成影响。造成该问题长期存在的原因很多,比如早期使用的是传统算法(非深度学习);使用了友商的推理框架,由于该框架没有对MCU设备进行优化,导致程序的ROM和RAM占用均较高,这对于资源受限的MCU设备来说,无疑雪上加箱。另外,该框架算子计算性能不佳,导致推理时延也比较大,最终导致亮屏时延较大。
三、MindSporeLite相关介绍
1. 概述
2020年,华为自研的深度学习框架MindSpore正式对外开源。作为一款优秀的全场景AI框架,MindSpore也提供对TinyML模型端到端的部署能力。MindSpore训练框架可以让用户快速入门AI应用,简单高效地训练出自己专属的AI模型。而MindSpore Lite for Micro作为一款超轻量AI推理引擎,让用户轻松部署自己的TinyML模型。MindSpore Lite for Micro核心理念是“模型即代码”,会根据目标硬件的CPU体系结构、内存状况,以低功耗、高性能和无第三方依赖为优化目标,为每个模型生成专属的高效推理代码。
该方案分为Host和Device两个阶段。在Host阶段,我们会对AI模型进行各种算子转换和图优化操作,大幅缩减冗余计算,力求在目标硬件上达到最优推理性能。这里的模型不单指MindSpore的模型,还支持其他主流模型格式接入,比如TF、TFLITE、ONNX和CAFFE等。我们还支持训练后量化,实现模型更小、推理更快。Device阶段,用户需要将生成的目标源代码进行交叉编译,部署到目标硬件上。我们生成代码的同时,配套提供了CMake的构建工程,大大方便了用户集成。
2021年6月2日,HarmonyOS及华为全场景新品发布会上,作为华为旗舰智能腕表的WATCH 3正式发布。该款产品内置了我们MindSpore Lite for Micro超轻量AI引擎,实现了误亮屏减少50%、超长续航模式下续航提升1.2天、ROM和RAM占用均大幅减少的优秀成绩,取得了不俗的市场评价和用户口碑。在解决长期困扰手表用户的抬腕亮屏问题背后,是MindSpore Lite for Micro针对MCU设备的精准定位。首先,它在模型小型化上做到极致,通过模型优化和代码裁剪大幅降低代码量,从而降低ROM的空间占用。其次,它通过代码优化提升内存块复用,从而减少RAM空间占用。最后,基于开源CMSIS-NN算子库进行卷积类算子优化,进一步提升性能,降低时延。
2. 架构图
MindSpore端云协同全场景
MindSporeLite架构图
3. 架构分析
MindSpore Lite整体架构介绍
总体架构
Frontend前端
负责模型转换,用户可以通过模型构建接口构建模型,将第三方模型和MindSpore训练的模型转换为MindSpore Lite模型,其中第三方模型包括TensorFlow Lite、Caffe和ONNX模型。
MindIR模块
复杂而Tensor定义、算子定义、图定义。
Backend后端
基于IR进行图优化,包括GHLO、GLLO和量化三部分。其中,GHLO负责和硬件无关的优化,如算子融合、常量折叠等;GLLO负责与硬件相关的优化;量化Quantizer支持权重量化、激活值量化等训练后量化手段。
Micro模块
IOT设备运行时,包括模型生成.c文件、线程池、内存复用、算子库。
Lite RT模块
Lite RT(Runtime), 智能终端的推理运行时,其中session负责会话管理,提供对外接口;线程池和并行原语负责图执行使用的线程池管理,内存分配负责图执行中各个算子的内存复用,算子库提供CPU、GPU和NPU算子。
注意:Lite RT和Micro共享底层的算子库、内存分配、线程池、并行原语等基础设施层。
4. MindSporeLite特性
极致性能
高效的内核算法和汇编级优化,支持CPU、GPU、NPU异构调度,最大化发挥硬件算力,最小化推理时延和功耗。
轻量化
提供超轻量化的解决方案,支持模型量化压缩,模型更小跑得更快,使能AI模型极限环境下的部署执行。
全场景支持
支持IOS、Android、HarmonyOS等手机操作系统以及LiteOS嵌入式操作系统,支持手机、大屏、平板、IOT等各种智能设备上的AI应用。
高效部署
支持MindSpore/TensorFlow Lite/Caffe/ONNX模型,提供模型压缩、数据处理等能力,统一训练和推理IR,方便用户快速部署。
5. FP16推理
MindSporeLite全面支持ARMv8.2的FP16推理,推理时延基本达到FP32推理的二分之一,FP16推理方案已经在华为HMS MLKit和华为手机预置的各类AI服务中普遍应用。
6. Int8量化
对于量化算子,MindSporeLite实现在算法层面加入如Convolution Kernel为3x3的Winograd优化算法(目前主要针对非ARMv8.2机型),在支持ARMv8.2的高端机型上使用SDOT指令对MatMul、Full Connection、Convolution等算子进行优化,以及提高底层缓存命中率的一系列优化策略。使用TF Hub官方预置的量化模型,测试证明:MNN存在大量量化模型无法转换问题,TF Lite对自家模型也存在转换问题。
7. 硬件支持
横向方面(复杂的异构芯片)做的更广,纵向方面(支持FP32、FP16、INT8、UINT8)做的更深。
MindSporeLite支持ARM CPU、ARM GPU、X86 CPU、Kirin NPU、MTK APU多种硬件平台。
8. 软硬件异构加速
卷积计算适合在NPU上运行,resize、图像插值适合在GPU上并行运算。针对不同的算子或者不同的芯片异构,会将算子放到不同的地方处理。
9. 支持端侧训练
由于使用公共数据集训练的模型与真实用户场景存在一定的偏差,比如人脸识别、语音识别等场景,往往需要利用本地数据对预训练模型进行微调,从而提高本地模型推理的精度,改善用户体验。
-
支持30+反向算子,提供SGD、ADAM等常见优化器及CrossEntropy/SparsCrossEntropy/MSE等损失函数;既可从零训练模型,也可指定特定网络层微调,达到迁移学习目的;
-
已支持LeNet/AlexNet/ResNet/MobileNetV1/V2/V3和EffectiveNet等网络训练,提供完整的模型加载,转换和训练脚本,方便用户使用和调测;
-
MindSpore云侧训练和端侧训练实现无缝对接,云侧模型可直接加载到端侧进行训练;
-
支持checkpoint机制,训练过程异常中断后可快速恢复继续训练;
四、MindSporeLite优化
超轻量AI引擎MindSpore Lite
MindSporeLite为AI模型推理提供高性能和超轻量的解决方案:通过高效的内核算法和编译级优化,以及CPU、GPU、NPU的异构调度,可以充分发挥硬件算力,实现最小化推理时延和功耗;提供模型量化压缩技术,采用训练后量化(Post-Training Quantization,PTQ),无需数据集即可直接将权重数据从浮点型映射到低比特的定点数据,有效降低模型的大小,助力AI模型在资源受限环境下的部署执行。
1. 性能优化
支持ARM CPU(FP16/FP32/INT8)性能优化,ARM GPU推理性能大幅提升。同时为了更好的支持PC侧推理,在X86_64算子方面做了大量汇编层面的优化。
2. ARM CPU优化
引入减少计算量的更优算法,尽可能减少硬件访存,提高指令吞吐量。
MindSporeLite是目前端侧推理框架中CPU算子支持最丰富的框架之一,模型转换工具支持TF Lite(100个)、TF(53个)、ONNX(96个)、Caffe(26个)等第三方框架算子定义的解析,做到了高兼容性。同时,MindSporeLite实现了121个FP32,55个FP16以及71个INT8 CPU算子。MindSporeLite1.1版本对控制流算子进行了一次大的调整和完善,以便更好支持语音类模型。
3. ARM GPU优化
MindSporeLite重点优化了GPU推理性能,除了在算子层面进行常规优化外,还支持在线融合、Auto Tuning、OpenCL Kernel二进制cache机制等多种优化方式,使得整体性能有显著提升。
实验证明,同样在华为Mate30上使用TF Hub官方100+预置模型与MNN(1.1版本)和TF(2.4版本),进行GPU推理性能对比测试,测试结果显示:MindSporeLite在GPU推理性能大部分模型上优化TF Lite,而对MNN则优势明显。
基本实现常用CV类网络覆盖,支持权重量化,实现8bit权重量化网络在GPU整网运行。
4. Kirin NPU优化
支持华为麒麟NPU硬件平台,支持大部分CV类模型在NPU上的加速运行。
5. X86_64 CPU优化
在Intel Core i7-8700的CPU上与Intel OpenVINO和MNN在几个经典CV类网络上进行benchmark测试,从测试结果看MindSporeLite性能比MNN和OpenVINO都有一定优势。
6. 自动图优化
MindSpore云测和端侧共用一个IR,从而做到了端云统一。同时,部分的云测图优化会复用到端侧,而端侧实现了一个自动的图优化。
自动图优化,包括:算子融合、算子替换、算子前移三种不同方式,来大幅减少冗余计算。在训练阶段,conv卷积、BN、activation激活三个算子不能融合在一块,因为activation激活算子有自己对应的反向算子,每一层的算子都有自己对应的反向算子,对其进行梯度求解的时候,不能够进行融合。但是,在推理阶段,为了更好的减少冗余算子,公式中每一个计算都会有一个输入和输出,为了避免输入和输出不断的在内存里调度(搬运),所以把conv卷积、BN、activation激活统一融合为conv卷积算子,减少内存的读写和计算量,这就是算子融合。
7. 算子-指令级深度调优
在MindSpore开始研发阶段,第一个版本不是手写指令集去实现算子的,而是用TVM去实现的,但TVM在不同手机上测试,发现TVM的性能并不高。于是MindSpore团队开始自己去实现指令集,去实现不同的算子。
以conv卷积算子为例,先实现最常用、最简单的ConvCommon算子,后来实现完这个算子之后,发现在3x3卷积算子的Winograd算法运行的效率更高,于是有了Winograd算子。后来,在实现kernel 1x1的conv算子的时候发现,当卷积核W和H都是1的时候,可以用Strassen算法实现的效率更高。
总结:在整个版本的演进迭代当中,演化了非常多的不同的卷积算法,而针对不同的卷积算法,使用了硬件指令集去优化,包括SIMD指令、指令流水Tiling、Cache优化等,通过不同的优化方法,让AI模型跑得更快。
8. 算子融合
当前MindSporeLite版本已经基本覆盖了CV领域通用的卷积相关融合pattern,同时针对基于Transformer结构的语言模型和LSTM结构的模型进行了深度融合优化,主要包括将小算子融合成Layernorm、LSTM等大算子,多个MatMul融合成BatchMatMul算子,Slice算子切分矩阵的前移融合等,使得语音类模型获得20%+提升。
换句话说,MindSporeLite对Transformer、LSTM结构的模型优化效果不佳,有待提升。
9. 易用性增强
加速库自动裁剪工具
为了满足部分对发布包大小有极致小型化诉求的场景,提供了一个一键式裁剪工具,该工具可以根据用户指定的模型列表,自动裁剪出足以运行列表中指定模型的最小化MindSpore Lite版本。
离线工具参数精简
对离线转换工具参数进行了精简,最大程度地提高转换工具的易用性,让开发者在转换三方模型时,无需感知三方模型的量化类型、输入输出节点名称和对应的数据类型等。
支持Java接口
1.1版本正式开放了Java接口,以方便安卓开发者更简单的使用MindSpore Lite进行应用开发。
模型可视化
为了方便开发者调试,在Netron开源社区提交了支持MindSpore Lite模型可视化的代码,现在开发者可以使用Netron工具可视化MindSpore Lite模型。相信能给开发者调试模型,尤其是一些结构复杂的模型,带来极大的方便。