MNN - 轻量级高性能推理引擎

MNN是一个在阿里巴巴广泛应用的轻量级神经网络引擎,支持多种模型格式和设备,强调其轻量性、通用性、高性能和易用性。文章介绍了其在不同平台上的部署、支持的模型和运算,以及PythonAPI的使用方法和工具组件如MNN-Converter和Pymnn。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述


一、关于 MNN

MNN是一个轻量级的深度神经网络引擎,支持深度学习的推理与训练。适用于服务器/个人电脑/手机/嵌入式各类设备。

目前,MNN已经在阿里巴巴的手机淘宝、手机天猫、优酷等30多个App中使用,覆盖直播、短视频、搜索推荐、商品图像搜索、互动营销、权益发放、安全风控等场景。


相关文档


架构

在这里插入图片描述


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

参考:


方式一:使用源码安装

# 下载源码 
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(四)

03-21
### MNN框架概述 MNN(Mobile Neural Network)是一款阿里巴巴推出的轻量级深度学习端侧推理引擎[^2]。其设计目标是解决深度神经网络模型在移动端和其他资源受限设备上的高效运行问题。它不仅能够完成模型的优化和转换,还提供了强大的推理能力以及训练支持。 #### 核心特性 - **轻量性**:MNN文件大小通常仅为几兆字节,便于部署于移动设备和嵌入式硬件上[^3]。 - **通用性**:支持TensorFlow、Caffe、ONNX等多种主流模型格式,并兼容CNN、RNN、GAN等常见网络结构。 - **高效性**:通过高度优化的手写汇编代码实现核心运算,显著提升了执行效率。 - **易用性**:提供丰富的API接口,包括图像处理模块和支持回调机制的功能,允许开发者灵活定制逻辑流程。 --- ### 主要组件及其功能 以下是MNN的主要组成部分及各自的作用: 1. **MNN-Converter** - 这是一个用于将不同框架下的模型转化为MNN格式的工具[^1]。 它分为两部分: - Frontends:适配多种前端框架(如TensorFlow Lite、Caffe、PyTorch via ONNX),使得这些框架导出的模型可以直接被MNN加载并使用。 - Graph Optimize:通过对计算图进行算子融合、替换操作以及布局调整来进一步提高性能表现。 2. **MNN-Compress** - 提供了一套针对MNN模型的压缩方案,在保持一定精度损失的前提下减小存储空间占用率的同时加快预测速度。 3. **MNN-Express** - 支持带有复杂控制流(Control Flow)的动态图模型运行,并允许用户借助内置算子构建自定义层或节点。 4. **MNN-CV** - 类似OpenCV的一个计算机视觉库,不过它的底层依赖完全基于MNN重写而成,从而实现了更紧密集成的效果。 5. **MNN-Train** - 集成了完整的训练流水线,让使用者能够在任意平台上无缝切换至生产环境中实际使用的相同架构上去调试参数配置等问题。 --- ### 如何快速入门? 为了帮助初学者更快地上手该技术栈,官方给出了详细的教程说明如何搭建开发环境以及跑通首个实例程序——人体姿态估计Demo。具体步骤如下所示: 1. 下载源码包后解压放置合适位置; 2. 确保已安装好Protobuf v3.x及以上版本作为序列化协议的支持基础; 3. 执行命令进入工作目录`cd mnn && cd schema && ./generate.sh`生成描述文件; 4. 创建临时构建区`mkdir build && cd build`接着调用CMake工具指定选项开关开启样例工程编译模式`cmake -DMNN_BUILD_DEMO=ON ..`; 5. 启动多核并发制造过程加速产出最终产物`make -j8`. 上述完成后即可获得可供测试用途的应用二进制文件! --- ### 示例代码展示 下面给出一段简单的Python脚本演示怎样加载预训练好的MNN权重文件并对输入图片做前向传播得到分类结果: ```python from MNN import Interpreter, Session def inference_mnn_model(mnn_path, input_data): interpreter = Interpreter(mnn_path) # 初始化解释器对象读取模型元信息 session = interpreter.createSession() # 构造会话句柄分配GPU/CPU资源 input_tensor = interpreter.getSessionInput(session) # 获取默认输入张量指针 tmp_input = input_tensor.host() for i in range(len(input_data)): tmp_input[i] = float(input_data[i]) / 255.0 # 归一化像素值范围 interpreter.runSession(session) # 开始正式推断环节 output_tensor = interpreter.getSessionOutput(session) # 抓取出最后输出特征映射表单 result = list(output_tensor.host())[:len(output_tensor)] return result.index(max(result)) # 返回最大概率对应的类别索引号 if __name__ == "__main__": model_file = "./example.mnn" test_image = [value for row in [[col for col in line.strip().split()] for line in open("./test.txt").readlines()] for value in map(int,row)] # 假设这里是从文本记录还原原始RGB数组形式的数据集样本之一 predicted_label = inference_mnn_model(model_file,test_image) print(f"The image is classified as class {predicted_label}.") ``` 此片段假设存在一个名为`./example.mnn`的目标识别系统保存下来的静态图表示法档案还有配套的一幅待测验的小尺寸灰阶照片存放在纯ASCII编码字符串里边等待解析成整数列表传进去函数内部参与后续处理动作链路当中去。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值