全面了解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模型。相信能给开发者调试模型,尤其是一些结构复杂的模型,带来极大的方便。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/900297.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Docker入门之构建

Docker构建概述 Docker Build 实现了客户端-服务器架构,其中: 客户端:Buildx 是用于运行和管理构建的客户端和用户界面。服务器:BuildKit 是处理构建执行的服务器或构建器。 当您调用构建时,Buildx 客户端会向 Bui…

【纯血鸿蒙】安装hdc工具

这里我先写Mac版的,Windows的在下面 首先要知道你的SDK安装在哪里了,不知道的话,可以打开DevEco Studio,打开设置页面里的HarmonyOS SDK,这个我们之前配置环境变量的时候用过。 其实主要是用到这里toolchains下的hdc命令。 所以我们需要配置环境变量。 1、打开Mac下的…

RabbitMQ是一个开源的消息代理和队列服务器

RabbitMQ是一个开源的消息代理和队列服务器,它基于AMQP(Advanced Message Queuing Protocol,高级消息队列协议)协议实现,同时也支持其他消息协议如STOMP、MQTT等。作为一个可靠的消息传递服务,RabbitMQ在分…

Nginx+Tomcat 动静分离

1. NginxTomcat 环境 Nginx 处理静态资源的优势同样可以应用在 Tomcat 环境中 。从实现方法上来说,NginxTomcat 环境的搭建思路与前面完成的 NginxApache 环境是完全相同的,只需要将 Nginx 与 Tomcat 的站点文档目录配置到同一目录下,利用 N…

Python 打包成 EXE 的方法详解

#1024程序员节|征文# 日常开发中,python由于其便捷性成为了很多人的首选语言,但是python的环境配置也是有点麻烦的,那么我们如何让其变得更加友好呢?没错,就是打包成exe可执行文件。 一、PyInstaller 简介…

在使用 RabbitMQ 作为消息代理时,多个 Celery 实例(或应用)可以共享同一个 RabbitMQ 实例

在使用 RabbitMQ 作为消息代理时,多个 Celery 实例(或应用)可以共享同一个 RabbitMQ 实例。这样做可以简化基础设施管理,同时允许不同的 Celery 应用之间进行消息传递和协作。下面是如何配置多个 Celery 实例以使用同一个 RabbitM…

鸿蒙到底是不是纯血?到底能不能走向世界?

关注卢松松,会经常给你分享一些我的经验和观点。 2016年5月鸿蒙系统开始立项。 2018年美国开始经济战争,其中一项就是制裁华为,不让华为用安卓。 2019年8月9日华为正式发布鸿蒙系统。问题就出在这里,大家可以仔细看。 安卓一…

Java之bean操作【复制】

#1024程序员节 | 征文# 文章目录 一、深拷贝二、不为空拷贝三、List转换 1024 祝各位大佬 节日快乐&#xff01; 在Java项目开发中&#xff0c;对Java对象操作如bean复制等&#xff0c;可使用 一、深拷贝 private static final Map<String, BeanCopier> BEAN_COPIER_M…

【忍无可忍,无需再忍】永久解决xshell or xftp 更新问题

1 背景介绍 提示“要继续使用此程序,您必须应用最新的更新或使用新版本”&#xff0c;笔者版本是xshell 6 距离一段时间不使用&#xff0c;或者遇到更新场景&#xff0c;总是会弹出这个框&#xff0c;实在是忍无可忍&#xff0c;无需再忍。 2 思路介绍 笔者上一篇关于如何解…

No.21 笔记 | WEB安全 - 任意文件绕过详解 part 3

&#xff08;一&#xff09;空格绕过 原理 Windows系统将文件名中的空格视为空&#xff0c;但程序检测代码无法自动删除空格&#xff0c;使攻击者可借此绕过黑名单限制。基于黑名单验证的代码分析 代码未对上传文件的文件名进行去空格处理&#xff0c;存在安全隐患。相关代码逻…

24.redis高性能

