当前位置: 首页 > article >正文

全面了解MindSporeLite轻量化推理工具(概念版)

一、参考资料

技术干货|极速、极智、极简的昇思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进行图优化,包括GHLOGLLO量化三部分。其中,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. 支持端侧训练

由于使用公共数据集训练的模型与真实用户场景存在一定的偏差,比如人脸识别、语音识别等场景,往往需要利用本地数据对预训练模型进行微调,从而提高本地模型推理的精度,改善用户体验。

在这里插入图片描述

  1. 支持30+反向算子,提供SGD、ADAM等常见优化器及CrossEntropy/SparsCrossEntropy/MSE等损失函数;既可从零训练模型,也可指定特定网络层微调,达到迁移学习目的;

  2. 已支持LeNet/AlexNet/ResNet/MobileNetV1/V2/V3和EffectiveNet等网络训练,提供完整的模型加载,转换和训练脚本,方便用户使用和调测;

  3. MindSpore云侧训练和端侧训练实现无缝对接,云侧模型可直接加载到端侧进行训练;

  4. 支持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 TuningOpenCL 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 OpenVINOMNN在几个经典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模型。相信能给开发者调试模型,尤其是一些结构复杂的模型,带来极大的方便。


http://www.kler.cn/news/364797.html

相关文章:

  • 家用wifi的ip地址固定吗?换wifi就是换ip地址吗
  • [C++进阶数据结构]红黑树(半成品)
  • 【基于WireGuard搭建公司服务器虚拟专用通道服务】
  • C#探索之路基础夯实篇(6):C#在Unity中的自定义特性
  • 面经之一:Synchronized与ReentrantLock区别
  • 【mysql进阶】2-4. mysql 系统库
  • 企业内部知识库管理系统,nlp,知识图谱,全文检索的知识库源码
  • 数据挖掘:基于电力知识图谱的客户画像构建实施方案
  • Python os模块详解
  • 开源运维软件适用性评估:多维度视角下的理性选择
  • 【python_修改PPT中字体,run.font.name只对英文生效怎么办?】
  • 告别繁琐操作!一文教你轻松做出高效报表
  • ETCD未授权访问风险基于角色认证和启用https的ca证书修复方案
  • Vue学习笔记(二、Vue.js的引入与对象创建)
  • 【MATLAB代码】FFT计算频率
  • Golang | Leetcode Golang题解之第493题翻转对
  • 使用 PyTorch 构建 LSTM 股票价格预测模型
  • 海外发稿:大舍传媒-媒体宣发Vents Magazine女性杂志展现独特魅力与价值
  • Windows里python报错:ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1+
  • Kafka 为什么要抛弃 Zookeeper?
  • 政安晨【零基础玩转各类开源AI项目】基于本地Ubuntu (Linux ) 系统应用Gradio-Lite:无服务器 Gradio 完全在浏览器中运行
  • 统一多模态大模型!PUMA:多粒度策略笑傲图像生成、编辑、修复、着色和条件图像生成和理解六大任务
  • 正则表达式快速入门
  • 【Orange Pi 5 Linux 5.x 内核编程】-字符设备文件与创建
  • C++中extern的作用(面试)
  • 【网络安全】护网蓝队之应急响应