1. 程式人生 > >在centos7的無外網環境下編譯安裝caffe

在centos7的無外網環境下編譯安裝caffe

由於機器涉密,無法連線外網,導致yum命令不可用,配置安裝caffe的過程變得繁瑣複雜,所有的依賴都需要手動編譯。先列出caffe需要的依賴:

  • Boost
  • glog
  • protobuf
  • lmdb
  • LevelDB
  • Snappy
  • gflags
  • BLAS
  • opencv
  • HDF5
  • cuda

我的cmake版本:2.8.12.2
所有的安裝包都上傳到/usr/local 下解壓編譯

# tar jxvf  boost_1_55_0.tar.bz2  
# cd boost_1_55_0
# ./bootstrap.sh  
# ./b2  
# sudo ./b2 install  
# tar zxvf glog-0.3.3.tar.gz 
# cd glog-0.3.3 # ./configure # make && make install
# tar -zxf protobuf-2.5.0.tar.gz
# cd protobuf-2.5.0
# ./configure --prefix=/usr/local/protobuf/
# make && make install
//最後將下面的的語句加入到環境變數中
# export PATH=/usr/local/protobuf/bin:$PATH
# unzip lmdb-mdb.master.zip
# cd lmdb-mdb.master/libraries/liblmdb 
# make && make install
# unzip leveldb-master.zip
# cd leveldb-master
# make
# sudo cp -r include/leveldb /usr/local/include
# cd out-shared 
# cp lib* /usr/local/lib
# tar -zvxf snappy-1.1.2.tar.gz
# cd snappy-1.1.2
# ./configure 
# make
# make install
# unzip gflags-master.zip 
# cd gflags-master # mkdir build && cd build # export CXXFLAGS="-fPIC" # cmake .. && make VERBOSE=1 # make && make install

我在執行 export CXXFLAGS=”-fPIC” 後cmake出現問題(也許大家不會出現該問題):

The C++ compiler "/usr/bin/c++" is not able to compile a simple test program

始終無法解決,決定不執行export CXXFLAGS=”-fPIC”
但編譯安裝gflags成功後,編譯caffe時出現問題:

Linking CXX shared library ../../lib/libcaffe-d.so
/usr/bin/ld: /usr/local/lib/libgflags.a(gflags.cc.o): relocation R_X86_64_32S against `.rodata' can not be used when making a shared object; recompile with -fPIC
/usr/local/lib/libgflags.a: error adding symbols: Bad value
collect2: error: ld returned 1 exit status
make[2]: *** [lib/libcaffe-d.so.1.0.0-rc3] Error 1
make[1]: *** [src/caffe/CMakeFiles/caffe.dir/all] Error 2
make: *** [all] Error 2

說明gflags編譯時沒有生成共享庫,重新編譯gflags

解決方法:

# unzip gflags-master.zip 
# cd gflags-master  
# mkdir build && cd build  
# cmake .. -DBUILD_SHARED_LIB=ON
# make VERBOSE=1  
# make && make install  

8.BLAS:

BLAS是用來進行矩陣運算的,在這裡我試了兩種blas。最終我使用openblas完成了編譯安裝。

用rpm命令安裝該包
rpm -ivh Atlas-2.2.1-2.l7.centos.src.rpm

安裝成功後atlas目錄被放在了/usr/lib64/atlas
然而,編譯caffe時cmake出錯:

CMake Error at /usr/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:108 (message):
  Could NOT find Atlas (missing: Atlas_CLAPACK_INCLUDE_DIR
  Atlas_CBLAS_LIBRARY Atlas_BLAS_LIBRARY)

解決方法:
在cmake .. 後加 -DAtlas=/usr/lib64/atlas

但編譯時出現問題:

../lib/libcaffe-d.so.1.0.0-rc3: undefined reference to `cblas_sgemv' 
../lib/libcaffe-d.so.1.0.0-rc3: undefined reference to `cblas_dgemm' 
../lib/libcaffe-d.so.1.0.0-rc3: undefined reference to `cblas_sscal' 
../lib/libcaffe-d.so.1.0.0-rc3: undefined refere
...

查閱資料後,個人認為有兩種出錯的可能
一是atlas安裝不完全,缺少依賴,因為github上的atlas rpm包都是在centos6.x和5.x安裝的版本,我在網上找到的版本也許還需要安裝其他的atlas rpm包。二是除了安裝atlas以外,要再安裝一個叫做cblas的庫。問題出現的具體原因由於時間關係沒能繼續研究,於是放棄了atlas,選擇了OpenBLAS。