Redis的单线程和高性能 Redis是单线程吗&#xff1f; Redis 的单线程主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的&#xff0c;这也是 Redis 对外 提供键值存储服务的主要流程。 Redis 的多线程部分&#xff0c;比如持久化、异步删除、集群数据同步等&#xff…

C# 委托简述

1.委托 1.1什么是委托 委托委托 官网解释: 委托是安全封装方法的类型&#xff0c;类似于 C 和 C 中的函数指针。 与 C 函数指针不同的是&#xff0c;委托是面向对象的、类型安全的和可靠的。 委托的类型由委托的名称确定。 个人理解:委托就是一个方法的模板。它可以接收…

关于bp抓不到本地包

关于bp抓不到本地包 关于bp抓不到本地包 关于bp抓不到本地包 pikachu练习时&#xff0c;发现用bp抓本地&#xff08;127.0.0.1&#xff09;数据包时&#xff0c;竟然直接放行访问。 是因为系统默认127.0.0.1无法使用代理&#xff0c;因此bp才抓不到本地数据包&#xff0c;需要…

Python入门:Python如何强制终止程序(如何强制终止多线程程序)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 文章内容 📒📝 优雅的退出📝 强制的终止📝 应用场景对比🚀 优雅的退出🚀 强制的终止⚓️ 相关链接 ⚓️📖 介绍 📖 在开发过程中,有时候需要在满足一些条件的情况下让程序强制终止运行?今天我们将了解一下 Py…

Apifox「定时任务」进阶指南:监控、爬虫的自动化之旅

定时任务能干啥&#xff1f;&#xff1f;&#xff1f; 它能做的自动化操作实在太多了。先给大家列几个常见的&#xff0c;比如&#xff1a; 社交媒体动态监控&#xff1a;定时跟踪特定用户的动态&#xff0c;监控热门话题和趋势 数据采集与分析&#xff1a;定时爬取网站的文章…

机器学习学习笔记-20241018

继续跟着小土堆去学习机器学习 文章目录 Flatten1. Flatten 的作用2. 何时使用 Flatten3. PyTorch 中的 Flatten Sequentia优化器模型的保存与加载模型的完整训练 Flatten 在神经网络中&#xff0c;Flatten 操作是将高维的输入&#xff08;如二维图像或三维特征图&#xff09…

ArcGIS 10.8 安装教程

目录 一、ArcGIS10.8二、安装链接三、安装教程四、ArcGIS实战 &#xff08;一&#xff09;ArcGIS10.8 1. 概述 ArcGIS 10.8是由美国Esri公司开发的GIS平台&#xff0c;用于处理、分析、显示和管理地理数据&#xff0c;并实现数据共享。它具有新特性和功能&#xff0c;性能更…

C++ 设计模式 - 每日持续更新中

设计模式的核心 - 隔离程序的变化点和稳定点 零&#xff1a;面向对象设计八大原则 ①&#xff1a;依赖倒置(Dependency Inversion Principle) 高层模块不应依赖于低层模块&#xff0c;二者都应依赖于抽象&#xff1a;这意味着程序的高层逻辑不应该直接依赖于具体实现&#xf…

探索 SVG 创作新维度:svgwrite 库揭秘

文章目录 **探索 SVG 创作新维度&#xff1a;svgwrite 库揭秘**背景介绍库简介安装指南基础函数使用实战场景常见问题与解决方案总结 探索 SVG 创作新维度&#xff1a;svgwrite 库揭秘 背景介绍 在数字艺术和网页设计领域&#xff0c;SVG&#xff08;Scalable Vector Graphic…

QT:MaintenanceTool 模块安装工具

QT的MaintenanceTool 工具对已安装的 Qt 进行卸载、修复等其他操作时提示At least one valid and enabled repository required for this action to succeed 解决方式&#xff1a;在设置中添加一个临时的仓库 https://mirrors.tuna.tsinghua.edu.cn/qt/online/qtsdkrepositor…