1.2.0
alibaba/MNN1.2.0Jun 18, 2021by hush-alibaba
AI Summary
MNN 1.2.0 introduces significant framework enhancements including TorchScript model support for PyTorch migration, ARM BF16 backend for performance gains on mid/low-end devices, and CoreML backend for Apple Neural Engine acceleration. The release also delivers major performance improvements across ARM, X86, and OpenCL backends, along with model compression enhancements through sparse operators and improved offline quantization.
Key Highlights
- Added TorchScript model format support - converts all TorchVision vision models to MNN
- ARM BF16 backend delivers 5-30% performance improvement on mid/low-end cores (A53, A55, A53kyro, A55kyro)
- CoreML backend provides 5-6x performance boost via Apple Neural Engine on iPhone X+
- X86-AVX2 backend outperforms OpenVINO by 20-440% and ONNXRuntime by 18-60%
- ARM float sparse operators achieve 1.7x-6.1x speedup with random and semi-structured sparsity
Breaking Changes
- Removed regex dependency from MNNConvert (affects gcc 4.8 compatibility)
- Removed mnnops from MNN Python wheel (Op list was inaccurate)
New Features
- TorchScript model format support for Mac/Windows/Linux
- ARM BF16 backend with Precision_Low mode
- CoreML backend for Apple Neural Engine
- GPU backend support for loop operators (Gather, BatchMatMul, LSTM)
- Random sparse and 1x4 semi-structured sparse ARM float operators
- Offline quantization with activation asymmetry and BN parameter updates
- AVX512/AVX512VNNI support for X86 backend
- New MNN expression interface demos (pymnn/examples/MNNExpr/mobilenet_demo.py)
- Graph optimizations: Gelu/Hardswish fusion, Layernorm fusion, MatMul+Bias fusion, Dilate Convolution fusion
- Complete ONNX unary/binary operator support
Full Release Notes
# 一、框架通用性
# 1.1 新增Torchscript模型格式支持
我们注意到,大量的机器学习工程师在从TensorFlow往PyTorch迁移。推理引擎对于PyTorch模型的原生支持尤为重要。虽然MNN已经支持了ONNX格式的模型,但是考虑到PyTorch自身长期的发展趋势,基于Torchscript格式的模型比ONNX更具通用性。
现在,MNNConvert支持在Mac、Windows、Linux平台下将所有的 [TorchVision视觉模型](https://pytorch.org/vision/stable/index.html) 转换到MNN格式。
# 1.2 新增ARM BF16后端
BF16 可以给中低端手机和高端机的小核带来性能收益,并且降低内存占用。经MNN团队内部测试,BF16相对于FP32在不同机型的中低端核心(A53 A55 A53kyro A55kyro)上,不同模型有 5%- 30%的优化。

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](https://openaccess.thecvf.com/content_CVPR_2020/papers/Elsen_Fast_Sparse_ConvNets_CVPR_2020_paper.pdf) ” ),如下图所示:

经过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](https://github.com/alibaba/MNN/tree/master/tools/MNNPythonOfflineQuant)
# 三、性能优化
# 3.1 ARM 后端
支持ARMv8.2指令的设备占有率随着时间的推移逐渐上升,是MNN优化的重点之一。相比于MNN 1.1.x版本,MNN 1.2.0的ARMv8.2性能在各类视觉模型中有5% ~ 20%的提升,且与业界主流引擎对比处于领先地位。

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

取得如此性能成绩,且通用性持平或更胜一筹的前提下,相比于 Onnx / OpenVino 几十至几百M 的大小,MNN 库的体积却很小,仅 3M 不到。 此外,MNN 支持了 AVX512 / AVX512VNNI,相对于 AVX2 ,在浮点矩阵乘法有 60% 加速,Int8矩阵乘则有 200% 的加速。
# 3.3 OpenCL后端
随着移动App中的部署的各类深度学习模型数量增多,MNN团队发现,CPU占用率居高不下,会影响App稳定性和用户体验。基于此判断,我们重点优化OpenCL后端的性能(与主流引擎相比已处于领先地位),并且与内部业务方共同设计面向GPU模型,达到性能、精度双高的模型。性能数据如下图:


# 四、其他
### 功能
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 列表不准确)