# tar -xzvf OpenBLAS.tar.gz 
# cd OpenBLAS
# make 
# make PREFIX=/usr/local/ install 
//將libopenblas庫拷貝到/usr/local/lib裡
# cp lib* /usr/local/lib 

OpenBLAS安裝完成

//2017.4.26修正
在執行使用caffe框架的程式時,出現問題:Segment fault (core dumped)
gdb 後 發現錯誤:

[Thread debugging using libthread_db enabled]
Using host libthread_db library “/lib64/libthread_db.so.1”.
Core was generated by `./lshdemo batchquery query_image.feature retrival_image.index query_image.lst r’.
Program terminated with signal SIGSEGV, Segmentation fault.
#0 0x00007f522ca92a1c in blas_level1_thread () from /usr/local/lib/libopenblas.so.0
(gdb)

推測是OpenBLAS包的問題,重新下載了一份OpenBLAS包,重新上傳編譯安裝。最終問題解決。附上新OpenBLAS下載地址

9.Opencv
opencv安裝教程都比較多,博主這裡主要列出安裝時我出現的問題

  • 我使用的opencv版本是3.2.0,cmake時會從網上download一個名為 ippicv_linux_20151201.tgz 的包,但是機器無法連線外網,故該包下載失敗,我用自己機器在網際網路上找到了該包(該包下載地址),將其放在/usr/local/opencv-3.2.0/3rdparty/ippicv/downloads/linux-808b791a6eac9ed78d32a7666804320e 下,重新cmake,成功。

  • 編譯時出現問題1

make[2]: *** [modules/gpu/CMakeFiles/opencv_gpu.dir/src/graphcuts.o] Error 1 
make[1]: *** [modules/gpu/CMakeFiles/opencv_gpu.dir/all] Error 2 
make: *** [all] Error 2
解決方法:Cmake時 加-D BUILD_opencv_gpu=OFF(做測試用,並不需要gpu訓練資料)
  • 編譯時出現問題2
modules/core/CMakeFiles/cuda_compile.dir/__/dynamicuda/src/cuda/./cuda_compile_generated_matrix_operations.cu.o
arm-linux-gnueabihf-gcc: error: unrecognized command line option ‘-m64’
CMake Error at cuda_compile_generated_matrix_operations.cu.o.cmake:206 (message):
Error generating
/home/yy/opencv-2.4.9/build/modules/core/CMakeFiles/cuda_compile.dir/__/dynamicuda/src/cuda/./cuda_compile_generated_matrix_operations.cu.o
make[2]: *** [modules/core/CMakeFiles/cuda_compile.dir/__/dynamicuda/src/cuda/./cuda_compile_generated_matrix_operations.cu.o] 錯誤 1
make[1]: *** [modules/core/CMakeFiles/opencv_core.dir/all] 錯誤 2
make: *** [all] 錯誤 2
解決方法:Cmake時 加-D CMAKE_BUILD_TYPE=bulid -D CMAKE_INSTALL_PREFIX=/usr/local -D CUDA_GENERATION=Kepler ..”
# gunzip < hdf5-X.Y.Z.tar.gz | tar xf -   #解壓縮
# cd hdf5-X.Y.Z
# ./configure --prefix=/usr/local/hdf5  #安裝路徑
# make
# make check                # run test suite.
# make install
# make check-install        # verify installation.

11.CUDA
由於使用的機器上安裝了CUDA,博主並未進行這一步

編譯caffe:
在Makefile.config檔案中更改:

BLAS:=open
BLAS_INCLUDE := /usr/local/include
BLAS_LIB := /usr/local/lib
//博主使用的是cpu,故去掉# CPU_ONLY: = 1 的註釋#
CPU_ONLY: = 1
# cmake .. -DBUILD_SHARED_LIB=ON -DBLAS=open -DOpenCV_DIR=/usr/local/opencv-3.2.0/build
//接下來的安裝取決於你使用caffe的方式,在這裡,博主需要呼叫Caffe框架的C++程式,故把Caffe編譯成一個庫,然後我們可以像正常使用一個庫一樣,呼叫和編譯C++程式了
# cmake . -DCMAKE_BUILD_TYPE=Debug   
# make -j$(nproc)  && make install     
# cmake . -DCMAKE_BUILD_TYPE=Release 
# make -j$(nproc)  && make install 

常出現的問題:cmake時找不到依賴庫
解決方法:在環境變數裡新增export語句,例如,
在/etc/profile裡新增
export PATH=/usr/local/protobuf/bin:$PATH
或在cmake語句後明確指出依賴位置,例如,
-DOpenCV_DIR=/usr/local/opencv-3.2.0/build

參考資料: