这两天需要在开发机环境搭建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.