简介
MNN 是一个高效且轻量级的深度学习框架。它支持深度学习模型的推理和训练,并在设备端推理和训练方面具有行业领先的性能。目前,MNN 已集成到阿里巴巴的 30 多个应用中,如淘宝、天猫、优酷、钉钉、闲鱼等,覆盖了超过 70 种使用场景,如直播、短视频拍摄、搜索推荐、以图搜物、互动营销、权益分发、安全风控。此外,MNN 还用于嵌入式设备,如物联网设备。
在阿里巴巴内部,MNN 作为计算容器 Walle 系统的基础模块使用,这是首个设备云协作的通用型大规模生产系统,并已在顶级系统会议 OSDI’22 上发布。MNN 的关键设计原则和广泛的基准测试结果(与 TensorFlow、TensorFlow Lite、PyTorch、PyTorch Mobile、TVM 对比)可在 OSDI 论文中找到。基准测试的脚本和说明已放置在路径“/benchmark”中。如果 MNN 或 Walle 的设计对您的研究或生产有帮助,请引用我们的 OSDI 论文:
@inproceedings {proc:osdi22:walle,
author = {Chengfei Lv and Chaoyue Niu and Renjie Gu and Xiaotang Jiang and Zhaode Wang and Bin Liu and Ziqi Wu and Qiulin Yao and Congyu Huang and Panos Huang and Tao Huang and Hui Shu and Jinde Song and Bin Zou and Peng Lan and Guohuan Xu and Fei Wu and Shaojie Tang and Fan Wu and Guihai Chen},
title = {Walle: An {End-to-End}, {General-Purpose}, and {Large-Scale} Production System for {Device-Cloud} Collaborative Machine Learning},
booktitle = {16th USENIX Symposium on Operating Systems Design and Implementation (OSDI 22)},
year = {2022},
isbn = {978-1-939133-28-1},
address = {Carlsbad, CA},
pages = {249--265},
url = {https://www.usenix.org/conference/osdi22/presentation/lv},
publisher = {USENIX Association},
month = jul,
}
文档和工作台
MNN 的文档可以在 Yuque 文档 和 Read the docs 中找到。
MNN 工作台可以从 MNN 的首页 下载,提供预训练模型、可视化训练工具,以及一键将模型部署到设备的功能。
关键特性
轻量级
- 针对设备优化,无依赖项,可以轻松部署到移动设备和各种嵌入式设备。
- iOS 平台:静态库大小(armv7+arm64 平台,包含所有选项)约为 12MB,链接可执行文件大小增加约为 2M。
- 安卓平台:核心 so 文件大小约为 800KB(armv7a - c++_shared)。
- 使用 MNN_BUILD_MINI 可以减少包大小约 25%,固定模型输入大小有限制。
- 支持 FP16 / Int8 量化,可以减少模型大小 50%-70%。
通用性
- 支持
Tensorflow
、Caffe
、ONNX
、Torchscripts
,支持常见神经网络如CNN
、RNN
、GAN
、Transformer
。 - 支持多输入或多输出的 AI 模型,各种维度格式,动态输入,控制流。
- MNN 支持几乎全部 AI 模型使用的操作符。转换器支持 178 个
Tensorflow
操作符,52 个Caffe
操作符,163 个Torchscripts
操作符,158 个ONNX
操作符。 - 支持 iOS 8.0+、Android 4.3+ 和带有 POSIX 接口的嵌入式设备。
- 支持在多个设备上进行混合计算。目前支持 CPU 和 GPU。
高性能
- 核心计算使用大量优化的汇编代码,充分利用 ARM / x64 CPU。
- 使用 Metal / OpenCL / Vulkan 支持移动设备上的 GPU 推理。
- 使用 CUDA 和 tensorcore 支持 NVIDIA GPU 以获得更好的性能。
- 卷积和转置卷积算法高效且稳定。广泛使用 Winograd 卷积算法来更好地处理对称卷积,如 3x3、4x4、5x5、6x6、7x7。
- 新架构 ARM v8.2 支持 FP16 半精度计算时,速度提升两倍。使用 ARM v8.2 和 VNNI 的 sdot 指令,速度提升至 2.5 倍。
易用性
- 支持使用 MNN 的操作符进行类似 numpy 的数值计算。
- 支持类似 OpenCV 的轻量级图像处理模块,只有 100k。
- 支持在 PC / 移动设备上构建模型并进行训练。
- MNN Python API 帮助机器学习工程师轻松使用 MNN 进行推理、训练和图像处理,而无需涉足 C++ 代码。
MNN 支持的架构 / 精度如下:
- S :支持并运行良好,深度优化,推荐使用
- A :支持并运行良好,可使用
- B :支持但有 bug 或未优化,不推荐使用
- C :不支持
架构 / 精度 | Normal | FP16 | BF16 | Int8 | |
---|---|---|---|---|---|
CPU | 原生 | 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(ARMv8.6) | 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 | B | C | C |
HIAI | B | C | C | B | |
NNAPI | B | B | C | C |
工具
基于 MNN(张量计算引擎),我们提供了一系列推理、训练和通用计算的工具。
- MNN-Converter:将其他模型转换为 MNN 模型以进行推理,如 Tensorflow(lite)、Caffe、ONNX、Torchscripts。并进行图优化以减少计算。
- MNN-Compress:压缩模型以减少大小并提升性能 / 速度。
- MNN-Express:支持控制流的模型,使用 MNN 的操作符进行通用计算。
- MNN-CV:一个类似 OpenCV 的库,但基于 MNN,且更轻量。
- MNN-Train:支持训练 MNN 模型。
如何讨论并从 MNN 社区获得帮助
讨论群组主要为中文。但我们欢迎并将帮助说英语的用户。
钉钉讨论群:
群 #1(已满):23329087
群 #2(已满):23350225
群 #3:二维码:
历史论文
MNN 的初始版本作为移动推理引擎,聚焦于手动优化,并已在 MLSys 2020 发表。如果 MNN 之前对您的研究有所帮助,请引用该论文:
@inproceedings{alibaba2020mnn,
author = {Jiang, Xiaotang and Wang, Huan and Chen, Yiliu and Wu, Ziqi and Wang, Lichuan and Zou,