MNN是全平台轻量级高性能深度学习引擎,广泛支持了阿里巴巴在计算机视觉、语音识别技术、自然语言处理等领域的70多个AI应用场景,包含淘宝搜索、拍立淘、淘宝直播、AR导购等,日调用量达十亿量级。
整体特点
轻量性
- 主体功能(模型推理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 训练模块,支持各平台训练
License
Apache 2.0
致谢
MNN参与人员:淘宝技术部、搜索工程团队、达摩院团队、优酷等集团员工。
MNN参考、借鉴了下列项目: