2.8.0

alibaba/MNN2.8.0Dec 5, 2023by github-actions[bot]

AI Summary

MNN 2.8.0 adds JSON format for quantization parameters, new operators, significant LLM CPU performance improvements through dynamic quantization, and various bug fixes.

Key Highlights

  • JSON文件格式导入量化参数支持
  • MaxPooling with index支持
  • NNAPI Deconvolution算子支持
  • MNNConvert大幅降低大模型转换内存占用
  • OpenCL支持Loop算子特殊形式(广播Binary)
  • 支持Unary、Prelu算子量化
  • ONNX ScatterND算子性能优化
  • CPUTopKV2算子性能优化
  • ARM/X86动态量化优化权重量化的矩阵乘、卷积算子
  • LLM模型CPU推理性能大幅提升

New Features

  • JSON格式量化参数导入
  • MaxPooling with index
  • NNAPI Deconvolution支持
  • MNNConvert内存优化
  • OpenCL Loop算子
  • Unary/Prelu算子量化
  • ONNX ScatterND优化
  • CPUTopKV2优化(stl实现)
  • ARM汇编MNNTranspose16Bit8x8
  • ARM/X86动态量化LLM推理
  • Pymnn支持构建训练模型

Full Release Notes

# 1. 新特性
- MNN支持以JSON文件格式导入量化参数 ([issue-2587](https://github.com/alibaba/MNN/issues/2587))
- 支持 MaxPooling with index ([issue-2268](https://github.com/alibaba/MNN/issues/2268))
- MNN支持NNAPI中Deconvolution算子
- MNNConvert支持 Onnx 中 dim < 2 的矩阵乘算子
- TestConvert 增加测试非 CPU 后端的能力
- Pymnn支持构建 MNN 训练模型,以支持离线训练模式
- 优化MNNConvert,大幅降低大模型转换时的内存占用
- OpenCL 支持 Loop 算子特殊形式,广播 Binary
- 支持 Unary, Prelu 算子量化
# 2. 性能优化

- ONNX ScatterND算子性能优化 ([issue-2530](https://github.com/alibaba/MNN/issues/2530  ))
- CPUTopKV2算子性能优化,将tflite的实现修改为stl的实现;
- ARM汇编实现`MNNTranspose16Bit8x8`, 提升fp16的转置性能;
- ARM/X86使用动态量化方案优化权重量化的矩阵乘、卷积算子;llm模型推理性能大幅提升;

## llm cpu性能测试
`mnn-llm` 在MNN 2.8.0版本的CPU性能如下,测试均使用4线程, 速度为`prefill / decode`单位为`tok/s`

| model             | android(f16/32)| macos (f32)   | linux (f32)    | windows (f32)  |
|:-----------------:|:--------------:|:-------------:|:--------------:|:--------------:|
| qwen-1.8b-int4    | 100.21 / 22.22 | 84.85 / 19.93 | 151.00 / 35.89 | 117.30 / 33.40 |
| qwen-1.8b-int8    |  99.95 / 16.94 | 67.70 / 13.45 | 118.51 / 24.90 |  97.19 / 22.76 |
| chatglm-6b-int4   |  17.37 /  6.69 | 19.79 /  6.10 |  34.05 / 10.82 |  30.73 / 10.63 |
| chatglm2-6b-int4  |  26.41 /  8.21 | 20.78 /  6.70 |  36.99 / 11.50 |  33.25 / 11.47 |
| chatglm3-6b-int4  |  26.24 /  7.94 | 19.67 /  6.67 |  37.33 / 11.92 |  33.61 / 11.21 |
| qwen-7b-int4      |  14.60 /  6.96 | 19.79 /  6.06 |  33.55 / 10.20 |  29.05 / 9.62  |
| baichuan2-7b-int4 |  13.87 /  6.08 | 17.21 /  6.10 |  30.11 / 10.87 |  26.31 / 9.84  |
| llama-2-7b-int4   |  17.98 /  5.17 | 19.72 /  5.06 |  34.47 /  9.29 |  28.66 / 8.90  |

测试的系统和设备信息如下,

| os | device | CPU | Memory |
|:--:|:-------:|:----:|:--------:|
| android | XiaoMi12 | Snapdragon 8gen1 | 8 GB |
| macos | MacBook Pro 2019 | Intel(R) Core(TM) i7-9750H CPU | 16 GB |
| linux | PC | Intel(R) Core(TM) i7-13700K | 32GB |
| windows | PC | Intel(R) Core(TM) i7-13700K | 32GB |

# 3. Bugfix
## 3.1 关联 Github Issue 解决

- 修复MNN2.5.3版本后量化模型不能得到正确结果 ([issue-2614](https://github.com/alibaba/MNN/issues/2614))
- 修复tflite模型转换到MNN时重复算子检测卡死的问题 ([issue-2573](https://github.com/alibaba/MNN/issues/2573))
- 支持Pytorch FX 量化而得的 ONNX 模型转换 ([issue-2548](https://github.com/alibaba/MNN/issues/2548))
## 3.2 其他 Bugfix 或优化
### 工具类:

- 修复Defer Allocator 实际分配内存后未做成功与否的检查
- 修复量化工具中由index=-1导致的crash问题
- 修复模型转换工具在转大模型时会crash的问题
- 修复模型转换工具在转换ONNX模型的Clip算子时不能正确处理 int32_t数据的问题
- 修复使用OpenCL训练时的内存泄露问题
- OpenCL单测错误问题修复
### 编译兼容性问题:

- 修复在X86_x64下SSE指令不兼容导致的编译错误
- 修复IOS 工程文件中由于局部变量在线程函数外导致的编译错误
- 修复一些ARM编译器无法识别 "vmov.f16 q0, #5.0"导致的编译错误
### 结果错误(crash)类问题:

- 修复C++版本下Binary函数中(<=,<,>=,>,==)的返回值类型导致的结果错误
- 修复 1x1 Strassen矩阵在Low Memory时crash问题
- 修复coreML在deconvolution算子padding!=0时crash问题
- 修复 ModuleAPI在运行时使用 Defer Allocator来申请内存的问题