本文档涉及到的目标硬件为海思3516D,但是对其他Arm芯片也有一定的借鉴意义,只需要更换交叉编译链即可。因为Caffe2的编译需要使用开启C++11,所以GCC版本需要大于等于4.8才可以正常进行编译
参考文档
开发环境介绍
主机操作系统:Ubuntu14.04 64位
目标板硬件:海思3516D
交叉编译器:arm-hisiv400-linux,海思提供的定制GCC 4.8.3交叉编译工具
编译注意事项
为了使Caffe2部署时的体积最小化,需要如下几个注意事项
- Caffe2的ARM编译只涉及到最后的推理部署,所以建议关闭lmdb、leveldb、snappy和opencv的编译
- 裁剪最后生成的可执行文件,通过arm-hisiv400-linux-gnueabi-strip命令
- Caffe2提供了WhiteList编译功能,可以只编译用户自定义的op
- 如果想最小化体积,还进一步建议关闭glog、gflags,并且关闭Caffe2内部logging
- 用-os来缩小code size,只对核心计算密集代码用O3
设置交叉编译链
# 在/etc/bash.bashrc的最后增加如下指令
# HISI Hi3516D V400 cross compiler
export ARCH=arm
export PATH=/opt/arm-hisiv400-linux/bin/:$PATH
export CROSS_COMPILE=arm-hisiv400-linux-gnueabi-
export CC=/opt/arm-hisiv400-linux/bin/arm-hisiv400-linux-gnueabi-gcc
export CXX=/opt/arm-hisiv400-linux/bin/arm-hisiv400-linux-gnueabi-g++
export LD=/opt/arm-hisiv400-linux/bin/arm-hisiv400-linux-gnueabi-ld
export AR=/opt/arm-hisiv400-linux/bin/arm-hisiv400-linux-gnueabi-ar
export AS=/opt/arm-hisiv400-linux/bin/arm-hisiv400-linux-gnueabi-as
export RANLIB=/opt/arm-hisiv400-linux/bin/arm-hisiv400-linux-gnueabi-ranlib
# 修改完成之后需要重启命令行才能生效
# 你可以通过如下指令来确认交叉编译链是否已经设置好
echo $CC
# 当显示/arm-hisiv400-linux/bin/arm-hisiv400-linux-gnueabi-gcc时表示交叉编译链已经设置好
# 当需要更换为本机编译时屏蔽上面的指令即可
编译依赖库
依赖库 | 版本 | 下载地址 |
---|---|---|
glog | 0.3.5 | https://github.com/google/glog |
gflags | 2.2.1 | https://github.com/gflags/gflags |
opencv | 3.2.0 | https://github.com/opencv/opencv |
protobuf | 3.2.0 | https://github.com/google/protobuf |
openblas | 0.2.20 | https://github.com/xianyi/OpenBLAS |
eigen | 3.3.3 | http://eigen.tuxfamily.org |
下载上述依赖库的源代码进行交叉编译,依赖库打包下载和具体编译步骤参考HI3516D之caffe移植。
编译eigen3
新建cmake Build目录
cd eigen-3.3.3
mkdir _install
使用cmake-gui进行配置
参考编译opencv时的cmake交叉工具链配置(参考HI3516D之caffe移植中的opencv编译部分)
# 修改Cmake设置选项
CMAKE_INSTALL_PREFIX # 自定义安装目录
点击Generate生成Makefile
编译&安装
cd _install
make -j8
make install
编译Caffe2
修改CMakeLists.txt
# 添加eigen头文件目录&添加NEON编译选项
# ---[ Build flags
# set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c11")
# if(NOT MSVC)
# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fPIC")
# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-narrowing")
修改为
# ---[ Build flags
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c11 -I/usr/local/HI3516D/v400/eigen-3.3.3/include/eigen3")
if(NOT MSVC)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fPIC -I/usr/local/HI3516D/v400/eigen-3.3.3/include/eigen3
-mcpu=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=softfp")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-narrowing")
修改cmake/Dependencies.cmake
# 屏蔽clbas链接选项
elseif(BLAS STREQUAL "OpenBLAS")
find_package(OpenBLAS REQUIRED)
include_directories(SYSTEM ${OpenBLAS_INCLUDE_DIR})
list(APPEND Caffe2_DEPENDENCY_LIBS ${OpenBLAS_LIB})
list(APPEND Caffe2_DEPENDENCY_LIBS cblas)
修改为
elseif(BLAS STREQUAL "OpenBLAS")
find_package(OpenBLAS REQUIRED)
include_directories(SYSTEM ${OpenBLAS_INCLUDE_DIR})
list(APPEND Caffe2_DEPENDENCY_LIBS ${OpenBLAS_LIB})
# list(APPEND Caffe2_DEPENDENCY_LIBS cblas)
新建cmake Build目录
cd caffe2-0.8.0
mkdir _install
使用cmake-gui进行配置
参考编译opencv时的cmake交叉工具链配置(参考HI3516D之caffe移植中的opencv编译部分)
点击Configure生成配置选项,此时会出现错误,先忽略错误按照下面的选项进行配置之后错误将会消失
配置Cmake选项
# 配置protobuf的头文件和库文件安装位置
PROTOBUF_INCLUDE_DIR /usr/local/HI3516D/v400/protobuf-3.2.0/include
PROTOBUF_LIBRARY /usr/local/HI3516D/v400/protobuf-3.2.0/lib/libprotobuf.a
PROTOBUF_PROTOC_EXECUTABLE /usr/local/PC/protobuf-3.2.0/bin/protoc
再次点击Configure生成配置选项,此时会出现错误,先忽略错误继续配置
BLAS OpenBLAS
再次点击Configure生成配置选项,此时会出现错误,先忽略错误继续配置
# 配置glog、gflags、openblas、eigen的头文件和库文件安装位置
# 选择库文件时全部使用静态库文件,如下所示(将路径更改为你的自定义目录):
GLOG_INCLUDE_DIR /usr/local/HI3516D/v400/glog-0.3.5/include
GLOG_LIBRARY /usr/local/HI3516D/v400/glog-0.3.5/lib/libglog.a
GFLAGS_INCLUDE_DIR /usr/local/HI3516D/v400/gflags-2.2.1/include
GFLAGS_LIBRARY /usr/local/HI3516D/v400/gflags-2.2.1/lib/libgflags.a
OpenBLAS_INCLUDE_DIR /usr/local/HI3516D/v400/openBLAS-0.2.20/include
OpenBLAS_LIB /usr/local/HI3516D/v400/openBLAS-0.2.20/lib/libopenblas.a
# 屏蔽部分不需要的编译组件和选项
BUILD_TEST FALSE # 禁用编译TEST
USE_CUDA FALSE # 禁用编译CUDA
USE_GLOO FALSE # 禁用编译GLOO
USE_LEVELDB FALSE # 禁用编译LEVELDB
USE_LMDB FALSE # 禁用编译LMDB
USE_MPI FALSE # 禁用编译MPI
USE_NCCL FALSE # 禁用编译NCCL
USE_NNPACK FALSE # 禁用编译NNPACK
USE_OPENCV FALSE # 禁用编译OPENCV
USE_REDIS FALSE # 禁用编译REDIS
USE_ROCKSDB FALSE # 禁用编译ROCKSDB
# 设置编译选项
CMAKE_INSTALL_PREFIX # 自定义安装目录
CMAKE_C_FLAGS -fPIC
CMAKE_CXX_FLAGS -fPIC
CMAKE_EXE_LINKER_FLAGS -pthread -ldl
BUILD_SHARED_LIBS # 根据需求设置 TRUE为编译动态库,FLASE为编译静态库
EIGEN3_INCLUDE_DIR # 设置为空
点击Generate生成Makefile
进入_install目录&编译
cd _install
make -j8
make install