参考链接:https://developer.arm.com/solutions/machine-learning-on-arm/developer-material/how-to-guides/configuring-the-arm-nn-sdk-build-environment-for-tensorflow
https://blog.csdn.net/coinv2014/article/details/83582747
由于安装过程中没有进行记录,所以本文是在安装成功之后根据回忆和参考文档进行复盘之后总结出来的,一些细节可能缺失,不过整体难度不大,借助google应该可以完成安装,不过编译时间可能较长,建议使用电脑进行交叉编译或者电脑和开发板对互相没有依赖的模块同时进行编译。此外如果使用开发板进行编译,要预留足够多的空间(源码加上中间产物十分庞大,估计有10G+),建议开发板外接移动硬盘或者其他存储介质。
一.准备工作
1. 准备硬件平台,这里用的是友善之臂T4,SoC是RK3399,操作系统是ubuntu18.04
2. 安装编译所需工具,sudo apt-get install autoconf automake libtool curl make g++ unzip
3. 如果采用交叉编译,需要在PC上安装平台对应的gcc
4. 这里用到的各种依赖的版本如下
aarch64-linux-gnu-gcc 7.3.0
scons 3.0.1
cmake 3.10.2
boost 1.64.0
protobuf 3.5.0
二.下载源码
1. 下载ARM NN
git clone https://github.com/Arm-software/armnn
2. 下载compute library
git clone https://github.com/ARM-software/ComputeLibrary
3. 下载tensorflow源码
git clone https://github.com/tensorflow/tensorflow.git
三.解决掉arm nn和compute library所需的依赖
1. 编译并安装boost,此处使用1.64.0
参考链接:https://www.boost.org/doc/libs/1_64_0/more/getting_started/unix-variants.html
① https://www.boost.org/users/history/version_1_64_0.html 下载boost源码,并解压
② 切换当前目录到boost源码目录
③ 运行 ./bootstrap.sh link=static cxxflags=-fPIC --with-filesystem --with-test --with-log --with-program_options --prefix=path/to/installation/prefix 加粗部分为boost的安装目录,默认安装在/usr/local 下,如果是交叉编译,目录需要手动指定
④ 如果是交叉编译,需要修改project-config.jam文件
将其中的using gcc; 那一行改成 using gcc : aarch64 : aarch64-linux-gnu-g++ ; (注意冒号前后和最后分号前面的空格)
⑤ ./b2 install ,使用默认目录需要sudo权限,也可以只运行 ./bjam编译,得到的lib放在stage文件夹中
2. 编译并安装protobuf,此处使用3.5.0(ubuntu 18.04 直接apt-get 安装的protobuf版本是3.0.0)
参考链接:https://github.com/protocolbuffers/protobuf/blob/master/src/README.md
① 老规矩,先解决掉依赖。。。。sudo apt-get install autoconf automake libtool curl make g++ unzip
② git clone https://github.com/protocolbuffers/protobuf.git
cd protobuf
git submodule update --init --recursive
./autogen.sh
./configure -prefix=<你想安装的目录,默认在/usr>
make
make check
sudo make install(如果是交叉编译,不用做这步,直接拷贝生成的库文件到开发板中)
sudo ldconfig # 刷新动态库缓存
四.构建ARM NN的开发环境(这部分还没有尝试交叉编译,如果要交叉编译,要注意工具链是否正确)
1. 使用SCONS编译compute library
切换到compute library目录
scons arch=arm64-v8a extra_cxx_flags="-fPIC" benchmark_tests=0 validation_tests=0 for ARMv8-A opencl=1 embed_kernels=1 neon=1
上面一行最后加粗的三个flag,前两个是对mali GPU和opencl的支持,最后一个是对neon的支持
2. 使用protobuf生成tensorflow的C++源文件和头文件(这一步很快,瞬间完成)
切换到tensorflow目录(官方参考文档使用pushd和popd命令,也可以直接cd)
执行 ${ARMNN_DIR}/armnn/scripts/generate_tensorflow_protobuf.sh
上面一行加粗部分分别为arm nn的下载目录,生成C++源文件和头文件的目标目录 以及 protobuf的安装目录。
3. 使用CMake配置arm nn 并编译
① 进入armnn,编辑CMakeList.txt,在首行添加(参考自https://blog.csdn.net/coinv2014/article/details/83582747)
set(CMAKE_CXX_FLAGS “${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Werror -Wold-style-cast -Wno-missing-braces -Wconversion -Wsign-conversion -pthread”)
SET(BOOST_ROOT 你的boost目录)
② 然后用cmake配置
cmake .. -DARMCOMPUTE_ROOT=
配置选项中加粗部分分别是
I compute library源文件目录(include)
II 编译生成的compute library链接库的目录(library)
III 生成的链接库的目标目录
IV 之前用protobuf生成的tensorflow的C++源文件和头文件的目录
V protobuf的安装目录,不知道在哪里的话,可以 whereis protoc查看(注意版本要和之前使用的版本一致)
VI 最后加粗斜体的两个选项分别对应neon和opencl支持
③ 配置完成输入make编译
五.移植到开发板上
1. 将上一步编译生成的以libarmnn为前缀的库都拷贝到开发板 /lib/中
2. 如果是在开发板上进行的编译,可以直接sudo make install安装
六.测试
1. 运行arm nn build目录下的UnitTests测试编译是否正常
2. sudo make install 安装arm nn
3. 也可以用官方提供的armnn-mnist来测试
git clone https://github.com/ARM-software/ML-examples.git
修改Makefile文件,加入 -lprotobuf的连接选项(参考自CSDN,不过这里不加也可以通过)
进入目录,执行make mnist_tf
运行生成的可执行文件,测试结果是否正常,正常结果输出两行,一行是预测值,另一行是实际值
新手第一次写,如存在错误还请指正