MNN Versions Save

MNN is a blazing fast, lightweight deep learning framework, battle-tested by business-critical use cases in Alibaba

2.3.0

1 year ago

一、功能完善

  • 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

1 year ago

一、框架通用性

  • 新增对ARMv8.6-A指令支持,支持了smmlabfmmla指令的使用
  • 新增NNAPI后端,能够利用Android设备上的NPU/APU/DSP进行计算
  • 新增汇编预处理脚本,能够将汇编指令转换为.inst指令,降低新指令对编译器的依赖
  • 新增A16和M2 CPU family支持
  • 训练模块新增Selu / StridedSlice / TopKV2 / Scale / Broadcastto 等求导算子
  • 新增Interp3D / ConvTranspose3D支持(感谢开源群伙伴贡献)

二、性能优化

  • 新增ARMv8.6指令支持后,GemmInt8, GemmBF16性能提升

    • smmla实现的GemmInt8实测性能在矩阵规模为[1024, 1024, 1024]时,性能相比sdot提升为83.90%(图中33x33项),接近理论性能(100%);模型性能提升20%左右。
    • bfmmla实现的GemmBF16实测性能在规模为[1024, 1024, 1024]时,性能相比fp16fmla提升为91.53%(图中1024,1024,1024项),接近理论性能;模型性能相比原来的bf16提升一倍以上。 image image image image
  • MNN-NNAPI后端支持,NNAPI使用accelerator设备进行推理,在中端和高端设备上相比CPU单线程均有性能优势;在高端设备上相比CPU 4线程仍有性能优势。 image image

  • CUDA性能优化,Depthwise卷积、Raster快速计算、Im2Col等优化,MobileNet/Squeezenet等模型性能提升

  • 新增BinaryRelu-Fuse和对应的各后端实现,resnet模型性能提升 image image

三、其他

  • 进行了部分代码重构(包括但不限于)
    • 对于包含多个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

1 year ago

一、框架通用性

  • MNN-CV 增加 solvepnp / svd 等函数实现
  • MNN-Train 补充 Unary / Binary / Reduction 的求导实现
  • MNN-Express 支持 Eager 模式,该模式下不保存计算图,直接计算结果,可通过 Executor 的 lazyEval 配置
    • 在C++中默认使用Lazy模式
    • 在Python中默认使用Eager模式
  • 新增基于Markdown+Sphinx的文档

二、性能优化

  • 服务端推理 CUDA 性能提升

    • 基于 cutlass 重新实现了矩阵乘,对卷积应用 Winograd算法优化; image
  • MNN-CoreML 后端支持免拷贝 image

三、模型压缩

  • 支持 Winograd Int8对kernel_size > 1的量化卷积进行优化 ,离线量化工具(C++: quantized.out,python: mnnquant)json配置文件中增加"winogradOpt": true,并将特征量化方法设置为"feature_quantize_method":"EMA"即可使用

image

四、其他

  • 进行了部分代码重构(包括但不限于)
    • 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

1 year ago

一、框架通用性

  • 模型推理通用性增加: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重写;

image image

image

三、模型压缩

  • 新增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多次执行内存占用过高问题修复;

1.2.1

2 years ago
  1. Fix deconvolution multi -batch multi-input compute error.
  2. Fix bug for compute size for stridedslice when beginShape << input.dim
  3. Add fp16 for Gridsample
  4. Fix bug for PoolGrad
  5. Fix compile error for not comparability asm

1.2.0

2 years ago

一、框架通用性

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 列表不准确)

1.1.6

3 years ago

Features:

  1. Rewrite GRU Op for Onnx
  2. Support deconvolution for OpenCL Buffer mode

Bugfix / Refractor:

  1. Move NN from MNN_Express to MNN_Train
  2. Fix bug for LSTM model crash
  3. Add HardSwish Fuse
  4. Add Onnx::Not, Onnx::GatherElement
  5. Support TF::FusedBatchNormal when is_training = True
  6. Fix compute bug for Pooling3D
  7. Fix bug for CUDA backend convolution depthwise with multi-input crash

1.1.5

3 years ago

Features:

  1. Add BF16 Support, only optimized for ARMv7a / ARMv8, set MNN_SUPPORT_BF16 to open it.
  2. Refract FP16 (ARM82) , speed up 10%-20% for benchmark model, support deconvolution / matmul.
  3. Support full Int8 compute, remove int8-float convert for data reorder Ops (In Test)
  4. Support AVX512 for float compute

Optimize / Bugfix:

  1. Fix bug for HIAI-NPU Backend's multi output
  2. Add GatherV2 grad for Training
  3. Add fastTestTflite.py for test tflite -> MNN correctly
  4. Add Dup Op Fuse in Graph Optimization
  5. Add GridSample for CPU / Metal
  6. Fix compile bug for Vulkan shader by glslang 4.5

1.1.4

3 years ago

Features:

  1. Support OpenCL Backend for Buffer, user can use numberThread / mode to control it : https://www.yuque.com/mnn/cn/create_session
  2. Remove unuseful code for OpenCL Backend
  3. Support tflite's Binary with Activation

Bugfix:

  1. Fix bug for convolution compute zero shape tensor

1.1.3

3 years ago

Features:

  1. Add HIAI Backend
  2. Refract the control flow support for tensorflow, support dynamic LSTM from TF
  3. Add several op for TensorRT Backend (GatherV2, Interp, ScatterND, DetectionPostProcess, BatchMatMul)

Speed up / Bugfix

  1. Add Prelu fuse for Tensorflow
  2. Fix some op bug for CUDA
  3. Fix some op bug for Metal (Relu6 / Not register)