本文档涉及到的目标硬件为海思3516D,但是对其他Arm芯片也有一定的借鉴意义,只需要更换交叉编译链即可。因为Caffe2的编译需要使用开启C++11,所以GCC版本需要大于等于4.8才可以正常进行编译

参考文档

  1. HI3516D之caffe移植

开发环境介绍

主机操作系统:Ubuntu14.04 64位

目标板硬件:海思3516D

交叉编译器:arm-hisiv400-linux,海思提供的定制GCC 4.8.3交叉编译工具

编译注意事项

为了使Caffe2部署时的体积最小化,需要如下几个注意事项

  1. Caffe2的ARM编译只涉及到最后的推理部署,所以建议关闭lmdb、leveldb、snappy和opencv的编译
  2. 裁剪最后生成的可执行文件,通过arm-hisiv400-linux-gnueabi-strip命令
  3. Caffe2提供了WhiteList编译功能,可以只编译用户自定义的op
  4. 如果想最小化体积,还进一步建议关闭glog、gflags,并且关闭Caffe2内部logging
  5. 用-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

results matching ""

    No results matching ""