轉載請注明出處:
http://www.cnblogs.com/darkknightzh/p/5797526.html
參考網址:
http://caffe.berkeleyvision.org/installation.html#prerequisites
1. 必須的依賴:Boost >= 1.55,CUDA,BLAS
看一下自己的CUDA安裝在哪個目錄下了。Makefile.config默認CUDA_DIR := /usr/local/cuda
依賴庫:protobuf, glog, gflags, hdf5。安裝:
sudo apt-get install libgflags-dev sudo apt-get install libgoogle-glog-dev sudo apt-get install libhdf5-serial-dev
BLAS可以使用atlas,mkl或者openblas。atlas是caffe默認選擇的。mkl和openblas性能更好。安裝atlas:
sudo apt-get install libatlas-base-dev
2. 可選的:OpenCV >= 2.4 including 3.0(默認使用2.4。如果想不使用,則將Makefile.config中11行取消注釋;如果使用opencv3,將Makefile.config中21行取消注釋)
IO庫:lmdb(默認使用。如果想不使用,則將Makefile.config中13行取消注釋)、leveldb (note: leveldb requires snappy;默認使用。如果想不使用,則將Makefile.config中12行取消注釋)
pip install lmdb(可能需要先安裝pip:sudo apt install python-pip)
cuDNN:見http://www.cnblogs.com/darkknightzh/p/5668471.html中步驟1-3。
3. 如果只使用cpu的話,將Makefile.config中的CPU_ONLY := 1取消注釋。
使用cuDNN的話,取消注釋Makefile.config中的USE_CUDNN := 1。
使用mkl的話,設置Makefile.config中BLAS := mkl
使用openblas的話,設置Makefile.config中BLAS := open
說明:裝完依賴的庫之后,最好重啟一下(比如裝完boost,重啟一下),因為裝完boost沒有重啟,然后make all時能通過了。
此處make all和make test都通過了,但是make runtest會提示libboost_system未定義(實際上裝的是中文的ubuntu,因而顯示信息時未定義。但是開始沒截圖。現在成功了,沒法截圖了。只能找一個英文的信息貼這里。。。):
undefined reference to `boost::system::generic_category()'
4. 編譯caffe:終端中輸入如下命令:
cp Makefile.config.example Makefile.config # Adjust Makefile.config (for example, if using Anaconda Python, or if cuDNN is desired) make all make test make runtest
如果想用多線程編譯,使用make all -j8,其中8為並行的線程數。
============================================================
160920更新:
1) 如果想在python和matlab中使用caffe,首先在Makefile.config中設置python和matlab的路徑PYTHON_INCLUDE(64行)和MATLAB_DIR(59行),而后分別運行如下命令:
make pycaffe make matcaffe
說明:(1) 對於python,官網推薦使用Anaconda。
(2) 為了在make pycaffe后,在python中能成功import caffe,需要將模塊的路徑添加到$PYTHONPATH中,命令如下:
export PYTHONPATH=/path/to/caffe/python:$PYTHONPATH
不能將caffe/python/caffe導入到$PYTHONPATH中。
(3) 目前的caffe兼容matlab 2015a, 2014a/b, 2013a/b, and 2012b.
2) 使用如下命令創建一個distribute,可將所有的caffe頭文件,編譯后的庫文件及二進制文件置於對應的文件夾內,方便將該distribute拷貝到其他電腦上面。使用該命令后,會在caffe根目錄下創建一個distribute文件夾,里面包含bin、include、lib、proto、python等文件夾。
make distribute
160920更新結束
160921更新
對於上面1)(2)中PYTHONPATH路徑,實際上導入的是caffe/python路徑,由於該文件夾內還有caffe文件夾,所以說不能導入caffe/python/caffe文件夾,比如可以導入:
export PYTHONPATH=/home/xxx/caffe-master/python:$PYTHONPATH
下面的導入則是錯誤的:
export PYTHONPATH=/home/xxx/caffe-master/python/caffe:$PYTHONPATH
或者干脆更省事的方法,直接打開.bashrc文件,位於/home/xxx/.bashrc,然后在最后添加上上面正確的語句。之后將終端定位到/home/xxx內,輸入source .bashrc,使bashrc生效。再在終端中輸入python后,輸入import python就能成功。
160921更新結束
161116更新
如果自己添加了新的層,make時不變,但是可能只需要make test自己的測試代碼,按照https://github.com/BVLC/caffe/issues/684中misaka-10032和matthieudelaro給出的代碼,可以使用如下命令中的一個即可(不記得當時使用的是哪個命令了。可以都試一下):
build/test/test_all.testbin --gtest_filter='*MyLayerTest*'
make all && make test && build/test/test_all.testbin --gtest_filter='*MyLayerTest*'
需要注意的是,'*MyLayerTest*'兩邊的*不要去掉。印象中如果去掉的話,會提示找不到那個Test。
--gtest_filter的說明如下:
161116更新結束
171115更新
在matlab2016b中導入caffe時,可能會提示:
libstdc++.so.6: undefined symbol
http://www.cnblogs.com/fanru5161/p/7055506.html給出了具體的解決方法,或者使用LD_PRELOAD,或者替換該庫以及另外的opencv的3個庫(見https://github.com/BVLC/caffe/issues/3934duchengyao的留言,下面的三句話對應這三個庫,只不過終端已經位於matlab/r2016b/bin/glnxa64文件夾內,如果matlab不在系統目錄,則只能用-s建立軟鏈接,如下面所示;否則可以建立硬鏈接,不加-s):
ln -s /usr/lib/x86_64-linux-gnu/libopencv_core.so.2.4.9 libopencv_core.so.2.4 ln -s /usr/lib/x86_64-linux-gnu/libopencv_highgui.so.2.4.9 libopencv_highgui.so.2.4 ln -s /usr/lib/x86_64-linux-gnu/libopencv_imgproc.so.2.4.9 libopencv_imgproc.so.2.4
171115更新結束
============================================================
最終編譯完成后的截圖:
ps:使用cmake編譯(CMake version >= 2.8.7):
首先定位到caffe文件夾內。之后:
mkdir build cd build cmake .. make all make install make runtest
說明:使用cmake編譯沒成功。。。總是有問題。最終又回到了make編譯。
5. 將caffe的頭文件拷貝到系統目錄下:
sudo cp -a build/lib /usr sudo cp –a include /usr
剛才很奇怪,用第二句就一直提示:
cp: 無法獲取'–a' 的文件狀態(stat): 沒有那個文件或目錄 cp: 略過目錄'include'
之后第二句開始的include改成了絕對路徑,就可以了。。。(關鍵的在另一台電腦上,第二句是可以用的):
sudo cp -a /home/XXX/caffe-master/include /usr
6. 遇到的問題:
1)fatal error: hdf5.h: 沒有那個文件或目錄”解決方法
http://blog.csdn.net/xue_wenyuan/article/details/52037121
在Makefile.config文件的第90行,添加/usr/include/hdf5/serial/ 到 INCLUDE_DIRS。
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial
在Makefile文件的第181行,把 hdf5_hl 和hdf5修改為hdf5_serial_hl 和 hdf5_serial。
LIBRARIES += glog gflags protobuf boost_system boost_filesystem m hdf5_serial_hl hdf5_serial
2)/usr/local/cuda/bin/nvcc:命令未找到:
在Makefile.config的第28行內容從CUDA_DIR := /usr/local/cuda修改為(我這邊nvcc所在位置為/usr/lib/nvidia-cuda-toolkit/bin/nvcc):
CUDA_DIR := /usr/lib/nvidia-cuda-toolkit
3)error: ‘memcpy’ was not declared in this scope
return (char *) memcpy (__dest, __src, __n) + __n;
http://blog.csdn.net/eagelangel/article/details/51531801
Makefile中409行,增加-D_FORCE_INLINES:
NVCCFLAGS += -D_FORCE_INLINES -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)
4)直接使用make all,提示下面的內容。
網上說是protobuf 版本不一致。重新裝了最新版的protobuf,然后用make all,還是會提示上面的內容。此時顯示所有文件夾的話,實際上在caffe根目錄下有.build_release的目錄,里面就有caffe.pb.cc。
用make clean,提示權限不足(caffe放在了usr/local目錄下),然后使用sudo make clean(如果是在home的路徑下,應該不需要sudo的),成功清除了.build_release里面的文件。之后再make all,就不會有上面的提示了。
=======================================================
170414更新:
5)換了cuda后,提示找不到libcudart.so.7.5(記不清楚是否是這個庫了)
a. 在終端中的解決方法
前幾天把cuda更新成8.0了。但是caffe編譯時用的是cuda7.5。因而今天在python中import caffe時,提示找不到libcudart.so.7.5。
解決方法是,在終端中輸入python testXXX.py之前,先輸入
export CPATH=/usr/local/cuda-7.5/include:$CPATH export LIBRARY_PATH=/usr/local/cuda-7.5/lib64:$LIBRARY_PATH export LD_LIBRARY_PATH=/usr/local/cuda-7.5/lib64:$LD_LIBRARY_PATH
說明:更新cuda8.0之后,上面默認的均為cuda-8.0。
之后在輸入python testXXX.py,便可以正常的運行使用caffe的python程序了。
b. 在pycharm中的解決方法
http://blog.csdn.net/dl_chenbo/article/details/53262230
給出了解決方法:
Edit Configurations——Environment variables中添加上面三個路徑就可以了(貌似框的有點錯位。反正和上面的三個對應就行了):
170414更新結束
=======================================================
170713更新
如果需要使用anaconda的話,Makefile.config中,注釋掉PYTHON_INCLUDE對應的默認兩行(如68,69行),並且取消注釋ANACONDA_HOME那行(如72行)及其下面包含PYTHON_INCLUDE的三行(如73,74,75行)。之后注釋掉PYTHON_LIB的默認路徑那行(如83行),取消注釋其對應於anaconda的那行(如84行)。
需要說明的是,73,74,75三行(我這邊在這三行)一定要都取消注釋,否則在make pycaffe時,可能會提示python.h no such file or directory
原因就是注釋了默認的python的include文件路徑,但是上面三行沒有都取消注釋。
如果電腦中有多個g++,需要設置編譯時使用的g++,可以取消注釋Makefile.config中第25行,同時修改CUSTOM_CXX為需要的路徑,如下:
CUSTOM_CXX := /usr/bin/g++4.9
170713更新結束
171115更新
使用anaconda時,python中import caffe后,一直提示ImportError: No module named google.protobuf.internal。
http://www.jianshu.com/p/1e405b9fe973指出:
protobuf千萬不要用conda install來安裝,要用~/anaconda2/bin/pip install protobuf 安裝,不然import caffe會出現ImportError: No module named google.protobuf.internal
額。。。弄了好久,死活用不了anaconda,看了人家的說明,就可以了。。。哎,我又坑了我一次。。。
編譯完libcaffe.so后,可以使用如下命令看一下該so都依賴哪些庫(https://groups.google.com/forum/#!topic/caffe-users/l9uUGvTF9zg):
ldd -d .build_release/lib/libcaffe.so
171115更新結束
180320更新:
今天在使用anaconda並編譯caffe時,出現crtbeginS.o:unrecognized relocation的錯誤。解決方法吐下:
1. 修改makefile文件
直接在Makefile最開始增加下面一句話:
CXX := /usr/bin/g++-4.9
之后在終端中直接使用官方的編譯命令即可:
make CUDA_HOME=/usr/local/cuda-8.0
方法2:輸入make時增加CXX標志位
https://www.cnblogs.com/sky-heaven/p/6272408.html中指出:
= 是最基本的賦值
:= 是覆蓋之前的值
?= 是如果沒有被賦值過就賦予等號后面的值
+= 是添加等號后面的值
因而考慮直接添加CXX的標志,如下:
make CXX=/usr/bin/g++-4.9 CUDA_HOME=/usr/local/cuda-8.0
弱弱的說一下,終端中輸入下面的命令,也可以:
make CXX?=/usr/bin/g++-4.9 CUDA_HOME=/usr/local/cuda-8.0
如果要使用nccl,如https://www.cnblogs.com/haiyang21/p/7183413.html中所說,需要Makefile.config中取消注釋USE_NCCL := 1,並將NCCL的include和lib路徑增加到Makefile.config中,具體如下:
USE_NCCL := 1 INCLUDE_DIRS += /path/nccl/build/include LIBRARY_DIRS += /path/nccl/build/lib
但如果使用的是anaconda,可能會提示找不到某個庫。。。后來決定不使用nccl了,因而沒有繼續深入查找原因。見諒。
安裝nccl及可能碰到的問題見:
http://www.cnblogs.com/darkknightzh/p/5717234.html
http://www.cnblogs.com/darkknightzh/p/6950263.html
180320更新結束
=============================================================================================