//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
則需要
- ~/.profile 加入 export LD_LIBRARY_PATH=/usr/local/lib
- source ~/.profile
- rm /usr/bin/protoc
- 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