背景
虽然用了MNN挺长一段时间,却没有用交叉编译环境编译过MNN, 手上的firefly 3328板子吃灰了很久, 这次拿出来跑给net看看速度怎样。
我主机系统:Ubuntu20, 板子型号:firefly 3328, cpu有4个cotex A53 核,具体如下:
firefly@firefly:~/code/test_mnn/build$ cat /proc/cpuinfo
processor : 0
BogoMIPS : 48.00
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x0
CPU part : 0xd03
CPU revision : 4
processor : 1
BogoMIPS : 48.00
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x0
CPU part : 0xd03
CPU revision : 4
processor : 2
BogoMIPS : 48.00
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x0
CPU part : 0xd03
CPU revision : 4
processor : 3
BogoMIPS : 48.00
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x0
CPU part : 0xd03
CPU revision : 4
Serial : b2815d42d3832002
环境配置
MNN文档中对交叉编译有些介绍,但是其下载的文件有问题, 没法直接用。所以我还是重新写下吧。
1. 下载MNN代码到本地
2. 下载linaro交叉编译环境, 我的是aarch64,所以从链接下载了** gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz**,下载后解压到本地路径,并将其加入到cross_compile_toolchain环境变量:export cross_compile_toolchain=/home/lyy/258G/code/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu
3. 下面就可以开始编译MNN了, MNN目录下:
mkdir build && cd build
cmake .. \
-DCMAKE_BUILD_TYPE=Release \
-DMNN_BUILD_DEMO=ON \
-DMNN_BUILD_BENCHMARK=true \
-DCMAKE_SYSTEM_NAME=Linux \
-DCMAKE_SYSTEM_VERSION=1 \
-DCMAKE_SYSTEM_PROCESSOR=aarch64 \
-DCMAKE_C_COMPILER=${cross_compile_toolchain}/bin/aarch64-linux-gnu-gcc \
-DCMAKE_CXX_COMPILER=${cross_compile_toolchain}/bin/aarch64-linux-gnu-g++
make -j4
上面加上了build_demo和build_bencmark两个flag, 为了方便后面的测试。编译完成后,将其copy到板子上, 同时也要将 bencmark/models文件夹copy到板子上,这里面都是mnn模型库, 后面会用到。
测试
ssh登陆板子, 进入刚才copy的buid目录开始测试。
./benchmark.out ../models 10 0
其中models为刚才复制过来的模型路径, 10为运行10次, 0表示backend为cpu。
每个参数的意思:
benchmark.out models_folder [loop_count] [warmup] [forwardtype] [numberThread] [precision]
输出结果:
MNN benchmark
Forward type: **CPU** thread=4** precision=2
--------> Benchmarking... loop = 10, warmup = 0
[ - ] resnet-v2-50.mnn max = 943.660ms min = 469.640ms avg = 546.525ms
[ - ] SqueezeNetV1.0.mnn max = 112.491ms min = 110.247ms avg = 111.333ms
[ - ] mobilenet-v1-1.0.mnn max = 97.783ms min = 93.974ms avg = 94.855ms
[ - ] inception-v3.mnn max = 2295.329ms min = 848.981ms avg = 1015.068ms
[ - ] MobileNetV2_224.mnn max = 175.199ms min = 56.063ms avg = 73.848ms
板子cpu还是比较羸弱的。。。。
当然你也可以根据文档中的介绍自己转换模型再跑下其他测试model, 这里就不一一介绍了。