1. 程式人生 > >Ubuntu18.04 下編譯caffe可能出現的問題

Ubuntu18.04 下編譯caffe可能出現的問題

雖然官方提供了在Ubutnu17以上版本的二進位制安裝包,但在如果想使用已有的模型,可能還需要下載github上的caffe-master,並且進行簡單的編譯。這裡把編譯可能會碰到的坑做一個記錄。

新增:

基本安裝方法:

cv::imread(cv::String const&, int)’未定義的引用

解決方法:在“Makefile.config”中預設使用的是opencv2,因此出現這個錯誤,將第21行的註釋取消即可

# Uncomment if you're using OpenCV 3
OPENCV_VERSION := 3

編譯convert_mnist_data.cpp時,記憶體佔用高

一般方法都使用“make all -j”,讓所有核心參與,以達到加速編譯的目的。但在我電腦上出現記憶體洩漏,具體原因未知。通過改為在單核上進行編譯,可解決記憶體洩漏問題。

make all

純粹是個人編譯的記錄。不用CUDA(筆記本是amd卡,萬惡的nvidia);不手動編譯依賴包(apt-get是用來幹啥的?用來直接裝二進位制包,以及自動解決依賴項的)

caffe官方給出的ubuntu下的教程在http://caffe.berkeleyvision.org/install_apt.html

make: protoc: 命令未找到

解決辦法:

sudo apt-get install protobuf-c-compiler protobuf-compiler

fatal error: gflags/gflags.h:沒有那個檔案或目錄

解決辦法:

sudo apt-get install libgflags-dev

順便吐槽一下ubuntu的apt-get命令的補全,它是殘破的。我想下載gflags,於是輸入:

sudo apt-get install gflags #此處直接按tab,希望它補全,tab一次不出來就再按一次

結果呢,只顯示了一個結果:

sudo apt-get install libgflags2v5

問題是,實際上有3個結果:libflags2v5,libgflags-dev,libgflags-doc

ubuntu的命令列,另一個殘破的地方在於,各種包總是喜歡私自新增lib

字首,比如,好好的opencv,非得要libopencv才行(全名並不是libopencv和oepncv,通常都是用-dev或-devel各種的包)

fatal error: glog/logging.h: 沒有那個檔案或目錄

嘗試apt-get install glog,媽蛋,沒有。要這樣:

sudo apt-get install libgoogle-glog-dev

fatal error: hdf5.h: 沒有那個檔案或目錄

媽蛋!老子執行過apt-get install hdf5-tools了,怎麼還說沒有hdf5?而且我當時tab了好幾下,只有兩個結果,另一個是hdf5-helpers不裝也罷。
其實,這又是ubuntu的命令列比較殘破的原因。為什麼不能完整點搜尋?

當然這次,需要的不僅僅是一個-dev包,因為試了後還是報同樣錯誤,那就嘗試:

sudo apt-get install libhdf5-\*  #我用的shell是zsh,如果你沒有用zsh,那就是預設的bash,那就把“\”去掉。這,是zsh比較殘破的地方

然後再make all,還是報同樣錯誤。怒了,這次是caffe自身的問題。要在Makefile.config中把hdf5的一個目錄新增進來:

# 找到這行:
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include

# 替換為:
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial/

fatal error: lmdb.h: 沒有那個檔案或目錄

擦,剛剛明明apt-get安裝了lmdb-utils,怎麼又來?而且,安裝lmdb時tab了好幾次只有這麼一個有用的結果。
這次,又是ubuntu命令的殘破引發的。

解決辦法:

sudo apt-get install liblmdb-dev

make: *** [.build_release/lib/libcaffe.so.1.0.0-rc3] Error 1

這次的問題有點大了。問題完整描述:

AR -o .build_release/lib/libcaffe.a
LD -o .build_release/lib/libcaffe.so.1.0.0-rc3
/usr/bin/ld: cannot find -lboost_python3
collect2: error: ld returned 1 exit status
Makefile:563: recipe for target '.build_release/lib/libcaffe.so.1.0.0-rc3' failed
make: *** [.build_release/lib/libcaffe.so.1.0.0-rc3] Error 1

我也想不出辦法,於是google之。發現caffe在github的repo上有人提出同樣的問題:https://github.com/BVLC/caffe/issues/4045
然後,真是不友好或沒有用的回答,維護caffe的都是什麼鬼?!說什麼,別在issue裡提“使用,安裝,編譯出錯”的問題,請使用caffe-users list。我就草,issue不是用來解決問題的麼?user list是google group谷歌使用者組,一個更不好用的東西,連markdown都沒有,太落後了。anyway,這些都不管用。

管用的方法:再次修改Makefile.config(艹,caffe官方的Makefile.config你敢再殘破一點麼?市面上一共就3種最常用的跑caffe的平臺,第一個就是ubuntu還搞這麼使用者不友好,第二個是fedora只能說還湊合因為fedora自身命令比ubuntu完善,第三個mac使用者暫時不考慮,真正跑caffe的都是燒GPU的,mac使用者管他幹啥)

anyway,要這樣改:

# 原來
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial

LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib

# 現在改成(64位系統):
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

# 或者,你是32位系統:
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial

LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/i386-linux-gnu /usr/lib/i386-linux-gnu/hdf5/serial

這樣就好了麼?天真。還得執行非常骯髒的sed指令碼!

find . -type f -exec sed -i -e 's^"hdf5.h"^"hdf5/serial/hdf5.h"^g' -e 's^"hdf5_hl.h"^"hdf5/serial/hdf5_hl.h"^g' '{}' \;

這個可能是ubuntu自身的問題,也可能是caffe的問題。

blas的問題

作為小白使用者,方便起見,用不著去搞MKL,一則申請麻煩,二則太大。同時也要儘量避免手動編譯。手動編譯原始碼可能帶來更多的依賴項問題。所以儘可能全都用apt-get安裝。

sudo apt-get install libopenblas-dev

reference

==== update 2016年11月5日 17:39:33 ====
換ubuntu16.04了,編譯caffe時會提示:memcpy未定義
解決方法:Makefile中,找到:

NVCCFLAGS += -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)

換成

NVCCFLAGS += -D_FORCE_INLINES -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)