Releases: alibaba/MNN
2.3.1
2.3.1
2.3.0 基于几何计算实现求导/支持模型权重分离模式
一、功能完善
- CUDA 后端支持高精度模型(设置 precision = high 时使用 FP32 计算) 和 SM60 架构
- MNN-Train 求导优化
- MNN-Express 支持 CONTENT 模式,该模式下基于几何计算分解算子后再构图,以降低需要实现求导的算子数
- 支持 Raster / Loop 算子部分情况下的求导
- 支持 GridSampler 的求导
- OpenCL 后端支持低优先级运行模式(设置 power = low)
- (实险中特性)Vulkan 后端增加基于Buffer内存布局的算子实现,目前基于编译宏决定用 Image内存布局还是 Buffer内存布局(MNN_VULKAN_IMAGE ,默认为 ON)
- (实验中特性)支持分离模型结构与权重的选项
- 模型转换为 {S}.mnn 时,添加参数 --saveExternalData ,模型权重将单独保存为二进制文件 {S}.mnn.weight
- 模型加载运行时,通过以下方式指定权重文件路径:
- Session API: Interpreter::setExternalFile
- Module API: Executor::RuntimeManager::setExternalFile
二、重构/优化
- 修改嵌入式上常用的 SeqLength = 1 的 ONNX LSTM 算子的模型转换实现,改为用卷积+非线性层拼接实现,以提升性能
- 修正部分情况下 Convolution Winograd CPU 相较之前版本变慢的问题
- 优化 VARP 的 fix 函数,避免拷贝内存
- 对 Raster 算子的输入进行了改造,由 region 隐式输入修改为正常的多输入单输出
- 量化计算实现中的量化/反量化过程重构为在线插入相应算子,并修正 prearrange 为 true 时,Module API 计算量化模型的结果错误问题
- 移除 ComputeUnit / ComputeCache ,Executor 内部的计算改为使用 Session ,并延迟内存分配时机,修正模型转换过程中部分情况下占用内存过大的问题
- 优化模型转换静态模型的导出,移除了图中无效算子
三、Bugfix
- 修正 convolution transpose 3d 在 pad 为空时计算 crash 问题
- 修正 cumsum 计算 int 输入的 bug
- 修正 Onnx GatherND 算子转换不支持 batch_dims 的问题
- 修正 Onnx Split 算子转换的默认值问题
- 修正 Onnx permute 算子转换不支持 axis 为空的问题
2.2.0 NNAPI / ARMv8.6 矩阵乘指令支持
一、框架通用性
- 新增对
ARMv8.6-A
指令支持,支持了smmla
和bfmmla
指令的使用 - 新增
NNAPI
后端,能够利用Android设备上的NPU/APU/DSP进行计算 - 新增汇编预处理脚本,能够将汇编指令转换为
.inst
指令,降低新指令对编译器的依赖 - 新增A16和M2 CPU family支持
- 训练模块新增Selu / StridedSlice / TopKV2 / Scale / Broadcastto 等求导算子
- 新增Interp3D / ConvTranspose3D支持(感谢开源群伙伴贡献)
二、性能优化
-
新增ARMv8.6指令支持后,GemmInt8, GemmBF16性能提升
-
MNN-NNAPI后端支持,NNAPI使用accelerator设备进行推理,在中端和高端设备上相比CPU单线程均有性能优势;在高端设备上相比CPU 4线程仍有性能优势。
-
CUDA性能优化,Depthwise卷积、Raster快速计算、Im2Col等优化,MobileNet/Squeezenet等模型性能提升
三、其他
- 进行了部分代码重构(包括但不限于)
- 对于包含多个SubModule的复杂模型, 复用子模型间共性tensor,重新构建计算图和指令队列,显著降低大内存操作的耗时
- 修复了如下 Bug(包括但不限于)
- Onnx Resize 在指定 scale 且输入输出无法整除时,计算错误
- 修复在不支持SSE 4.1 ,但支持SSE3的设备上打开SSE执行Crash的问题
- 修复部分情况下多输入Conv转换错误
- 修复ARM82后端GridSampler在Linux上的编译错误
- 修复Conv1dSqueezeMove在Squeeze双输入时计算出错的问题
- 修复输入为NC4HW4时,stride计算错误的问题
- 修复HIAI后端编译错误,Binary BUG
- 新增Tflite Prelu 模型转换支持(仅支持slope为常量情况)
2.1.0 Eager 模式 / CUDA 后端改造 / Winograd Int8 计算实现
一、框架通用性
- MNN-CV 增加 solvepnp / svd 等函数实现
- MNN-Train 补充 Unary / Binary / Reduction 的求导实现
- MNN-Express 支持 Eager 模式,该模式下不保存计算图,直接计算结果,可通过 Executor 的 lazyEval 配置
- 在C++中默认使用Lazy模式
- 在Python中默认使用Eager模式
- 新增基于Markdown+Sphinx的文档
二、性能优化
三、模型压缩
- 支持 Winograd Int8对
kernel_size > 1
的量化卷积进行优化 ,离线量化工具(C++:quantized.out
,python:mnnquant
)json配置文件中增加"winogradOpt": true
,并将特征量化方法设置为"feature_quantize_method":"EMA"
即可使用
四、其他
- 进行了部分代码重构(包括但不限于)
- MNN Metal 改为在线生成 Shader 编译,避免集成 MNN.metallib 的兼容性问题
- 移除 CPU / Geometry / Arm82 部分冗余代码
- 默认移除原先 TFlite - Uint8 的算子支持,但可以通过 MNN_SUPPORT_DEPRECATED_OP 宏打开
- 移除 linux 系统下编译 Torchscript 所需要的 libTorch 库,改为编译时从网络下载
- ScatterND 改为基于 Loop 算子实现
- 修复了如下 Bug(包括但不限于)
- CPU - AVX512 int8 在转换 NC4HW4 格式时内存访问越界
- GeometryBinary 处理 NC4HW4 输入,两边Channel上对齐大小相同,但Channel不同时计算出错
- Arm82 Interp 算子多 Batch 情况下计算出错问题
- Windows 上 json2MNN 工具写入结果有误
- Onnx GatherElement 算子在输入大小不确定时转换失败
- 修复Python中Module,RuntimeManager内存泄露问题
- 修复控制流模型转换时输出算子Name不匹配的问题
- 修正 ROIPooling / ROIAlign 低精度计算 crash 的问题
2.0.0
一、框架通用性
- 模型推理通用性增加:Torchsciprts OP 添加,Onnx OP 补齐
- Onnx 算子数由 117 增加到 158
- Torchscripts 算子数由 34 增加到 163
- MNNConvert功能扩充
- 支持模型转换正确性验证
- 支持MNN模型与Json文件互转,方便查看与编辑模型结构
- MNN增加统一版本号机制
- 编译期版本宏定义
- 运行时版本号函数
- 模型中增加版本信息
- 增加 MNN-CV / MNN-Numpy 功能
- C++中提供了与OpenCV中图像编解码,图像处理用法相似的API;
- Python中提供了与cv2/numpy基础功能用法相似的函数;
- 支持的cv函数57个,numpy函数170个,[函数列表](https://www.yuque.com/mnn/cn/pu0qfp 《MNN cv numpy 模块》);
二、性能优化
- 服务/PC端推理CPU/GPU性能提升
- CPU部分AVX512优化,多线程优化提速;
- GPU部分CUDA移除cudnn,基于TensorCore重写;
三、模型压缩
- 新增mnncompress模型压缩工具
- 支持基于TensorFlow 1.X和Pytorch的模型压缩,具体使用方法见文档
- 添加压缩模型的模型转换,及相关算法的MNN底层推理支持
四、其他
- 测试/Demo/Benchmark完善
- 修正 Android Demo 的 编译Bug;
- 增加一个使用 mnn framework 的 ios demo工程;
- Pymnn新增离线量化Demo与测试;
- Pymnn新增训练相关测试;
- Pymnn中新增MNN.numpy与numpy对比的benchmark;
- 新增MNN.cv与OpenCV对比的benchmark;
- Bugfix(包括但不限于)
- Pymnn修复训练相关API使用Bug;
- 修复arm64汇编中的sp计算Bug;
- GatherND 精度数目问题修复;
- ZeroShape 支持完善;
- NDK24 下 armv7a-arm82 编译错误修正;
- benchmark metal crash修复;
- benchmark metal crash;
- Module 的 RuntimeManager 设置 precision = low 无效的问题修复;
- CoreML Pooling CAFFE-PAD,Deconv修复;
- CoreML多次执行内存占用过高问题修复;
Bugfix / Feature
- Fix deconvolution multi -batch multi-input compute error.
- Fix bug for compute size for stridedslice when beginShape << input.dim
- Add fp16 for Gridsample
- Fix bug for PoolGrad
- Fix compile error for not comparability asm
MNN 1.2.0 Release Notes
一、框架通用性
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%的优化。
BF16使用方法:
- 编译MNN时,指定-DMNN_SUPPORT_BF16=ON
- 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 ” ),如下图所示:
经过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%的提升,且与业界主流引擎对比处于领先地位。
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模型,达到性能、精度双高的模型。性能数据如下图:
四、其他
功能
- 新建 MNN 表达式接口相关 demo,见pymnn/examples/MNNExpr/mobilenet_demo.py和demo/exec/{pictureRecognition_module.cpp, transformerDemo.cpp}
- 对离线量化工具进行了重构,减少 int8 / float 互转损耗,以 shufflenet 为例可减少 20% 耗时
- 完善模型校验工具 (tools/script/fastTest 系列)
- 增加 Onnx 所有与 MNN 相匹配的单目 / 双目算符支持
图优化(包括但不限于)
- 新增 Gelu / Hardswish 算子融合
- 增加 Layernorm 算子融合的范围
- 新增 MatMul + Bias 融合,增加其转换为卷积的范围
- 新增 Tensorflow / Tflite 的 Dilate Convolution 算子融合(SpaceToBatch + Conv + BatchToSpace)
Bugfix(包括但不限于):
- 修正 StridedSlice 在 newAxis 和 begin << inputShape 情况下的实现错误
- 修正 Eltwise MAX 的求导错误
- 移除 MNNConvert 对 regex 的依赖(此问题导致在 gcc 4.8 环境下无法运行 Converter)
- 修正 CPU Raster 算子对 dimension = 1 的 NC4HW4 数据格式处理错误的问题
- 移除 MNN Python wheel 中意义不大的 mnnops (里面显示的 Op 列表不准确)
More Op and bugfix
Features:
- Rewrite GRU Op for Onnx
- Support deconvolution for OpenCL Buffer mode
Bugfix / Refractor:
- Move NN from MNN_Express to MNN_Train
- Fix bug for LSTM model crash
- Add HardSwish Fuse
- Add Onnx::Not, Onnx::GatherElement
- Support TF::FusedBatchNormal when is_training = True
- Fix compute bug for Pooling3D
- Fix bug for CUDA backend convolution depthwise with multi-input crash
Support BF16, Speed Up FP16, AVX512, Full Quantization
Features:
- Add BF16 Support, only optimized for ARMv7a / ARMv8, set MNN_SUPPORT_BF16 to open it.
- Refract FP16 (ARM82) , speed up 10%-20% for benchmark model, support deconvolution / matmul.
- Support full Int8 compute, remove int8-float convert for data reorder Ops (In Test)
- Support AVX512 for float compute
Optimize / Bugfix:
- Fix bug for HIAI-NPU Backend's multi output
- Add GatherV2 grad for Training
- Add fastTestTflite.py for test tflite -> MNN correctly
- Add Dup Op Fuse in Graph Optimization
- Add GridSample for CPU / Metal
- Fix compile bug for Vulkan shader by glslang 4.5
OpenCL Speed Up
Features:
- Support OpenCL Backend for Buffer, user can use numberThread / mode to control it : https://www.yuque.com/mnn/cn/create_session
- Remove unuseful code for OpenCL Backend
- Support tflite's Binary with Activation
Bugfix:
- Fix bug for convolution compute zero shape tensor