2.6.0

alibaba/MNN2.6.0Jul 5, 2023by github-actions[bot]

AI Summary

MNN 2.6.0 adds comprehensive int8 quantization operator support, OpenCL recordable queue adaptation for Qualcomm GPUs, and low memory inference mode supporting ChatGLM-6B in 3GB.

Key Highlights

  • 新增int8量化算子: Softmax、Interp、Binary、Unary、Scale
  • OpenCL支持高通record queue降低GPU Command Buffer创建时间
  • x86_64支持GELU-bf16
  • CUDA支持bf16模型推理
  • Benchmark工具支持直接测试量化后模型性能
  • Pymnn Tensor/Var使用Tuple支持混合类型数据
  • 权值量化模型低内存推理模式(ChatGLM-6B仅需3GB内存)
  • 稀疏卷积内存优化
  • 减少异构运行时的常量内存占用
  • CUDA int8算子性能优化
  • AVX512-VNNI下ConvolutionInt8及im2col分块大小调整(性能提升20%-30%)
  • x86 bilinear/nearest sample的SIMD实现(ImageProcess性能提升50%左右)

New Features

  • int8量化算子(Softmax/Interp/Binary/Unary/Scale)
  • OpenCL Loop算子(BatchMatMul/Gather)
  • x86_64 GELU-bf16
  • CUDA bf16推理
  • Benchmark量化模型测试
  • 低内存推理模式(ChatGLM-6B 3GB)
  • 稀疏卷积优化
  • CUDA int8优化
  • AVX512-VNNI优化
  • x86 SIMD ImageProcess

Full Release Notes

# 1. 新特性
- 新增int8量化算子支持:
   - Softmax
   - Interp
   - Binary
   - Unary
   - Scale
- OpenCL 支持 Loop 算子特定情形;
   - BatchMatMul
   - Gather
- x86_64支持Gelu-bf16;
- CUDA支持bf16模型推理;
- benchmark 工具支持直接测试模型量化后的性能(不需要先用量化工具量化模型)
- Pymnn Tensor/Var使用Tuple创建时支持混合类型数据;
- 权值量化模型支持低内存推理模式,计算时反量化;
   - 支持ChatGLM-6B模型推理内存占用3G;
   - 支持构建了ChatGLM-MNN Android app;
# 2. 优化

- OpenCL支持高通reocrd queue ,以降低创建 GPU Command Buffer 所需的时间;

Oneplus 9 机型 Benchmark 测试结果如下

| **Model** | **unrecord** | **record** |
| --- | --- | --- |
| resnet-v2-50.mnn | 21.254 | 20.160 |
| MobileNetV2_224.mnn | 4.853 | 4.186 |
| mobilenet-v1-1.0.mnn | 6.424 | 5.315 |
| nasnet.mnn | 46.751 | 20.260 |
| SqueezeNetV1.0.mnn | 7.35 | 6.832 |
| squeezenetv1.1.mnn | 3.936 | 3.693 |
| mobilenetV3.mnn | 14.201 | 6.743 |
| inception-v3.mnn | 33.111 | 32.032 |

- 稀疏卷积内存优化,降低内存占用;
- 减少异构(CPU低精度/GPU)运行 MNN 模型时的常量内存占用;
- CUDA优化int8算子性能;
- 减少Permute几何计算产生的region数量;
- 重新调整ConvolutionInt8及im2col在AVX512-VNNI下的分块大小,提升性能20%-30%;
- X86新增bilinear/nearest sample的SIMD实现,提升ImageProcess性能 50% 左右;
# 3. Bugfix
## 3.1 关联 Github Issue 解决

- 修复CUDA Raster错误导致输出为0的问题;[issue-2333](https://github.com/alibaba/MNN/issues/2333)
- 修复OpenCL Gather算子出错的问题;[issue-2424](https://github.com/alibaba/MNN/issues/2424)
- 修复ImageProcess出错的问题;[issue-2386](https://github.com/alibaba/MNN/issues/2386)
- OpenCL支持用户选择device id; [issue-2343](https://github.com/alibaba/MNN/issues/2343)
## 3.2 其他 Bugfix

- CUDA CMakeList对未支持架构增加报错信息;
- testMNNFromOnnx脚本在模型测试正确时不启用DEBUG模式;
- load_module_from_file中的shape_mutable默认改为True(存在子图的模型无法在False情形下运行);
- MNNConvert使用keepInputFormat选项时,也同时将输出Tensor的format转换为原始格式
- 修复log记录时设备为空时Crash的情况;
- 修复BinaryOp单元测试在Windows下无法编译的问题;
- 修复MNN_SUPPORT_DEPRECATED_OP宏不控制OptimizedComputer的问题;
- 修复fp16多线程且分块方向为channel时convolution计算出错的问题;
- 修复deconvolutionInt8访存越界的问题;
- 修复TensorArrayWrite几何计算产生zero region的问题;
- 修复CUDA depthwise conv出错的问题;
- 修复一些文档格式、内容的错误;
- 修复多线程下createRuntime和setGlobalConfig出错的问题;
- 修复Vec.hpp中无用代码导致的编译失败问题;
- 修复OpenCL对gpuDevice的assert失败的问题;
- 修复OpenCL bianry mod出错的问题;
- 修复CUDA argmax出错的问题;
- 修复pymnn/example/mnn_numpy_cv_demo.py中形状不对的问题;