初探MNN

初探MNN

伴随着大量人工智能项目的落地,业界对端上推理的需求也越来越旺盛。在之前的文章中介绍过OpenCV的DNN模块,目前开源的端上推理引擎除了OpenCV的DNN之外,还有tensorFlow-lite、paddle-lite、NCNN、MNN等多个推理框架。目前端上推理引擎主要支持CPU及端上GPU,主流的的设备是CPU(arm)+GPU(mali qualcomm powerVR),主要的编程语言包括c、neon、汇编、OpenCL、OpenGL、vulkan,其中前三种主要是针对CPU的优化,后三种是GPU编程语言。本系列文章将对MNN架构进行逐步剖析,通过对源代码的分析,更加深入的理解推理引擎及优化的技术细节。
与之前文章不同的是,在之后的文章中,我会尽量少贴源代码,更多的以图的形式来展示代码原理,关于代码的注释,我会在github上新开一个分支来存放带有注释的代码,感兴趣的朋友可以自己clone阅读。这篇文章主要通过跑通MNN的benchmark对MNN进行简单介绍。

MNN benchmark

MNN的benchmark做的非常棒,用起来很方便。

  • 配置NDK(在benchmark目录下的bench_android.sh文件中指定NDK的路径export ANDROID_NDK=youpath)
  • 把目标手机链接到电脑上,使用adb连接
  • 拷贝benchmark/model目录下的model到手机的/data/local/tmp/bench_models目录下
  • 直接运行bench_android.sh

运行结束便可以在benchmark目录下看到运行结果;结果保存在benchmark.txt文件中。如下是笔者运行的结果,笔者使用的机器是SDM710,测试的网络是resnet-v2-50:

Hardware	: Qualcomm Technologies, Inc SDM710

Build Flags: ABI=armeabi-v7a OpenMP=ON Vulkan=ON OpenCL=ON
MNN benchmark
Forward type: **CPU** thread=4** precision=2
--------> Benchmarking... loop = 1
[ - ] resnet-v2-50.mnn            max =  338.381ms  min =  338.381ms  avg =  338.381ms
MNN benchmark
Forward type: **Vulkan** thread=4** precision=2
--------> Benchmarking... loop = 1
Vulkan don't support 68, Reduction: resnet_v2_50/pool5
[ - ] resnet-v2-50.mnn            max =  164.605ms  min =  164.605ms  avg =  164.605ms

这是cpu和vulkan的对比,可以看到vulkan目前有一个layer不支持。感兴趣的读者可以测试其他模型以及OpenCL和OpenGL的性能表现。MNN支持的模型是.mnn格式的,除了官方提供的模型之外,其他模型需要用户使用其convert工具生成,该工具对网络进行了层间融合等优化,生成的是一个序列化的文件。之后我们会详细介绍该工具。

完成了benchmark的运行之后,我们便从benchmark.cpp入手,简单极少其运行机制。

MNN运行机制简介

benchmark.cpp的文件很简单,也很清晰。很容易发现程序的核心部分是

std::vector<float> doBench(Model& model, int loop, int forward = MNN_FORWARD_CPU, bool only_inference = true,
                           int numberThread = 4, int precision = 2)

该函数中的运行过程如下:

read model-->create Net(Interpreter) --> 配置backend --> create session --> config input and output --> run session --> finished

看起来很清爽,接下来我们来一一介绍这个过程中所涉及的类及其运行机

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值