华为终端设备搭载了众多黑科技,今天我们就来揭秘一下端上的AI引擎:MindSpore Lite。
MindSpore Lite是MindSpore全场景AI框架的端侧引擎,目前MindSpore Lite作为华为HMS Core机器学习服务的推理引擎底座,已为全球1000+应用提供推理引擎服务,日均调用量超过3亿,同时在各类手机、穿戴感知、智慧屏等设备的AI特性上得到了广泛应用。
MindSpore Lite 1.0.0 已经在今年9月份开源,开源之后,其接口易用性、算子性能与完备度、第三方模型的广泛支持等方面,得到了众多手机应用开发者的广泛认可。目前,1.0.0版本发布已经过去3个月,最新的MindSpore Lite 1.1.0 在算子性能优化、模型小型化、加速库自动裁剪工具、端侧模型训练、语音类模型支持、Java接口开放、模型可视化等方面进行了全面升级,升级后的版本更轻、更快、更易用。接下来我们看一下 MindSpore Lite 1.1.0 。
https://www.mindspore.cn/tutorial/lite/zh-CN/r1.1/use/downloads.html
1. 算子库优化与扩展
1.1 性能优化
推理性能优化依然是我们本次版本的重头戏,除了持续的ARM CPU(FP16/FP32/INT8)性能优化,ARM GPU和X86_64的优化也是本次的亮点,GPU方面我们除了传统的算子优化,还加入了在线融合、AutoTuning等技术,使得ARM GPU推理性能大幅提升;同时为了更好的支持PC侧推理,在X86_64算子方面我们做了大量汇编层面的优化;经过大量模型的实测,MindSpore Lite 1.1.0 在推理性能方面在业界各类框架中极具竞争力。
1.1.1 ARM CPU优化
FP16推理性能
MindSpore Lite全面支持ARMv8.2的FP16推理,推理时延基本达到了FP32类型推理的二分之一,在推理时延大幅降低的同时精度满足业务要求;我们的FP16推理方案已经在华为HMS MLKit和华为手机预置的各类AI服务中普遍应用。
由于TF Lite不支持FP16推理,所以在FP16推理性能对比测试环节中我们只选择了阿里MNN最新的1.1版本,从测试结果看MindSpore Lite在FP16推理性能上展现出一定的优势。
△华为Mate30(麒麟990)上网络整体时延对比情况
△华为Mate30(麒麟990)上FP16推理时延对比
△三星Note20(骁龙865+)上FP16推理时延对比
Int8量化模型推理性能
△华为P20上量化模型时延对比
FP32推理性能
同时为了确保在低端CPU上使用MindSpore Lite推理时能够同样获得业界最优的推理性能,我们持续对FP32的推理性能进行了优化。我们在华为P20上以TFLite(2.4版本)、MNN(1.1版本)作为对比对象,进行了benchmark性能测试,从测试结果中可以看出MindSpore Lite FP32推理性能依然处理领先地位,但与其他框架的差距正在缩小。
△华为P20上FP32推理时延对比
1.1.2 ARM GPU优化
我们同样在华为Mate30上使用TF Hub官网100+预置模型与MNN(1.1版本)和TF(2.4版本)进行了GPU推理性能对比测试,可以从下图的测试结果看出MindSpore Lite GPU推理性能在大部分模型上优于TF Lite,而对于MNN则优势明显。
△华为Mate30上GPU FP32推理时延对比
1.1.3 X86_64 CPU优化
本次版本我们还对X86_64平台上的推理性能进行了大量优化工作,我们在Intel Core i7-8700的CPU上与Intel OpenVINO和MNN在几个经典CV类网络上进行了benchmark测试,从测试结果看MindSpore Lite性能相比于MNN和OpenVINO都有一定的优势。
1.1.4 更多的融合
当前MindSpore Lite版本已经基本覆盖了机器视觉领域通用的卷积相关融合pattern,同时针对基于Transformer结构的语音模型和LSTM结构的模型进行了深度融合优化,主要包括将小算子融合成Layernorm、LSTM等大算子,多个MatMul融合成BatchMatMul算子,Slice算子切分矩阵的前移融合等,使得语音类模型获得20%+的提升,后续我们将尝试融合pattern的自动schedule功能。
1.2 算子完备度扩展
MindSpore Lite支持包括ARM CPU、ARM GPU、X86 CPU、Kirin NPU、MTK APU在内的多种硬件平台。
1.2.1 ARM CPU
MindSpore Lite是目前端侧推理框架中CPU算子支持最丰富的框架之一,当前我们的模型转换工具支持TF Lite(100个)、TF(53个)、ONNX(96个)以及Caffe(26个)等第三方框架算子定义的解析,做到了高兼容性,上文性能测试中我们也提到过MNN对很多模型无法转换,甚至连TF Lite对自家官网预置模型的支持度也不够完善;同时MindSpore Lite实现了121个FP32,55个FP16以及71个INT8 CPU算子;而此次的1.1版本我们对控制流算子也进行一次大的调整与完善,以便更好的支持语音类模型。
1.2.2 ARM GPU
1.2.3 Kirin NPU
△Mate 40上NPU和CPU FP32/16推理时延对比
2. 支持端侧训练
3. 训练后量化
随着AI应用在端侧设备部署越来越普遍,而受制于端侧资源的局限性,对于模型小型化和推理性能提升的挑战日益倍增。MindSpore Lite提供了简单实用的训练后量化功能,最大程度压缩模型大小,减小内存占用,提升推理速度,降低功耗。
训练后量化相较于量化重训具有两个明显优势,一是无需大量训练数据集,二是无需重新训练,离线快速转换。MindSpore Lite训练后量化工具提供权重量化和全量化两种方法,支持1~16bit量化,支持分类,检测,NLP等多种模型。
为保障训练后量化模型精度损失小,我们采用pipeline组合量化方法,一阶段采用常规线性量化手段对权重和激活值进行量化,二阶段对量化误差进行分析,利用统计学方法对量化模型进行校正,补偿因量化带来的精度损失。
以TF官网MobileNet_v2模型为例,MindSpore Lite训练后量化A8W8(激活值8bit量化、权重8bit量化)精度与FP32模型相比,经损失校正后,精度损失由0.82%降到0.4%,同样适用7bit量化下,精度损失仍不超过1%。
ACC (On ImageNet) |
|
71.16% (TF Lite官网后量化ACC:63.7%) |
|
|
|
△训练后全量化mobilenet_v2模型精度对比
我们在HMS Face场景下模型进行了INT8权重量化(模型size范围364KB~2.9MB),实际端到端识别精度完全满足服务要求。权重量化精度损失矫正方案的相对精度误差对比如下,可以看到损失矫正方案下量化精度损失有明显降低。
模型 |
Int8 |
Int8+BiasCorrection |
face_tracking |
1.28214% |
1.00386% |
face_age |
8.40158% |
3.21885% |
face_beard |
3.72371% |
1.50271% |
face_contour |
0.196258% |
0.129654% |
face_emotion |
17.5848% |
3.19592% |
face_glasses |
5.8514% |
2.73312% |
4. 易用性增强
4.1 加速库自动裁剪工具
为了满足部分对发布包大小有极致小型化诉求的场景,我们提供了一个一键式裁剪工具,该工具可以根据用户指定的模型列表,自动裁剪出足以运行列表中指定模型的最小化MindSpore Lite版本。
4.2 离线工具参数精简
我们对离线转换工具参数进行了精简,最大程度地提高转换工具的易用性,让开发者在转换三方模型时,无需感知三方模型的量化类型、输入输出节点名称和对应的数据类型等。
4.3 支持Java接口
1.1版本正式开放了Java接口,以方便安卓开发者更简单的使用MindSpore Lite进行应用开发。
4.4 模型可视化
为了方便开发者调试,我们在Netron开源社区提交了支持MindSpore Lite模型可视化的代码,现在开发者可以使用Netron工具可视化MindSpore Lite模型。相信能给开发者调试模型,尤其是一些结构复杂的模型,带来极大的方便。
5. 开放更多的端侧预置模型
模型链接:
https://www.mindspore.cn/resources/hub/details?noah-cvlab/gpu/1.0/resnet-0.65x_v1.0_oxford_pets
模型链接:
https://www.mindspore.cn/resources/hub/details?noah-cvlab/gpu/1.0/VGG-Small-low-bit_cifar10
如果想了解更多关于以上MindSpore首发模型中使用的轻量化技术,请参考↓
MindSpore首发:诺亚NeurIPS 2020多篇轻量化技术端侧模型
长按下方二维码加入MindSpore项目↓