[环境] Cmake方式编译Caffe时指定Atlas路径的方法

这两天需要在开发机环境搭建Caffe,不出预料地又遇到了不少坑。

如果你也像我一样希望不使用root权限的编译Caffe,并且自己指定Atlas(或许OpenBlas也可以同理)路径的话,恭喜你可能踩到坑里了,这里记录下我的解决方法。

Caffe的官方支持两种编译方式(详见Official Site)Make和Cmake。我的环境配置:

Blas:Atlas
OS: Linux 3.10 (RedHat 4.8.5-11)
GCC: 4.8.5
OpenCV: 3.4.0
CUDA: 8.0
cuDNN: 7.0.4

如果使用Make的话,关于Blas的设置需要设定MakeFile.config文件,定义Blas的类型和路径,关于这一点,这篇文章已经讲得很清楚了:这里

需要配置Atlas的lib和include到你的Atlas的路径:

# BLAS choice: # atlas for ATLAS (default) # mkl for MKL # open for OpenBlas BLAS := atlas
# Custom (MKL/ATLAS/OpenBLAS) include and lib directories. # Leave commented to accept the defaults for your choice of BLAS # (which should work)! BLAS_INCLUDE := /path/to/your/blas
BLAS_LIB := /path/to/your/blas

这里设置好以后,在caffe根目录下执行

make clean
make all

Atlas可以顺利找到了,但又出现了和opencv相关的无法找到头文件定义的问题,例如:

demosaicing.cpp:(.text._ZN2cv11demosaicingERKNS_11_InputArrayERKNS_12_OutputArrayEii+0x4ed4):对‘cv::String::deallocate()’未定义的引用
demosaicing.cpp:(.text._ZN2cv11demosaicingERKNS_11_InputArrayERKNS_12_OutputArrayEii+0x4eec):对‘cv::String::deallocate()’未定义的引用
demosaicing.cpp:(.text._ZN2cv11demosaicingERKNS_11_InputArrayERKNS_12_OutputArrayEii+0x4f01):对‘cv::String::deallocate()’未定义的引用
demosaicing.cpp:(.text._ZN2cv11demosaicingERKNS_11_InputArrayERKNS_12_OutputArrayEii+0x4f11):对‘cv::String::deallocate()’未定义的引用

我的opencv确实是正确安装的,经过各种查询解决办法都找不到解决办法之后,于是我放弃make转用cmake,这里也建议大家直接使用cmake,可以避免不少不必要的麻烦。

根据官网的cmake步骤:

cd caffe_root
mkdir build
cd build
cmake ..

这一步是cmake检测所需的dependencies是否可以正确找到,但是报错:

CMake Error at /usr/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:108 (message):
  Could NOT find Atlas (missing: Atlas_CBLAS_INCLUDE_DIR
  Atlas_CLAPACK_INCLUDE_DIR Atlas_CBLAS_LIBRARY Atlas_BLAS_LIBRARY
  Atlas_LAPACK_LIBRARY)
Call Stack (most recent call first):
  /usr/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:315 (_FPHSA_FAILURE_MESSAGE)
  cmake/Modules/FindAtlas.cmake:43 (find_package_handle_standard_args)
  cmake/Dependencies.cmake:88 (find_package)
  CMakeLists.txt:43 (include)

这是因为我们的Atlas并没有安装在系统目录下,而是通过source编译的,cmake无法找到Atlas,因此需要指定路径,而此时MakeFile.config中指定的路径已不起作用。

通过观察/caffe_root/cmake/Modules/FindAtlas.cmake文件我们可以看到:

set(Atlas_INCLUDE_SEARCH_PATHS
   /usr/include/atlas
   /usr/include/atlas-base
   $ENV{Atlas_ROOT_DIR}
   $ENV{Atlas_ROOT_DIR}/include
 )    set(Atlas_LIB_SEARCH_PATHS
   /usr/lib/atlas
   /usr/lib/atlas-base
   $ENV{Atlas_ROOT_DIR}
   $ENV{Atlas_ROOT_DIR}/lib
 )

关键就在系统变量Atlas_ROOT_DIR了,所以我们export到环境变量里

export Atlas_ROOT_DIR=/your/Atlas/Root

这里要注意的是,通过source编译的Atlas的lib和include可能分别在不同的目录下,比如我的include在/atlas_root/include/,但是lib在/atlas_root/build/lib/,这时只要修改FindAtlas.cmake就可以了,如下:

set(Atlas_INCLUDE_SEARCH_PATHS
   /usr/include/atlas
   /usr/include/atlas-base
   $ENV{Atlas_ROOT_DIR}
   $ENV{Atlas_ROOT_DIR}/include
 )    set(Atlas_LIB_SEARCH_PATHS
   /usr/lib/atlas
   /usr/lib/atlas-base
   $ENV{Atlas_ROOT_DIR}
   $ENV{Atlas_ROOT_DIR}/build/lib
 )

OK,现在再使用cmake就可以正确识别atlas的位置了,并且也不会有make的opencv相关的问题。

Enjoy.

    原文作者:文臺
    原文地址: https://zhuanlan.zhihu.com/p/34774975
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