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来申请内存的问题