MNN是一个轻量级的深度神经网络推理引擎,加载深度神经网络模型进行推理预测。适用于服务器/个人电脑/手机/嵌入式各类设备。目前,MNN已经在阿里巴巴的手机淘宝、手机天猫、优酷等30多个App中使用,覆盖直播、短视频、搜索推荐、商品图像搜索、互动营销、权益发放、安全风控等场景。
MNN的架构设计理念与性能数据在MLSys 2020上面发表。Paper 在此处。如果MNN对你的研究有所助益,欢迎引用MNN的论文:
@inproceedings{alibaba2020mnn,
author = {Jiang, Xiaotang and Wang, Huan and Chen, Yiliu and Wu, Ziqi and Wang, Lichuan and Zou, Bin and Yang, Yafeng and Cui, Zongyang and Cai, Yu and Yu, Tianhang and Lv, Chengfei and Wu, Zhihua},
title = {MNN: A Universal and Efficient Inference Engine},
booktitle = {MLSys},
year = {2020}
}
MNN的使用文档统一放在语雀,请移步至语雀文档。
MNN官网上还可以下载MNN团队全新力作MNN工作台,涵盖开箱即用模型、可视化训练等工具,更可以一键部署到多端设备。
- 主体功能(模型推理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)
- 支持 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适配的硬件架构与精度详见下表:
- S :支持,深度优化并已有应用场景,推荐使用
- A :支持,有初步优化或已有应用场景,可以使用
- B :支持,无优化或在实验状态,不推荐使用
- C :不支持
Architecture / Precision | Normal | FP16 | BF16 | Int8 | |
---|---|---|---|---|---|
CPU | Native | B | C | B | B |
x86/x64-SSE4.1 | A | B | B | A | |
x86/x64-AVX2 | S | B | B | A | |
x86/x64-AVX512 | S | B | B | S | |
ARMv7a | S | S (ARMv8.2) | S | S | |
ARMv8 | S | S (ARMv8.2) | S | S | |
GPU | OpenCL | A | S | C | C |
Vulkan | A | A | C | C | |
Metal | A | S | C | C | |
CUDA | A | S | C | C | |
NPU | CoreML | B | C | C | C |
HIAI | B | C | C | B |
MNN可以分为主体(推理引擎)和工具两大部分。
MNN 的输入(AI推理模型)是一个有向无环图(DAG),图中每个节点称为算子,描述一种张量计算函数。推理引擎负责这个图的加载与执行,可分为调度(预推理)与执行(推理)两层:
- 调度:加载计算图并做预处理,以使执行过程高效
- 对模型中的算子进行预处理,降低算子数
- 搜索最优计算方案
- 进行资源分配
- 执行:实现算子,基于各类算法与不同硬件提供的并行接口进行优化,降低执行耗时
- 算法层面,采用 Winograd 卷积 / Strassen 矩阵乘 / 分段线性 / 低精度等方案
- 硬件层面,使用 CPU 的 SIMD指令 (SSE / NEON / AVX / AVX512) ,各类 GPU 计算 API 进行优化
- 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 训练模块,支持各平台训练
钉钉群组:
- 钉钉群1:23329087
- 钉钉群2:23350225
- 钉钉群3:https://h5.dingtalk.com/circle/healthCheckin.html?dtaction=os&corpId=ding8989a1d6ae6ef130b177420cc0e366ea&f0c81=1b93a&cbdbhh=qwertyuiop
Apache 2.0
MNN参与人员:淘宝技术部、搜索工程团队、达摩院团队、优酷等集团员工。
MNN参考、借鉴了下列项目: