所谓全场景AI,是指可以将深度学习技术快速应用在云边端不同场景下的硬件设备上,包括云服务器、移动终端以及IoT设备等等,高效运行并能有效协同。
对于框架而言,涉及三大挑战:快速部署、高效运行、端云协同。
如何将训练好的模型快速地部署到云服务器、移动终端以及各种IoT设备上进行推理甚至增量训练?
云服务器上推理通常以Service的方式进行部署,训练好的模型直接通过远程接口调用(gRPC/REST)推送到云服务器上,用户调用云推理服务接口进行推理。
对于移动终端和IoT设备,由于硬件资源限制,云侧的模型和推理运行框架体积太大,无法直接部署,因此模型的压缩和运行框架的轻量化成为移动终端和IoT设备上部署的关键。
面向移动终端和IoT设备轻量化的挑战,提供独立的轻量化的端侧AI框架是比较好的解决方案,同时这样的轻量化框架可能还不止一种形态,比如类似于智能手机这些富终端和类似耳环这些瘦终端面临的挑战就不一样,富终端一般存储空间还是比较充裕的,有一定的算力;瘦终端的条件则要苛刻的多,底噪要求控制在百K级别,这样你就不能放一个运行时进去,同时还要考虑给AI开发者一个通用的解决方案。
有了轻量化的端侧框架以及好的模型压缩转换技术是否就可以实现快速部署的目的?其实还有问题,因为如果我们端侧的架构与云侧的架构是分离的、实现是不一致的,如模型的IR不同、算子的定义不同、推理的API接口不同,那很可能导致云侧训练的模型无法顺利的转换到端侧去执行,云侧的推理代码无法在端侧重用。
一般框架的从云侧训练模型到端侧部署的流程如下:
第一个问题:两套模型定义很难保持一致,比如云侧和端侧的算子经常会出现一方缺失的问题,导致模型转换失败。
第二个问题:云和端都需要的功能会重复开发,并可能有不一致,比如为了提升推理性能而进行的fusion优化需要端云两边都做一遍,数据处理的不一致导致精度问题等。
第三个问题:云侧训练好的模型在端侧进行在线训练需要相对复杂的转换。
对于分离的端云框架的不一致问题,是否可以通过如ONNX这样的标准去解决?很难,原因在于,AI产业的快速发展,新的算子类型快速涌现,标准实际上很难跟得上,所以解决的途径还是应该着落在AI框架上。
全场景的高效运行,分解下来就是高效的算子、高效的运行时以及高效的模型,实现异构硬件的最大算力,提升AI算法的运行性能和能效比。
算子的性能,需要从算法和底层指令优化多个层面进行优化。比如卷积,Winograd算法相比于Im2Col+GEMM,在很多经典卷积神经网络上性能就有很好的性能提升。
但是,并不是所有的场景下Winograd的算法都优于Im2Col+GEMM。在下面的图中,当shape为224x224x3x64时,Winograd的性能反而有所恶化。因此,在不同条件下选择最优的算法对性能至关重要。
算法层面的优化,更多的是通过减少运行时的计算次数(乘法)来提升性能,而指令层面的优化则是为了更充分的利用硬件的算力。对于CPU硬件,影响指令执行速度的关键因素包括了L1/L2缓存的命中率以及指令的流水,通用的优化方法有:
-
-
寄存器的合理分配,将寄存器按照用途,可以划分为feature map寄存器、权重寄存器和输出寄存器,寄存器的合理分配可以减少数据加载的次数。
-
数据的预存取,通过prefetch/preload等指令,可以提前将数据读到cache中。
-
指令重排,尽量减少指令的pipeline stall。
-
向量化计算,使用SIMD指令,如ARM NEON指令,X86 SSE/AVX指令等。
端侧运行时的性能主要面临异构和异步并行的挑战,从模型角度看,大部分模型在推理的时候看上去是串行执行的,不过如果把算子内部打开,变成细粒度的kernel,整体执行流还是一个dataflow的图,存在不少异步并行的机会,同时端侧存在大量的异构设备,如果一个模型在执行的时候使用多种类型的设备,中间也存在不同的流水线。
模型的性能,主要还是靠离线的优化和tuning,这一块业界也已经许多实践了,总的思路主要是规则化的融合pass和离线的算子tuning结合。
端云协同主要涉及三块:云侧训练-端侧推理、云侧训练-端侧增量训练-端侧推理、云/端的联邦学习
云侧训练-端侧推理,重点需要解决怎么生成最适合端侧的模型,包括模型压缩和自适应模型生成。模型压缩技术我们前面已经做了介绍。对于神经网络自动搜索(NAS),通常被用来生成满足一定限制条件(例如,微控制器上极致的内存限制)的模型,NAS技术最大的问题在于如何缩短搜索模型的时间。
云侧训练-端侧增量训练,重点需要解决云和端的模型高效转换的问题,这个前面章节已经介绍。
联邦学习,目前业界主要有两个技术流派,一个是横向联邦学习,数据上进行聚合,典型的应用场景是,移动设备上的隐私保护问题,像广告等场景需要建立数百万移动设备之间的联邦模型,避免用户隐私数据上传到数据中心。第二个是纵向联邦学习,维度上进行聚合,比较看重跨机构跨组织大数据合作场景,尤其是银行金融场景的数据安全和隐私保护问题。
联邦学习在技术上还有许多挑战,比如跨设备的系统异构以及算法迭代过程中的通信,将会影响最终联邦聚合的效率和精度;联邦学习的过程中的模型加密方法,因为即使通过权重也可以推测出部分隐私信息,以及客户端的投毒攻击、对抗样本等;另外一个挑战主要是架构上的,目前联邦学习还没有一个统一的架构,同时支持横向联邦学习和纵向联邦学习。
MindSpore在框架的设计上进行了分层设计,将端云共用的数据结构和模块解耦出来,在满足端侧轻量化的同时,保持了端云架构的一致性,真正实现一次训练无缝部署、端云训练共模型。
MindSpore core的统一IR,保证了端云模型/算子定义的一致性,使得云侧训练的模型可以无缝的部署在端侧。同时,对于端侧训练,可以和云侧使用一致的IR进行模型的重训。
统一IR定义了模型的逻辑结构和算子的属性,并且与模型的持久化是解耦的。开源项目中用于持久化数据的方式,使用最为广泛的,就是protobuffer和flatbuffer。两者相比,protobuffer功能更为强大,使用也更加的灵活,但是相应的,也更加的重量级。flatbuffer更加的轻,反序列化的速度也更快。MindSpore将统一IR的逻辑数据持久化成不同的物理形式,云侧持久化成protobuffer格式,端侧持久化成flatbuffer,兼顾了数据的一致性与部署的轻量化。
为了提升性能,训练好的模型在执行推理前,需要提前做一些优化手段,这些优化包括了融合、常量折叠、数据排布的调整等等。对于端云共享的优化,同样也是包含在MindSpore core模块中,只不过对于云侧推理,这些优化是在线推理时去执行的,而对于移动终端这些优化在执行推理前离线完成。
MindSpore设计了提供端云统一的C++接口。统一的C++接口的用法尽量与Python接口保持了一致,降低了学习成本。通过统一接口,用户可以使用一套代码在不同的硬件上进行推理。
相比于移动终端,IoT设备MCU芯片资源更加的有限,因此,如何在IoT设备上部署深度学习模型将更具有挑战。
上面的表中,左边表示了云、手机、MCU上内存和存储的大小,右边表示了ResNet-50、MobileNet-V2、int8量化的MobileNetV2占用的存储和内存。
针对IoT设备,MindSpore设计了MindSpore for micro的方案。
部署在云服务器和移动终端上的推理框架,通过模型解释的方式来进行推理,这样的方式可以支持多个模型以及跨硬件平台,但是需要额外的运行时内存(MCU中最昂贵的资源)来存储元信息(例如模型结构参数)。MindSpore for micro的CodeGen方式,将模型中的算子序列从运行时卸载到编译时,并且仅生成将模型执行的代码。它不仅避免了运行时解释的时间,而且还释放了内存使用量,以允许更大的模型运行。这样生成的二进制大小很轻,因此具有很高的存储效率。
MindSpore for micro的特性将会在1.2的版本中开源。
MindSpore自适应混合低比特量化技术:根据模型结构和目标压缩率自动搜索出对应层量化bit数,无需量化专家深度参与。量化因子可训练,在低比特量化场景下可极大提升训练效率和减少量化损失。在图像分类/目标检测模型上验证压缩8~10倍场景下,精度优于当前业界量化算法。
MindSpore训练后量化技术:训练后量化相较于量化重训具有两个明显优势,一是无需大量训练数据集,二是无需重新训练,离线快速转换。MindSpore采用pipeline组合量化方法,一阶段采用常规线性量化手段对权重和激活值进行量化,二阶段对量化误差进行分析,利用统计学方法对量化模型进行校正,补偿因量化带来的精度损失。
为了能够为端云的训练、推理提供统一的并行运行框架,MindSpore设计了基于Actor模型的端云统一运行时。
AI训练或者推理,最终都是执行一个DAG计算图,图中每个节点都是一个op,每条边都是一个(或一组)tensor。下面的图中,左边是actor模型的示意图,右边是一个AI计算任务示意图。
我们将一个op定义为一个actor,actor之间传递tensor。在actor模型中,message是无状态的且不复用的,但在AI计算任务中,为了提高效率,tensor通常会被复用。为了解决这个问题,MindRT中引入了tensor manager来统一管理tensor,所有op通过tensor manager获取tensor。
Tensor Manager支持tensor的引用计数和内存管理。
端云统一运行时将在MindSpore 1.2/1.3版本中开源。
MindSpore原生与端侧的NPU芯片深度结合,最大程度的发挥了专有芯片的性能优势。
在手机CPU上,MindSpore支持了多种卷积算法:Sliding Window、Im2Col+GEMM、Strassen、Winograd、Indirect Convolution、FFT等。如何在不同的条件下选择最优的卷积算法,通常有3种做法:
-
-
-
通过机器学习算法模型,使用已有数据集对其进行离线训练,最终得到一个可靠的卷积算子选择器
目前,MindSpore支持了2和3两种方式来进行最优卷积算法的选择。
算法的选择,除了考虑性能,还需要考虑特定场景下的内存限制。例如,对于IoT场景的硬件设备,如果选择最为常见的Im2Col+GEMM算法,计算过程需要将输入和卷积核在内存中拉平,占内存较大。MindSpore针对这种场景,选择占用内存较少的Indirect Convolution算法。
MindSpore的联邦学习方法,同时支持cross-device(ToC)和cross-silo(ToB)两种场景,在数据不出域的条件下,实现多方联合建模,以帮助企业应用提效降本,助力不同行业智慧升级。在安全性方面,MindSpore提供多种模型加密方式,可以适用于大规模无状态的终端设备,包括差分隐私、秘密共享、安全聚合等,用户可自定义安全等级。
了解完MindSpore的AI框架的几大优势,赶紧【点击链接】并【立即报名】,即可在 ModelArts 平台学习到一个经典案例掌握基于MindSpore的深度学习!
(完)