摘要:本文重点分析全场景对立的 AI 框架的挑战和 MindSpore 的解决思路。
2020 年的最初一天,MindSpore 公布了 1.1 版本,1.1 中很重要的个性是构建了端边云全场景对立的基础架构:
https://gitee.com/mindspore/m…
所以本文重点分析全场景对立的 AI 框架的挑战和 MindSpore 的解决思路。
全场景对立 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 缓存的命中率以及指令的流水,通用的优化办法有:
- 抉择正当数据排布,如 NHWC、NC4HW4 等等
- 寄存器的正当调配,将寄存器依照用处,能够划分为 feature map 寄存器、权重寄存器和输入寄存器,寄存器的正当调配能够缩小数据加载的次数。
- 数据的预存取,通过 prefetch/preload 等指令,能够提前将数据读到 cache 中。
- 指令重排,尽量减少指令的 pipeline stall。
- 向量化计算,应用 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。
Tensor Manager 反对 tensor 的援用计数和内存治理。
端云对立运行时将在 MindSpore 1.2/1.3 版本中开源。
【软硬协同】
MindSpore 原生与端侧的 NPU 芯片深度联合,最大水平的施展了专有芯片的性能劣势。
【算子优化】
在手机 CPU 上,MindSpore 反对了多种卷积算法:Sliding Window、Im2Col+GEMM、Strassen、Winograd、Indirect Convolution、FFT 等。如何在不同的条件下抉择最优的卷积算法,通常有 3 中做法:
- 基于教训的人工设置
- 通过数学建模的 Cost Model
- 通过机器学习算法模型,应用已有数据集对其进行离线训练,最终失去一个牢靠的卷积算子选择器
目前,MindSpore 反对了 2 和 3 两种形式来进行最优卷积算法的抉择。
算法的抉择,除了思考性能,还须要思考特定场景下的内存限度。例如,对于 IoT 场景的硬件设施,如果抉择最为常见的 Im2Col+GEMM 算法,计算过程须要将输出和卷积核在内存中拉平,占内存较大。MindSpore 针对这种场景,抉择占用内存较少的 Indirect Convolution 算法。
- 联邦学习
MindSpore 的联邦学习办法,同时反对 cross-device(ToC)和 cross-silo(ToB) 两种场景,在数据不出域的条件下,实现多方联结建模,以帮忙企业应用提效降本,助力不同行业智慧降级。在安全性方面,MindSpore 提供多种模型加密形式,能够实用于大规模无状态的终端设备,包含差分隐衷、机密共享、平安聚合等,用户可自定义安全等级。
本文分享自华为云社区《端边云全场景对立的 AI 框架的挑战和解决思路》,原文作者:HWCloudAI。
点击关注,第一工夫理解华为云陈腐技术~