阿里巴巴开源轻量级深度神经网络推理引擎MNN
导读:在移动端进行深度神经网络推理,可以使用腾讯开源的ncnn,或者小米开源的Mace,还有百度家的Paddle- Mobile,他们可以帮助开发者在无需过多了解移动端CPU和GPU优化的情况下,快速部署充分利用硬件加速的应用。
刚刚,阿里巴巴也开源了一款工具MNN----Mobile Neural Network 轻量级的深度神经网络推理引擎,并且已经在阿里巴巴内部经过线上部署验证,值得大家参考!
简介
MNN是一个轻量级的深度神经网络推理引擎,在端侧加载深度神经网络模型进行推理预测。目前,MNN已经在阿里巴巴的手机淘宝、手机天猫、优酷等20多个App中使用,覆盖直播、短视频、搜索推荐、商品图像搜索、互动营销、权益发放、安全风控等场景。此外,IoT等场景下也有若干应用。
整体特点
轻量性
针对端侧设备特点深度定制和裁剪,无任何依赖,可以方便地部署到移动设备和各种嵌入式设备中。
iOS平台:armv7+arm64静态库大小5MB左右,链接生成可执行文件增加大小620KB左右,metallib文件600KB左右。
Android平台:so大小400KB左右,OpenCL库400KB左右,Vulkan库400KB左右。
通用性
支持
Tensorflow
、Caffe
、ONNX
等主流模型文件格式,支持CNN
、RNN
、GAN
等常用网络。支持86个
Tensorflow
Op、34个Caffe
Op;各计算设备支持的MNN Op数:CPU 71个,Metal 55个,OpenCL 29个,Vulkan 31个。支持iOS 8.0+、Android 4.3+和具有POSIX接口的嵌入式设备。
支持异构设备混合计算,目前支持CPU和GPU,可以动态导入GPU Op插件,替代CPU Op的实现。
高性能
不依赖任何第三方计算库,依靠大量手写汇编实现核心运算,充分发挥ARM CPU的算力。
iOS设备上可以开启GPU加速(Metal),常用模型上快于苹果原生的CoreML。
Android上提供了
OpenCL
、Vulkan
、OpenGL
三套方案,尽可能多地满足设备需求,针对主流GPU(Adreno
和Mali
)做了深度调优。卷积、转置卷积算法高效稳定,对于任意形状的卷积均能高效运行,广泛运用了 Winograd 卷积算法,对3x3 -> 7x7之类的对称卷积有高效的实现。
针对ARM v8.2的新架构额外作了优化,新设备可利用半精度计算的特性进一步提速。
易用性
有高效的图像处理模块,覆盖常见的形变、转换等需求,一般情况下,无需额外引入libyuv或opencv库处理图像。
支持回调机制,可以在网络运行中插入回调,提取数据或者控制运行走向。
支持只运行网络中的一部分,或者指定CPU和GPU间并行运行。
架构设计
MNN可以分为Converter和Interpreter两部分。
Converter由Frontends和Graph Optimize构成。前者负责支持不同的训练框架,MNN当前支持Tensorflow(Lite)、Caffe和ONNX(PyTorch/MXNet的模型可先转为ONNX模型再转到MNN);后者通过算子融合、算子替代、布局调整等方式优化图。
Interpreter由Engine和Backends构成。前者负责模型的加载、计算图的调度;后者包含各计算设备下的内存分配、Op实现。在Engine和Backends中,MNN应用了多种优化方案,包括在卷积和反卷积中应用Winograd算法、在矩阵乘法中应用Strassen算法、低精度计算、Neon优化、手写汇编、多线程优化、内存复用、异构计算等。
Benchmark性能测试结果记录
2019-2-18
华为 P10
Build Flags: ABI=arm64-v8a OpenMP=ON Vulkan=ON OpenCL=ON
MNN benchmark
Forward type: **CPU**
Warming up...
--------> Benchmarking... loop = 10
[ - ] vgg16.mnn max = 499.545ms min = 410.570ms avg = 445.868ms
[ - ] SqueezeNetV1.0.mnn max = 49.437ms min = 38.759ms avg = 43.901ms
[ - ] MobileNetV2_224.mnn max = 26.139ms min = 20.400ms avg = 24.489ms
[ - ] inception-v3.mnn max = 413.265ms min = 262.142ms avg = 306.542ms
[ - ] resnet-v2-50.mnn max = 240.009ms min = 152.649ms avg = 176.075ms
[ - ] mobilenet-v1-1.0.mnn max = 89.461ms min = 29.903ms avg = 41.547ms
MNN benchmark
Forward type: **Vulkan**
Warming up...
--------> Benchmarking... loop = 10
[ - ] vgg16.mnn max = 293.156ms min = 227.952ms avg = 240.050ms
[ - ] SqueezeNetV1.0.mnn max = 47.752ms min = 31.191ms avg = 37.727ms
[ - ] MobileNetV2_224.mnn max = 61.352ms min = 35.874ms avg = 46.321ms
[ - ] inception-v3.mnn max = 396.939ms min = 180.353ms avg = 349.952ms
[ - ] resnet-v2-50.mnn max = 214.694ms min = 100.377ms avg = 169.003ms
[ - ] mobilenet-v1-1.0.mnn max = 45.946ms min = 23.257ms avg = 33.217ms
小米 Max3
Hardware : Qualcomm Technologies, Inc SDM636
Build Flags: ABI=arm64-v8a OpenMP=ON Vulkan=ON OpenCL=ON
MNN benchmark
Forward type: **CPU**
Warming up...
--------> Benchmarking... loop = 10
[ - ] vgg16.mnn max = 1311.661ms min = 1248.531ms avg = 1255.455ms
[ - ] SqueezeNetV1.0.mnn max = 151.955ms min = 95.348ms avg = 101.986ms
[ - ] MobileNetV2_224.mnn max = 94.336ms min = 50.987ms avg = 58.299ms
[ - ] inception-v3.mnn max = 763.095ms min = 690.005ms avg = 698.674ms
[ - ] resnet-v2-50.mnn max = 453.710ms min = 389.649ms avg = 396.409ms
[ - ] mobilenet-v1-1.0.mnn max = 128.781ms min = 77.023ms avg = 83.134ms
MNN benchmark
Forward type: **Vulkan**
Warming up...
--------> Benchmarking... loop = 10
[ - ] vgg16.mnn max = 783.093ms min = 730.928ms avg = 736.894ms
[ - ] SqueezeNetV1.0.mnn max = 96.435ms min = 61.809ms avg = 65.574ms
[ - ] MobileNetV2_224.mnn max = 71.107ms min = 43.912ms avg = 46.925ms
[ - ] inception-v3.mnn max = 436.363ms min = 386.338ms avg = 391.818ms
[ - ] resnet-v2-50.mnn max = 303.728ms min = 262.706ms avg = 267.613ms
[ - ] mobilenet-v1-1.0.mnn max = 89.119ms min = 56.216ms avg = 59.725ms
开源地址:
https://github.com/alibaba/MNN
作者暂无likerid, 赞赏暂由本网站代持,当作者有likerid后会全部转账给作者(我们会尽力而为)。Tips: Until now, everytime you want to store your article, we will help you store it in Filecoin network. In the future, you can store it in Filecoin network using your own filecoin.
Support author:
Author's Filecoin address:
Or you can use Likecoin to support author: