Ubuntu16.04 安裝caffe(for gtx,rtx,cuda8.0)

//part 1是針對與原來的10系列顯卡,20系列的顯卡使用因爲cuda版本的問題會有問題,因此如果是20系列的顯卡直接看part2

 

part 1:(for gtx10*)

一.環境安裝:

1.依賴庫安裝

  • 基本的依賴庫安裝

sudo apt install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler 
sudo apt install --no-install-recommends libboost-all-dev
矩陣依賴庫
sudo apt-get install libatlas-base-dev
建立pycaffe interface需要的python頭文件
sudo apt install the python-dev
sudo apt install python-matplotlib
sudo apt install python-scipy
sudo apt install python-numpy
其他庫的安裝
sudo apt install libgflags-dev libgoogle-glog-dev liblmdb-dev

    注意,在安裝上述依賴庫的過程中,對於protobuf-compiler會因爲版本的問題出現bug,具體修復方法見後面

    最後其他庫的安裝libgflags,libgoogle-glog-dev因爲我之前已經用源碼進行安裝,所以儘量不要安裝,防止版本問題

    需要GPU的話需要安裝cuda與cudnn,具體的方法見博客安裝cuda,cudnn等

2.Caffe安裝

  • 下載caffehttps://github.com/BVLC/caffe
  • 進去安裝界面,將 Makefile.config.example 文件複製一份並更名爲 Makefile.config.因爲example只是給用戶的實例,需要Makefile.config來配置Makefile文件
    sudo cp Makefile.config.example Makefile.config

    然後修改Makefile.config文件

    1.應用cudnn

#USE_CUDNN := 1
修改成: 
USE_CUDNN := 1

    2.應用opencv版本

#OPENCV_VERSION := 3 
修改爲: 
OPENCV_VERSION := 3

    3.應用python接口

#WITH_PYTHON_LAYER := 1 
修改爲 
WITH_PYTHON_LAYER := 1

    4.修改python路徑

INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include 
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib 
修改爲:
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu/hdf5/serial

    之後修改caffe目錄下的Makefile文件

將: 
NVCCFLAGS +=-ccbin=$(CXX) -Xcompiler-fPIC $(COMMON_FLAGS) 
替換爲: 
NVCCFLAGS += -D_FORCE_INLINES -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)

將: 
LIBRARIES += glog gflags protobuf boost_system boost_filesystem m hdf5_hl hdf5 
改爲: 
LIBRARIES += glog gflags protobuf boost_system boost_filesystem m hdf5_serial_hl hdf5_serial


  之後修改/usr/local/cuda/include/host_config.h 文件 :

將
#error-- unsupported GNU version! gcc versions later than 4.9 are not supported! 
改爲
//#error-- unsupported GNU version! gcc versions later than 4.9 are not supported!
  • 之後使用cmake配置
mkdir build && cd build
cmake -DMAKE_BUILD_TYPE=Release -DCPU_ONLY=NO .. 
  • sudo make all

    在make過程中,可能會遇到構建目標時的bug,具體情況下下方

  • sudo make install

    安裝好之後,可以進行測試,輸入

  • sudo make runtest

    沒有報錯說明caffe安裝完成.

二.pycaffe環境安裝

    在編譯好caffe後,分別安裝python依賴

sudo apt-get update

sudo apt-get install python-pip python-dev python-numpy

$sudo apt-get install gfortran graphviz

$sudo pip install -r ${CAFFE_ROOT}/python/requirements.txt    

    需要把${CAFFE_ROOT}的路徑換成自己caffe的路徑,最後一句是要到所對應的位置下下載requirements.txt裏面寫下的所需下載的python依賴項.可能會遇到需要的依賴版本要在python3環境下才能安裝,這時根據提示修改requirements.txt中的版本.

    之後進入caffe文件夾下的python.import caffe成功.

三.bug記錄

1./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

解決:

這是在編譯過程中沒有加入-fPIC所導致,因此對於一般的CMakeList.txt的文件,在文件中加入

set(CMAKE_C_FLAGS“$ {CMAKE_C_FLAGS} -fPIC”)
set(CMAKE_CXX_FLAGS“$ {CMAKE_CXX_FLAGS} -fPIC”)

即可.

或者因爲我的gflags是使用源碼安裝,因此解決方法是:

進入gflags/build中,找到CMakeCache.txt

改爲CMAKE_CXX_FLAGS:STRING=-fPIC

然後在build中,執行

export CXXFLAGS="-fPIC" && cmake .. && make VERBOSE=1
make && make install

之後回到caffe編譯就沒有問題了

2.fatal error: caffe/protp/caffe.pb.h:no such file or directory

解決:

make 太快可能會丟失文件,首先進入~/applications/caffe/src/caffe/proto,這對應的是我當面目錄,需要你根據位置進行修改,看到當前文件夾下有個名爲caffe.proto的文件,然後終端輸入

protoc --cpp_out=~/caffe/include/caffe/ caffe.proto

之後在caffe/include/caffe下新建文件夾命名爲proto,將編譯出來的caffe.pb.h與caffe.pb.cc放進去就好

3..build_release/src/caffe/proto/caffe.pb.h:12:2: error: #error This file was generated by a newer version of protoc which is #error This file was generated by a newer version of protoc which is

解決:proto版本問題,網上搜索了很多方法都沒用,解決的方法就是沒有安裝官方的方法進行安裝,而是用cmake再make的方法就沒有這個問題了

命令 whereis protoc 可以查看哪些路徑下安裝了protoc

命令which protoc 可以查看默認選用protoc的路徑

命令 protoc --version 可以查看當前protoc版本

 

指定protoc的版本可以在 Makefile文件內修改
在Makefile 中修改這兩句:
$(Q)protoc --proto_path=$(PROTO_SRC_DIR) --cpp_out=$(PROTO_BUILD_DIR) $<
$(Q)protoc --proto_path=$(PROTO_SRC_DIR) --python_out=$(PY_PROTO_BUILD_DIR) $<

$(Q)/usr/bin/protoc --proto_path=$(PROTO_SRC_DIR) --cpp_out=$(PROTO_BUILD_DIR) $<
$(Q)/usr/bin/protoc --proto_path=$(PROTO_SRC_DIR) --python_out=$(PY_PROTO_BUILD_DIR) $<

即把開頭的"protoc"補全路徑即可 (/usr/bin/protoc即爲自己向指定給的版本路徑)

想要把默認的環境改爲你當前需要的protobuf

則需要

  1. ~/.profile 加入 export LD_LIBRARY_PATH=/usr/local/lib
  2. source ~/.profile
  3. rm /usr/bin/protoc
  4. ln -s /usr/local/bin/protoc /usr/bin/protoc

 

part 2:(for rtx20*)

  因爲rtx系列使用的nvidia驅動版本爲4.10以上,因此此時的cuda driver version==10.0,如果你在默認環境下使用的cuda不是10.0,那麼在上述安裝的make過程中,會出現error:

nvcc fatal   : Unsupported gpu architecture 'compute_75'

注意::後續解決方法:找到caffe下的cmake文件夾,下面的Cuda.cmake

修改如下:

set(Caffe_known_gpu_archs "20 21(20) 30 35 50 60 61 75")
修改爲
set(Caffe_known_gpu_archs "20 21(20) 30 35 50 60 61")

之後cmake -DCUDA_ARCH_NAME=ALL ..

就能夠使用cmake方式進行編譯。


  因此需要更換編譯方式,按照make方式進行編譯。

  一.修改Makeflieconfig

  除開上述需要修改的地方,還需要修改一段:

CUDA_ARCH := -gencode arch=compute_20,code=sm_20 \
		-gencode arch=compute_20,code=sm_21 \
		-gencode arch=compute_30,code=sm_30 \
		-gencode arch=compute_35,code=sm_35 \
		-gencode arch=compute_50,code=sm_50 \
		-gencode arch=compute_52,code=sm_52 \
		-gencode arch=compute_60,code=sm_60 \
		-gencode arch=compute_61,code=sm_61 \
		-gencode arch=compute_61,code=compute_61
修改爲:
CUDA_ARCH := -gencode arch=compute_20,code=sm_20 \
		-gencode arch=compute_20,code=sm_21 \
		-gencode arch=compute_30,code=sm_30 \
		-gencode arch=compute_35,code=sm_35 \
		-gencode arch=compute_50,code=sm_50 \
		-gencode arch=compute_52,code=sm_52 \
		-gencode arch=compute_60,code=sm_60 \
		-gencode arch=compute_61,code=sm_61 \
		-gencode arch=compute_61,code=compute_61
                -gencode=arch=compute_70,code=sm_70 \
                -gencode=arch=compute_75,code=sm_75 \
                -gencode=arch=compute_75,code=compute_75

    其他修改Makefile的方式與上述相同。

2.make

 make all -j8

 make test -j8

 make runtest -j8

  bug記錄:

(1)make runtest -j8錯誤

.build_release/tools/caffe
.build_release/tools/caffe: error while loading shared libraries: libcudart.so.9.0: cannot open shared object file: No such file or directory
Makefile:542: recipe for target 'runtest' failed
make: *** [runtest] Error 127

  解決方法:首先檢查你的bashrc或者zshrc,是否有對cuda的LD_LIBRARY_[PATN,如果沒有,按照cuda的安裝方法進行安裝,如果有了則sudo ldconfg /usr/local/cuda-8.0/lib64

ldconfig命令的用途主要是在默認搜尋目錄/lib/usr/lib以及動態庫配置文件/etc/ld.so.conf內所列的目錄下,搜索出可共享的動態鏈接庫(格式如lib*.so*),進而創建出動態裝入程序(ld.so)所需的連接和緩存文件。緩存文件默認爲/etc/ld.so.cache,此文件保存已排好序的動態鏈接庫名字列表,爲了讓動態鏈接庫爲系統所共享,需運行動態鏈接庫的管理命令ldconfig,此執行程序存放在/sbin目錄下。

ldconfig通常在系統啓動時運行,而當用戶安裝了一個新的動態鏈接庫時,就需要手工運行這個命令。

  (2)使用pycaffe

  回到caffe目錄下make pycaffe -j8

三、外部使用caffe

  因爲安裝方式並沒有Install,所以外部使用caffe需要聲明caffe的頭文件位置,庫文件位置。

  具體的實現在外部程序的CMakeList.txt中:

  set(Caffe_Root /home/yiqiaozhou/applications/caffe)
  set(Caffe_INCLUDE_DIRS 
	${Caffe_Root}/include
        ${Caffe_Root}/src
	/usr/local/cuda/include
)
  set(Caffe_LIBRARIES
	caffe
	boost_system
	glog
)
			
  include_directories(${Caffe_INCLUDE_DIRS})
  link_directories(${Caffe_LIBRARIES})

問題:error: ‘class caffe::MemoryDataLayer’ has no member named ‘AddMatVector’
error: ‘CVMatToDatum’ is not a member of ‘caffe’

  解決:在使用memorydata加載數據進網絡時,報了這個錯,其原因是未聲明“USE_OPENCV”

  在cpp文件中加入

#ifndef USE_OPENCV 
#define USE_OPENCV 
#include <caffe/caffe.hpp>  
#include <caffe/layers/memory_data_layer.hpp> 
#include <caffe/util/io.hpp> #endif

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章