一、关于 MNN
MNN是一个轻量级的深度神经网络引擎,支持深度学习的推理与训练。适用于服务器/个人电脑/手机/嵌入式各类设备。
目前,MNN已经在阿里巴巴的手机淘宝、手机天猫、优酷等30多个App中使用,覆盖直播、短视频、搜索推荐、商品图像搜索、互动营销、权益发放、安全风控等场景。
- 官网:https://www.mnn.zone/
- github : https://github.com/alibaba/MNN
- 中文说明: https://github.com/alibaba/MNN/blob/master/README_CN.md
- 官方文档:https://mnn-docs.readthedocs.io/en/latest/index.html
语雀版:https://www.yuque.com/mnn/cn - 论文地址: https://proceedings.mlsys.org/static/paper_files/mlsys/2020/7-Paper.pdf
- 快速开始
https://mnn-docs.readthedocs.io/en/latest/start/overall.html - Python API使用
https://mnn-docs.readthedocs.io/en/latest/inference/python.html - MNN Python API
https://mnn-docs.readthedocs.io/en/latest/pymnn/MNN.html - Python工具
https://mnn-docs.readthedocs.io/en/latest/tools/python.html#mnnconvert
相关文档
- MLSys 2020 | 支撑亿级终端设备,阿里淘系端上开源推理引擎MNN解读
https://mp.weixin.qq.com/s/ZmKC4fHTNPUj5iGqag19HA - mnn-llm : llm deploy project based mnn.
https://github.com/wangzhaode/mnn-llm
架构
Concept
在阿里巴巴中,MNN被用作为Walle系统中计算容器的基础模块。Walle是首个端到端、通用型、规模化产业应用的端云协同机器学习系统,发表于操作系统顶会OSDI 2022。
Walle的论文中解释了MNN的关键设计理念,并提供了MNN相对于其他深度学习框架(TensorFlow, TensorFlow Lite, PyTorch, PyTorch Mobile, TVM)的benchmark测试结果。相关测试脚本和说明文档被放在“/benchmark”目录下。
如果MNN或Walle的设计对你的研究或生产有所助益,欢迎引用我们的OSDI论文:
整体特点
轻量性
- 主体功能(模型推理CPU+GPU)无任何依赖,代码精简,可以方便地部署到移动设备和各种嵌入式设备中。
- iOS平台:功能全开的MNN静态库 armv7+arm64大小12MB左右,链接生成可执行文件增加大小2M左右。可裁剪主体功能后静态库大小6.1M ,链接生成可执行文件增加大小 600 KB。
- Android平台:主体功能 armv7a - c++_shared 动态库大小800KB左右。
- 支持采用 Mini 编辑选项进一步降低包大小,大约能在上述库体积基础上进一步降低 25% 左右。
- 支持模型FP16/Int8压缩与量化,可减少模型50% - 75% 的体积
通用性
- 支持 Tensorflow、Caffe、ONNX、Torchscripts 等主流模型文件格式,支持CNN / RNN / GAN / Transformer 等主流网络结构。
- 支持多输入多输出,支持任意维度的输入输出,支持动态输入(输入大小可变),支持带控制流的模型
- 算子丰富,支持 178 个Tensorflow Op、52个 Caffe Op、163个 Torchscipts Op、158 个 ONNX Op(ONNX 基本完整支持)
- 支持 服务器 / 个人电脑 / 手机 及具有POSIX接口的嵌入式设备,支持使用设备的 CPU / GPU 计算,支持部分设备的 NPU 计算(IOS 11 + CoreML / Huawei + HIAI / Android + NNAPI)
- 支持 Windows / iOS 8.0+ / Android 4.3+ / Linux 及具有POSIX接口的操作系统
高性能
- 对iOS / Android / PC / Server 的CPU架构进行了适配,编写SIMD代码或手写汇编以实现核心运算,充分发挥 CPU的算力,单线程下运行常见CV模型接近设备算力峰值
- 支持基于 Metal / OpenCL / Vulkan 使用移动端设备上的GPU进行推理
- 支持基于 CUDA 使用 PC / Server 上的 NVIDIA GPU 实现更快速的推理
- 广泛运用了 Winograd 卷积算法提升卷积性能,首次在业界工程实践中实现转置卷积的Winograd算法优化与矩阵乘的Strassen算法优化,并取得加速效果
- 支持低精度计算( int8 / fp16 / bf16)以提升推理性能。并对 ARMv8.2 和 AVX512架构的相关指令进行了适配,这两种架构下有更好的加速效果
易用性
- 支持使用 MNN 的算子进行常用的数值计算,覆盖 numpy 常用功能
- 提供 MNN CV 模块,支持图像仿射变换与归一化等 MNN_CV 库,支持常用的图像处理(armv7a 架构下小于 100 k )
- 支持各平台下的模型训练,尤其是移动端上的模型训练
- 支持 python 调用
工具
基于MNN (张量计算引擎),提供了一系列工具,以支持模型推理、训练和通用计算:
- MNN-Converter:模型转换工具,由Frontends和Graph Optimize构成。前者负责支持不同的训练框架,MNN当前支持Tensorflow(Lite)、Caffe、ONNX(PyTorch/MXNet的模型可先转为ONNX模型再转到MNN)和Torchscripts;后者通过算子融合、算子替代、布局调整等方式优化图,一般离线运行。
- MNN-Compress: 模型压缩工具,在一定的精度误差许可下,对MNN模型进行压缩,减少模型体积,提升运行性能。
- MNN-Express :支持带控制流的模型运行,支持调用 MNN 的算子进行自定义的计算。
- MNN-CV :类似 OpenCV ,但核心计算功能基于 MNN 实现的图像处理算法库
- MNN-Train :MNN 训练模块,支持各平台训练
Pymnn是MNN的Python版本,其中将部分MNN工具封装成了MNNTools
,MNNTools模块主要有以下工具:
- mnn
- mnnconvert
- mnnquant
二、Python API使用
MNN在C++的基础上,增加了Python扩展。
扩展单元包括两个部分:
- MNN:负责推理,训练,图像处理和数值计算
- MNNTools:对MNN的部分工具进行封装,包括:mnn,mnnconvert 和 mnnquant
MNN submodules
MNN Types
安装
MNN在C++的基础上,增加了Python扩展。扩展单元包括两个部分:
- MNN:负责推理,训练,图像处理和数值计算
- MNNTools:对MNN的部分工具进行封装,包括:mnn,mnnconvert和mnnquant
参考:
- Pymnn构建:https://mnn-docs.readthedocs.io/en/latest/compile/pymnn.html
- 主库编译 https://mnn-docs.readthedocs.io/en/latest/compile/engine.html
方式一:使用源码安装
# 下载源码
git clone https://github.com/alibaba/MNN.git
# 主库编译 - Linux/MacOS
# 准备
cd /path/to/MNN
./schema/generate.sh
./tools/script/get_model.sh # 可选,模型仅demo工程需要
# 本地编译
mkdir build && cd build && cmake .. && make -j8
cd MNN/pymnn/pip_package
python build_deps.py
# python setup.py install --version {MNN版本}
python setup.py install --version 2.8.1
我在 macOS 上安装报错,没有 libMNN.dylib
Library not loaded: @rpath/libMNN.dylib
https://github.com/wangzhaode/mnn-llm/issues/52
建议使用 linux 编译
方式二:使用 pip
安装
# 外部版本安装
pip install MNN
pip install MNN==$version
# 公司内部版本安装
pip install -i https://artifacts.antgroup-inc.cn/simple/ MNN-Internal==$version
我在 macOS 上没有安装成功,所以无法测试后续
2024-03-28(四)