摘要:所谓全场景 AI,是指可以将深度学习技术快速应用在云边端不同场景下的硬件设备上,包括云服务器、移动终端以及 IoT 设备等等,高效运行并能有效协同。
本文分享自华为云社区《AI框架的挑战与MindSpore的解决思路》,原文作者:HWCloudAI 。
全场景统一 AI 框架的挑战
所谓全场景 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 缓存的命中率以及指令的流水,通用的优化方法有:
1. 选择合理数据排布,如 NHWC、NC4HW4 等等。
2. 寄存器的合理分配,将寄存器按照用途,可以划分为 feature map 寄存器、权重寄存器和输出寄存器,寄存器的合理分配可以减少数据加载的次数。
3. 数据的预存取,通过 prefetch/preload 等指令,可以提前将数据读到 cache 中。
4. 指令重排,尽量减少指令的 pipeline stall。
5. 向量化计算,使用 SIMD 指令,如 ARM NEON 指令,X86 SSE/AVX 指令等。
这些优化需要对硬件架构有深入的了解。
端侧运行时的性能主要面临异构和异步并行的挑战,从模型角度看,大部分模型在推理的时候看上去是串行执行的,不过如果把算子内部打开,变成细粒度的 kernel,整体执行流还是一个 dataflow 的图,存在不少异步并行的机会,同时端侧存在大量的异构设备,如果一个模型在执行的时候使用多种类型的设备,中间也存在不同的流水线。
模型的性能,主要还是靠离线的优化和 tuning,这一块业界也已经许多实践了,总的思路主要是规则化的融合 pass 和离线的算子 tuning 结合。
- 端云协同
端云协同主要涉及三块:云侧训练-端侧推理、云侧训练-端侧增量训练-端侧推理、云/端的联邦学习
云侧训练-端侧推理,重点需要解决怎么生成最适合端侧的模型,包括模型压缩和自适应模型生成。模型压缩技术我们前面已经做了介绍。对于神经网络自动搜索(NAS),通常被用来生成满足一定限制条件(例如,微控制器上极致的内存限制)的模型,NAS 技术最大的问题在于如何缩短搜索模型的时间。
云侧训练-端侧增量训练,重点需要解决云和端的模型高效转换的问题,这个前面章节已经介绍。
联邦学习,目前业界主要有两个技术流派,一个是横向联邦学习,数据上进行聚合,典型的应用场景是,移动设备上的隐私保护问题,像广告等场景需要建立数百万移动设备之间的联邦模型,避免用户隐私数据上传到数据中心。第二个是纵向联邦学习,维度上进行聚合,比较看重跨机构跨组织大数据合作场景,尤其是银行金融场景的数据安全和隐私保护问题。
移动设备隐私保护的架构
跨机构跨组织大数据合作架构
联邦学习在技术上还有许多挑战,比如跨设备的系统异构以及算法迭代过程中的通信,将会影响最终联邦聚合的效率和精度;联邦学习的过程中的模型加密方法,因为即使通过权重也可以推测出部分隐私信息,以及客户端的投毒***、对抗样本等;另外一个挑战主要是架构上的,目前联邦学习还没有一个统一的架构,同时支持横向联邦学习和纵向联邦学习。
MindSpore 全场景统一架构的解决方案
- 端云统一内核
MindSpore 在框架的设计上进行了分层设计,将端云共用的数据结构和模块解耦出来,在满足端侧轻量化的同时,保持了端云架构的一致性,真正实现一次训练无缝部署、端云训练共模型。
【统一 IR】MindSpore core 的统一 IR,保证了端云模型/算子定义的一致性,使得云侧训练的模型可以无缝的部署在端侧。同时,对于端侧训练,可以和云侧使用一致的 IR 进行模型的重训。
统一 IR 定义了模型的逻辑结构和算子的属性,并且与模型的持久化是解耦的。开源项目中用于持久化数据的方式,使用最为广泛的,就是 protobuffer 和 flatbuffer。两者相比,protobuffer 功能更为强大,使用也更加的灵活,但是相应的,也更加的重量级。flatbuffer 更加的轻,反序列化的速度也更快。MindSpore 将统一 IR 的逻辑数据持久化成不同的物理形式,云侧持久化成 protobuffer 格式,端侧持久化成 flatbuffer,兼顾了数据的一致性与部署的轻量化。
【公共 pass】为了提升性能,训练好的模型在执行推理前,需要提前做一些优化手段,这些优化包括了融合、常量折叠、数据排布的调整等等。对于端云共享的优化,同样也是包含在 MindSpore core 模块中,只不过对于云侧推理,这些优化是在线推理时去执行的,而对于移动终端这些优化在执行推理前离线完成。
【统一接口】MindSpore 设计了提供端云统一的 C++接口。统一的 C++接口的用法尽量与 Python 接口保持了一致,降低了学习成本。通过统一接口,用户可以使用一套代码在不同的硬件上进行推理。
- 轻量化技术
【MindSpore for micro】相比于移动终端,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 组合量化方法,一阶段采用常规线性量化手段对权重和激活值进行量化,二阶段对量化误差进行分析,利用统计学方法对量化模型进行校正,补偿因量化带来的精度损失。
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。
TensorManager 支持 tensor 的引用计数和内存管理。端云统一运行时将在 MindSpore 1.2/1.3 版本中开源。
【软硬协同】MindSpore 原生与端侧的 NPU 芯片深度结合,最大程度的发挥了专有芯片的性能优势。
【算子优化】在手机 CPU 上,MindSpore 支持了多种卷积算法:Sliding Window、Im2Col+GEMM、Strassen、Winograd、Indirect Convolution、FFT 等。如何在不同的条件下选择最优的卷积算法,通常有 3 种做法:
1. 基于经验的人工设置
2. 通过数学建模的 Cost Model
3. 通过机器学习算法模型,使用已有数据集对其进行离线训练,最终得到一个可靠的卷积算子选择器
目前,MindSpore 支持了 2 和 3 两种方式来进行最优卷积算法的选择。
算法的选择,除了考虑性能,还需要考虑特定场景下的内存限制。例如,对于 IoT 场景的硬件设备,如果选择最为常见的 Im2Col+GEMM 算法,计算过程需要将输入和卷积核在内存中拉平,占内存较大。MindSpore 针对这种场景,选择占用内存较少的 Indirect Convolution 算法。
- 联邦学习
MindSpore 的联邦学习方法,同时支持 cross-device(ToC)和 cross-silo(ToB)两种场景,在数据不出域的条件下,实现多方联合建模,以帮助企业应用提效降本,助力不同行业智慧升级。在安全性方面,MindSpore 提供多种模型加密方式,可以适用于大规模无状态的终端设备,包括差分隐私、秘密共享、安全聚合等,用户可自定义安全等级。
了解完 MindSpore 的 AI 框架的几大优势,赶紧【点击链接】并【立即报名】,即可在 ModelArts 平台学习到一个经典案例掌握基于 MindSpore 的深度学习!