MNN初探
- MNN介绍
- 开始
- 编译
- Benchmark工具
MNN介绍
MNN(Mobile Neural Network)是一个轻量级的深度神经网络推理引擎,在端侧加载深度神经网络模型进行推理预测。针对端侧设备特点深度定制和裁剪,无任何依赖,可以方便地部署到移动设备和各种嵌入式设备中。以上两句为MNN的官方描述,小弟对其优秀的端侧推理能力十分感兴趣。
开始
MNN git 地址:
https://github.com/alibaba/MNN.git
官方文档(语雀):
先查看git目录下的README.md 及 快速浏览了官方文档。认识了个大概,准备开gan;
- 打开我的MobaXterm连接上Linux服务器,进入此前编译tflite 2.3.1的docker容器,拉取最近的发布版本;
cd /home
git clone -b 1.1.0 https://github.com/alibaba/MNN.git
- 拉取完成后,准备编译,查看官方文档,编译环境要求;
- cmake(建议使用3.10或以上版本)
- protobuf(使用3.0或以上版本)
- gcc(使用4.9或以上版本)
# 编译环境检查
cmake --version
protoc --version
gcc --version
所用机器检查结果:
编译
- Linux 版本:
# 参考官方文档步骤
cd /path/to/MNN
./schema/generate.sh
./tools/script/get_model.sh
mkdir build && cd build && cmake .. && make -j8
编译完成后,可在build目录下看到libMNN.so,可用file命令查看相应信息:
file libMNN.so
- Android版本
查看官方文档,需要安装NDK;
找出珍藏的android-ndk-r19b-linux-x86_64.zip,传进docker容器,解压并配置NDK路径;
mkdir /home/build_tools
cd build_tools
cp ndk目录/android-ndk-r19b-linux-x86_64.zip ./
unzip android-ndk-r19b-linux-x86_64.zip ./
vim ~/.bashrc
export ANDROID_NDK=/Users/username/path/to/android-ndk-r19b
source ~/.bashrc
# 编译库
cd /path/to/MNN
./schema/generate.sh
cd project/android
# armv7动态库
mkdir build_32 && cd build_32 && ../build_32.sh
# armv8动态库
mkdir build_64 && cd build_64 && ../build_64.sh
Benchmark工具
编译完成后,想着跑跑模型看能否正常运行不?找到了Benchmark工具。
- Linux平台
# 在MNN根目录下
mkdir build
cd build
cmake .. -DMNN_BUILD_BENCHMARK=true && make -j4
# MNN/build目录
./benchmark.out ../benchmark/models 10 0
结果输出:
- Android平台
参考文档,直接编译;
在benchmark目录下直接执行脚本bench_android.sh,默认编译armv7(当前所用机器),加参数-64编译armv8;
# benchmark目录
vim bench_android.sh
# 这儿只跑CPU, 最开头那有关闭一些用不到的, 设为OFF;
./bench_android.sh
在benchmark/build目录生成需要的so库,及可执行文件(*.out);
由于服务器不能直接连设备,先将要用到的文件(*.so, *.out, models)拷出到本地电脑,再用adb的方式push到设备板子;
# 在此仔细查看 bench_android.sh 里头的脚本内容
# 将必要文件移动到/data/local/tmp/ 目录
su #需更高权限
cd /data/loacl/tmp/
chmod 0777 ./benchmark.out
# 注意:需配置宏LD_LIBRARY_PATH,不然链接不到so库 T_T
LD_LIBRARY_PATH=./ ./benchmark.out ./benchmark_models 10 0 4
结果输出:
此路漫漫,砥砺前行~
文中不足之处,望能指出。