MNN介绍、安装和编译简介

一、MNN介绍

引言:随着移动端应用的广泛普及和深度学习技术的不断发展,如何提升移动端深度学习的推断速度和准确性成为一个亟待解决的问题。而MNN (Mobile Neural Network)作为一个开源的轻量级深度学习推理框架,在此时应运而生。MNN基于C++语言实现,支持多种硬件加速,通用性强,能够广泛运用于各种智能终端设备。本文将对MNN进行详细的介绍,并介绍如何安装和编译MNN,最后探讨一下MNN的优缺点和适用场景,以及未来的发展趋势。 

1.1 MNN是什么
MNN是一个轻量级的深度学习推理框架,是阿里巴巴开源的神经网络推理引擎。它支持常见的神经网络模型,如CNN、RNN、SSD、FC等,并提供了C++和Python API进行模型的部署与调用。

1.2 MNN能做什么
MNN可以用于深度学习模型的推理,支持在移动端和嵌入式设备上进行高效的推理计算。使用MNN,可以将训练好的模型部署到移动端或者嵌入式设备上,使得对模型的推理计算更加高效和实时。

1.3 MNN的优势
1.3.1 轻量级
MNN的代码量少,库文件小,是一个轻量级的深度学习推理框架,便于移植和部署。

1.3.2 高效性
MNN的优化算法有三个层次,分别是离线、动态和稳定三个层次,使得计算速度更快。

1.3.3 适配性
MNN支持多种硬件平台和操作系统,并针对不同设备的特点进行优化适配,如ARM、x86、GPU等,能够很好地适配到各种硬件平台上。

1.3.4 开源
MNN是阿里巴巴开源的神经网络推理引擎,具有优秀的开源社区和开源生态系统,拥有众多社区开发者和用户使用并维护该项目,代码质量得到了保障。

二、MNN安装

2.1 安装必要的依赖
在安装MNN之前,需要确保系统已经安装了一些必要的依赖库,如:CMake、Protobuf、FFmpeg等。这些库将会在MNN的编译中用到。

2.2 获取源代码
从MNN的官方Github页面上将MNN的源代码下载到本地,可以使用git clone命令进行下载,也可以直接从网页上下载zip包并解压缩。

2.3 编译源代码
进入到MNN源代码所在的目录,使用cmake构建并编译源代码。MNN使用CMake来管理项目。CMake是一个跨平台的自动化编译系统,可以生成操作系统、编译器、库的编译文件。

在终端中执行以下命令:

cd MNN
mkdir build
cd build
cmake ..
make

这个命令会在MNN的build目录下生成MNN的动态库和静态库。为了方便使用,建议将静态库和动态库都编译。

如果需要编译特定平台的版本(例如Android、iOS),可以使用以下命令:

mkdir build
cd build
cmake .. -DCMAKE_TOOLCHAIN_FILE=../tools/android-cmake/android.toolchain.cmake -DANDROID_ABI="armeabi-v7a" -DANDROID_STL=c++_static -DANDROID_NATIVE_API_LEVEL=21
make

其中,DCMAKE_TOOLCHAIN_FILE选项是指定使用的交叉编译工具链文件,DANDROID_ABI选项是指定编译的平台架构,可以选择多种平台架构,例如:armeabi-v7a、arm64-v8a、x86等,DANDROID_STL选项是指定编译时使用的STL库,可以使用默认的或者指定为c++_static、c++_shared等,DANDROID_NATIVE_API_LEVEL选项是指定编译的Android最低API级别。同样,对于iOS平台,可以使用-xcode选项。

三、MNN编译

MNN提供了两种编译方式:完整编译和增量编译。

3.1 完整编译
完整编译会重新编译整个项目,并重新打包生成最终的库文件。这种方式对于初次编译或者需要更换硬件平台的场景比较适用。

执行完整编译的命令如下:

make clean
make

3.2 增量编译
增量编译是指只编译修改的文件,不重新编译整个项目。这种方式适用于项目比较大,需要频繁修改和调试的场景。

执行增量编译的命令如下:

make

注意:当修改头文件或者cmake脚本时,仍然需要进行完整编译,否则编译可能不会被更新。

3.3 编译参数说明
在CMakeLists.txt中MNN编译时,可以通过设置-D选项来修改编译参数,常用参数如下:

- -DMNN_BUILD_SHARED_LIBS:编译为动态库,否则编译为静态库。
- -DMNN_BUILD_CONVERTER:编译模型转换工具。
- -DMNN_BUILD_TEST:编译测试程序。
- -DMNN_BUILD_QUANTOOL:编译量化工具。
- -DMNN_BUILD_TRAIN:编译训练工具。
- -DMNN_USE_THREADPOOL:开启线程池优化。
- -DMNN_CPU_NUM:设置线程数。

例如,开启线程池优化和设置线程数的命令如下:

cmake .. -DMNN_USE_THREADPOOL=ON -DMNN_CPU_NUM=4

此命令开启了线程池,并设置最大线程数为4。

四、MNN使用

MNN的使用包括模型格式、模型转换工具和C++ API使用三个方面。

