Skip to content

MNN 1.2.0 Release Notes

Compare
Choose a tag to compare
@hush-alibaba hush-alibaba released this 18 Jun 10:08
58545d6

一、框架通用性

1.1 新增Torchscript模型格式支持

我们注意到,大量的机器学习工程师在从TensorFlow往PyTorch迁移。推理引擎对于PyTorch模型的原生支持尤为重要。虽然MNN已经支持了ONNX格式的模型,但是考虑到PyTorch自身长期的发展趋势,基于Torchscript格式的模型比ONNX更具通用性。

现在,MNNConvert支持在Mac、Windows、Linux平台下将所有的 TorchVision视觉模型 转换到MNN格式。

1.2 新增ARM BF16后端

BF16 可以给中低端手机和高端机的小核带来性能收益,并且降低内存占用。经MNN团队内部测试,BF16相对于FP32在不同机型的中低端核心(A53 A55 A53kyro A55kyro)上,不同模型有 5%- 30%的优化。
1623327886911-992fe908-e27e-4951-8942-cf3431b17f80

BF16使用方法:

  1. 编译MNN时,指定-DMNN_SUPPORT_BF16=ON
  2. BackendConfig中指定PrecisionMode 为 Precision_Low

1.3 新增CoreML后端

基于几何计算,MNN添加了CoreML的支持。在iPhone X之后,借助于Apple Neural Engine,相比于CPU,CoreML (ANE) 在视觉模型中约有5-6倍的性能提升。

1.4 几何计算的演进

在1.1.0版本的几何计算的基础上,本次发布中『几何计算』增加了对于循环算子(如Gather、BatchMatMul、LSTM)的GPU后端支持。

二、模型压缩

2.1 ARM 浮点稀疏算子实现

随着CPU性能优化的边际收益的降低,为了获得更高的性能,需要从模型结构本身着手,设计、裁剪出合适目标硬件和推理引擎的模型结构,以获得最佳的精度和性能。
基于此,MNN添加了随机稀疏和半结构化稀疏算子的ARM浮点实现 (原理见 ” Fast Conv Nets ” ),如下图所示:
1623327945195-777985a8-dd6d-4cb0-a9b6-b7a7c8351fd0

经过MNN内部在各类机型和模型实测,随机稀疏率, 1x4半结构稀疏率 (沿输出通道OC分块,blockOC=4) 分别为0.6、 0.3时,推理性能将大于稠密实现性能。

随机稀疏率0.9时,MobileNet、NasNet、SqueezeNet各类模型中,在高、中、低端手机上的加速比为1.7倍 ~ 4.5倍;1x4半结构稀疏率0.9时,加速比为1.8倍 ~ 6.1倍。

2.2 离线量化精度提升

离线量化工具中添加了激活非对称的支持,并且通过量化时更新BN参数,离线量化精度获得普遍提升。结合使用非对称量化+BN参数更新,MobileNet V2量化模型精度从71.05%提高到71.73%,进一步逼近浮点模型(71.90%)。
使用方法见: MNN/tools/MNNPythonOfflineQuant at master · alibaba/MNN · GitHub

三、性能优化

3.1 ARM 后端

支持ARMv8.2指令的设备占有率随着时间的推移逐渐上升,是MNN优化的重点之一。相比于MNN 1.1.x版本,MNN 1.2.0的ARMv8.2性能在各类视觉模型中有5% ~ 20%的提升,且与业界主流引擎对比处于领先地位。
1623328023799-3a5590e1-1ae3-423e-bdcf-53efecceaddb

3.2 X86 后端

MNN集中优化了X86-AVX2上的性能。目前在主流的视觉、时序模型中,MNN-AVX2后端相比于OpenVINO由20%到440%的性能优势,与ONNXRuntime相比,则有18%到60%的性能优势 (仅MobileNet V2略逊于OpenVINO/ONNXRuntime)。

1623328041437-ef9f1bbe-2bd4-4228-a9b0-cf949e6e1926
取得如此性能成绩,且通用性持平或更胜一筹的前提下,相比于 Onnx / OpenVino 几十至几百M 的大小,MNN 库的体积却很小,仅 3M 不到。 此外,MNN 支持了 AVX512 / AVX512VNNI,相对于 AVX2 ,在浮点矩阵乘法有 60% 加速,Int8矩阵乘则有 200% 的加速。

3.3 OpenCL后端

随着移动App中的部署的各类深度学习模型数量增多,MNN团队发现,CPU占用率居高不下,会影响App稳定性和用户体验。基于此判断,我们重点优化OpenCL后端的性能(与主流引擎相比已处于领先地位),并且与内部业务方共同设计面向GPU模型,达到性能、精度双高的模型。性能数据如下图:
1623328057517-031b6250-5e2a-4886-8f05-5dbfc53cd7e3

1623328074312-ec3bcf02-f8ef-42d7-99f1-aa175e8f618c

四、其他

功能

  1. 新建 MNN 表达式接口相关 demo,见pymnn/examples/MNNExpr/mobilenet_demo.py和demo/exec/{pictureRecognition_module.cpp, transformerDemo.cpp}
  2. 对离线量化工具进行了重构,减少 int8 / float 互转损耗,以 shufflenet 为例可减少 20% 耗时
  3. 完善模型校验工具 (tools/script/fastTest 系列)
  4. 增加 Onnx 所有与 MNN 相匹配的单目 / 双目算符支持

图优化(包括但不限于)

  1. 新增 Gelu / Hardswish 算子融合
  2. 增加 Layernorm 算子融合的范围
  3. 新增 MatMul + Bias 融合,增加其转换为卷积的范围
  4. 新增 Tensorflow / Tflite 的 Dilate Convolution 算子融合(SpaceToBatch + Conv + BatchToSpace)

Bugfix(包括但不限于):

  1. 修正 StridedSlice 在 newAxis 和 begin << inputShape 情况下的实现错误
  2. 修正 Eltwise MAX 的求导错误
  3. 移除 MNNConvert 对 regex 的依赖(此问题导致在 gcc 4.8 环境下无法运行 Converter)
  4. 修正 CPU Raster 算子对 dimension = 1 的 NC4HW4 数据格式处理错误的问题
  5. 移除 MNN Python wheel 中意义不大的 mnnops (里面显示的 Op 列表不准确)