4.1 MNN模型格式
MNN支持多种深度学习框架的模型格式,包括:TensorFlow、Caffe、ONNX、TFLite等。MNN还自己定义了自己的模型格式,称为MNN模型格式(MNNNet.pb)。

MNN模型格式可以通过MNN提供的模型转换工具转换成其他深度学习框架的模型格式,也可以转换成适合MNN使用的MNN模型格式。

4.2 可用模型转换工具
MNN提供了多个模型转换工具,可用于将其他深度学习框架的模型格式转换成MNN模型格式,如:

- MNNConvert:用于转换模型格式,支持Caffe、ONNX、TensorFlow、TFLite等框架模型的转换。
- MNNQuantize:用于量化模型,支持INT8和FLOAT16两种量化模式。
- MNNOpConverter:用于将运算符转换成MNN支持的运算符。

4.3 MNN的C++ API使用
在使用MNN C++ API时,需要先加载模型,然后再调用MNN的推理函数进行推理。

加载模型时,需要使用MNN提供的Interpreter接口,示例代码如下:

#include <MNN/Interpreter.hpp>
#include <MNN/Tensor.hpp>
#include <MNN/ImageProcess.hpp>
auto net = std::shared_ptr<MNN::Interpreter>(MNN::Interpreter::createFromFile(modelPath.c_str()));
MNN::ScheduleConfig config;
config.type = MNN_FORWARD_AUTO;
auto session = net->createSession(config);

推理函数是可以根据需求进行调用的,常用函数如下:

- runSession:用于执行一次推理任务。
- runSessionWithCallBack:用于执行一次推理任务,可以在运行过程中添加回调函数。
- runSessionWithCallBackInfo:用于执行一次推理任务,可以在运行过程中添加回调函数,并得到回调函数的返回值。

推理过程中,MNN还提供了多种Tensor和ImageProcess工具,便于用户对输入与输出数据的处理。

Tensor是MNN中处理数据的基本类型,用于表示二维或三维数据,可以通过MNN提供的TensorUtils类中的函数来完成Tensor的创建,介绍如下:

#include <MNN/Tensor.hpp>
#include <MNN/TensorUtils.hpp>
auto dimType = MNN::CPU;
auto t = new MNN::Tensor(dimType, {1, 3, 224, 244}, MNN::DataType_MNN_INT8);
t->setLength(0, 1);
t->setDimensionType(1, MNN::Tensor::TENSOR_WIDTH);
t->setLength(2, 224);
t->setLength(3, 244);

对于图像的输入数据,MNN提供了方便的ImageProcess类,用于处理图片的加载、缩放、裁剪等操作,示例代码如下:

#include <MNN/ImageProcess.hpp>
using namespace MNN::CV;
// 定义输入图像尺寸与格式
int inputWidth = 224;
int inputHeight = 224;
int offsetX = 0;    // x轴偏移
int offsetY = 0;    // y轴偏移
auto inputTensor = net->getSessionInput(session, nullptr);    // 获取输入Tensor
// 创建ImageProcess对象
auto process = std::shared_ptr<ImageProcess>(ImageProcess::create(inputTensor));
process->setMatrix(0, _transformMat, 3, 3);
const int bytes_per_pixel = 4;
unsigned char inputData[inputWidth * inputHeight * bytes_per_pixel];
//.... 读取输入数据,并填入inputData中
// 图像的缩放/裁剪/格式转换 加载到Process
process->convert(inputData, inputWidth, inputHeight, offsetX, offsetY, inputWidth, inputHeight, RGB, true/*keep shape*/);
process->process(inputTensor);

MNN还提供了很多其他的API接口,用户可以根据自己的需求进行调用。

五、MNN总结

5.1 优势和不足
优势:
- MNN的速度和准确性都很出色,在移动设备上的推理速度明显高于其他框架。
- MNN支持的模型格式范围广泛,可以通过模型转换工具转换成其他深度学习框架支持的模型格式。
- MNN自带许多工具,可以用于模型量化、模型转换等,功能完善。
- MNN支持各种硬件加速,可以很好的与各种硬件结合使用。

不足:
- MNN的社区相对较小,可能存在部分问题无法得到快速解决。
- MNN的文档较少,开发者需要花时间去熟悉MNN的源码。
- MNN在一些复杂场景下的支持不够完善。

5.2 MNN的应用场景
MNN的适用场景包括但不限于以下领域:
- 移动端物体检测、图像分类及其他深度学习任务。
- 智能穿戴设备、智能家电等嵌入式设备。

5.3 MNN未来的发展趋势
作为一个全新的深度学习框架,MNN尚处于成长阶段,但发展前景十分广阔,未来可期。未来MNN的发展趋势主要包括以下几个方面:

- 模型应用领域的拓展:MNN未来将会拓展到智能语音、NLP等更多领域。
- 硬件加速和性能优化:MNN未来将会根据不同的硬件平台进行特定的硬件加速和性能优化。
- 增加社区开发参与度:MNN未来将会吸引更多开发者投入其中,提高社区开发参与度。
- 增强文档的完善度:MNN未来将会完善文档,为开发者提供更好的使用体验。
- 兼容更多的深度学习框架:MNN未来将会兼容更多深度学习框架的模型格式,实现更加丰富的功能。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值