1. 程式人生 > >Caffe安裝過程全記錄

Caffe安裝過程全記錄

由於專案需要,這周花了兩天時間在實驗室的雲伺服器上搭好了Caffe環境,期間走了一些彎路,也總結了一些經驗教訓。今天又從頭開始重新搭了一遍,並且記錄下了整個過程,形成了這篇安裝筆記,留作備忘。

系統環境:

  • 作業系統:CentOS 6.5 64位
  • 顯示卡配置:無GPU

主要參考文件:

首先明確幾個問題:

  1. 因為我們的伺服器沒有GPU,所以這篇筆記不涉及CUDA和cuDNN的安裝;
  2. 配置了Caffe的Python介面Pycaffe,未配置MATLAB介面Matcaffe;
  3. BLAS選用OpenBLAS庫,Pycaffe的依賴選用Anaconda來安裝;
  4. 基本按照文件2中的順序和方法來安裝各項依賴,當yum軟體庫中的版本不滿足要求時則採取原始碼編譯安裝
    的方式,並調整了個別依賴的安裝次序;
  5. 按照文件3的說法,各依賴均需安裝在/usr/local目錄下,否則Caffe編譯時會提示找不到相應的庫(大多數依賴的預設安裝路徑就在/usr/local,但是有個別除外,需要特別注意;另外,我是用root使用者登入的所以不存在/usr目錄寫入許可權的問題,如果用其他使用者登入的話最好用 sudo 命令來安裝)。

下面是具體的安裝過程:

1. Protobuf

我下載的版本是Protobuf 3.3.2(Pycaffe要求Protobuf版本>=2.5.0):

cd ~
wget https://github.com/google/protobuf/archive/v3.3
.2.tar.gz

解壓:

tar -zxvf v3.3.2.tar.gz
cd protobuf-3.3.2

編譯之前需要先執行下面的指令碼來生成configure檔案:

./autogen.sh

然後就是正常的編譯、安裝:

./configure
make
make check
sudo make install

預設的安裝路徑就在/usr/local,所以只要確保當前使用者有寫入許可權就可以了,不需要特別指定安裝路徑;

安裝完成後重新整理動態庫目錄的快取:

sudo ldconfig

測試是否安裝成功:

protoc --version

如果回顯 libprotoc 3.3.2

則表示安裝成功。

注:這裡編譯的是protobuf的C++介面,由於編譯Python介面所需的依賴較多,所以將其放在安裝Anaconda之後

2. LevelDB,Snappy

Pycaffe要求LevelDB版本>=0.191,yum軟體庫中的版本滿足要求,所以這裡採用Caffe官網給出的方法,直接用yum安裝:

sudo yum install leveldb-devel snappy-devel

安裝時的版本是LevelDB 1.7.0Snappy 1.1.0

安裝的路徑為/usr/include(包含目錄)/usr/lib64(庫目錄),這兩個目錄最後需要在Caffe的Makefile.config檔案中配置。

3. OpenCV

這裡使用GitHub上 @jayrambhia 寫好的指令碼來自動安裝:

cd ~
git clone https://github.com/jayrambhia/Install-OpenCV.git
cd Install-OpenCV/RedHat
sudo ./opencv_latest.sh

安裝時的版本是OpenCV 3.2.0(Caffe要求OpenCV版本>=2.4)。

安裝的過程中在”– ICV: Downloading ippicv_linux_20151201.tgz…”這一步會卡很長時間,而且最後通常都會下載失敗;
我在網上找到了這個包,上傳了一份到這裡 http://download.csdn.net/detail/u010391437/9880368
把下載好的包上傳到目錄 ~/Install-OpenCV/RedHat/OpenCV/opencv-3.2.0/3rdparty/ippicv/downloads/linux-xxx/,重新執行 sudo ./opencv_latest.sh 即可完成安裝。

4. HDF5

後面的Anaconda會自動安裝,這裡可以先跳過這一步。

5. GLog,GFlags,LMDB

這三項依賴均採用Caffe官網給出的方式來安裝:

GLog:

cd ~
wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/google-glog/glog-0.3.3.tar.gz
tar zxvf glog-0.3.3.tar.gz
cd glog-0.3.3
./configure
make && sudo make install

GFlags:

cd ~
wget https://github.com/schuhschuh/gflags/archive/master.zip
unzip master.zip
cd gflags-master
mkdir build && cd build
export CXXFLAGS="-fPIC" && cmake .. && make VERBOSE=1
make && sudo make install

LMDB:

cd ~
git clone https://github.com/LMDB/lmdb
cd lmdb/libraries/liblmdb
make && sudo make install

預設的安裝路徑均在/usr/local,不需要特別指定。

安裝時的版本分別為GLog 0.3.3GFlags 2.2.0LMDB 0.9.21

6. OpenBLAS

我下載的版本是OpenBLAS 0.2.19

cd ~
wget http://github.com/xianyi/OpenBLAS/archive/v0.2.19.tar.gz

解壓:

tar -zxvf v0.2.19.tar.gz
cd OpenBLAS-0.2.19

編譯,安裝:

make
sudo make PREFIX=/usr/local install

由於OpenBLAS的預設安裝路徑是/opt/OpenBLAS,所以這裡我們需要用 PREFIX 選項來指定安裝路徑,安裝到/usr/local。

7. Anaconda

這個包提供了Pycaffe所需的多項依賴,包括Python、NumPy、pandas等,還提供了HDF5等其他的庫。

官網提供了兩種版本:Anaconda2基於Python 2.7,Anaconda3基於Python 3.6。

我下載的版本是Anaconda2 4.4.0

cd ~
wget https://repo.continuum.io/archive/Anaconda2-4.4.0-Linux-x86_64.sh

下載後直接執行即可:

sudo bash Anaconda2-4.4.0-Linux-x86_64.sh

先讓你閱讀license,一路回車;
然後問你是否接受license,輸入yes;
接下來輸入安裝路徑,預設是 ~/anaconda2,我在這裡安到了/usr/local/anaconda2
最後問你要不要把安裝路徑加入使用者環境變數PATH,輸入yes,安裝完成。

安裝完成後還要繼續做一步操作,把Anaconda的庫目錄新增到環境變數中:

開啟當前使用者的 .bashrc 檔案:

vim ~/.bashrc

在末尾新增一行:

export LD_LIBRARY_PATH=your_anaconda_path/lib:/usr/local/lib:$LD_LIBRARY_PATH

用Anaconda的實際安裝路徑替換your_anaconda_path(我在這裡填的是/usr/local/anaconda2);
儲存,退出;
關閉當前終端,重新開啟一個新的終端使環境變數生效。

這一步非常重要,後面執行Caffe的時候如果報錯找不到libxxx.so檔案,很可能就是由於沒有新增庫目錄引起的。

8. Protobuf - Python介面

由於編譯protobuf的Python介面所需的依賴Anaconda都會幫我們自動裝好,所以把Python介面的編譯放到Anaconda安裝之後來做。

cd ~/protobuf-3.3.2/python 
python setup.py build 
python setup.py test 
python setup.py install

完成後進入Python命令列驗證一下是否安裝成功:

python
>>> import google.protobuf

如果沒有報錯則說明protobuf的Python介面安裝成功。

9. Boost

我下載的版本是Boost 1.64.0(Caffe要求Boost版本>=1.55):

cd ~
wget https://dl.bintray.com/boostorg/release/1.64.0/source/boost_1_64_0.tar.gz

解壓:

tar -zxvf boost_1_64_0.tar.gz
cd boost_1_64_0

編譯,安裝:

./bootstrap.sh
sudo ./b2
sudo ./b2 install

預設安裝路徑就在/usr/local,所以不需要特別指定。

10. Caffe

終於迎來了最後一步的重頭戲。

下載:

cd ~
git clone https://github.com/BVLC/caffe.git

修改配置檔案:

cd caffe
cp Makefile.config.example Makefile.config
vim Makefile.config

需要修改的地方有以下幾個:

  1. 取消註釋CPU_ONLY選項(line 8);
  2. 取消註釋OPENCV_VERSION選項(line 21);
  3. 註釋掉GPU設定的相關選項(CUDA_DIR - line 28; CUDA_ARCH - line 36 ~ 44; TEST_GPUID - line 117);
  4. 將BLAS選項改為open(line 50);
  5. 取消註釋BLAS_INCLUDE和BLAS_LIB選項,並修改為OpenBLAS相應的安裝路徑(line 54, 55)(我這裡分別改為/usr/local/include/usr/local/lib);
  6. 註釋掉PYTHON_INCLUDE選項(line 68, 69);
  7. 取消註釋ANACONDA_HOME和PYTHON_INCLUDE選項(line 72 ~ 75),並將ANACONDA_HOME選項修改為Anaconda的安裝路徑(我這裡改為/usr/local/anaconda2);
  8. PYTHON_LIB(註釋掉line 83,取消註釋line 84);
  9. 新增額外的包含目錄INCLUDE_DIRS和庫目錄LIBRARY_DIRS(line 94, 95)(我這裡分別添加了/usr/include/usr/lib64);

修改後儲存退出,執行編譯:

make all
make test
make runtest

PS1. 如果是多核CPU的話可以用 -jn 選項啟動n個執行緒同時編譯,加快編譯速度,比如4核CPU:

make all -j4

PS2. 每次編譯失敗後需要先清理編譯檔案:

make clean

再重新開始編譯。

最後編譯Python介面:

make pycaffe

至此Caffe環境全部安裝完成。

11. Pycaffe編譯和執行過程中的報錯及解決方案

我在編譯和執行Pycaffe的過程中出現過幾個問題,這裡記錄一下,供參考。

11.1 編譯Pycaffe時報錯 “cannot find -lboost_python”

報錯資訊如下:

CXX/LD -o python/caffe/_caffe.so python/caffe/_caffe.cpp
/usr/bin/ld: cannot find -lboost_python
collect2: ld returned 1 exit status
make: *** [python/caffe/_caffe.so] Error 1

報錯的原因是boost.python模組沒有被正確安裝。

解決方案:

重新編譯boost.python模組:

cd ~/boost_1_64_0
./bootstrap.sh --with-libraries=python
sudo ./b2
sudo ./b2 install

之後再重新編譯Pycaffe即可。

我猜測boost.python模組的編譯失敗可能和Python版本有關,因為第一次編譯boost時用的是系統的Python,版本2.6;重新編譯boost.python時系統Python由Anaconda提供,版本是2.7。所以在新版安裝筆記中我把boost放到Anaconda安裝之後才編譯,就沒有再出現這個問題了。

11.2 呼叫Pycaffe時報錯 “No module named google.protobuf.internal”

報錯資訊如下:

Traceback (most recent call last):
  File "/root/caffe/python/classify_mike.py", line 14, in <module>
    import caffe
  File "/root/caffe/python/caffe/__init__.py", line 1, in <module>
    from .pycaffe import Net, SGDSolver, NesterovSolver, AdaGradSolver, RMSPropSolver, AdaDeltaSolver, AdamSolver, NCCL, Timer
  File "/root/caffe/python/caffe/pycaffe.py", line 15, in <module>
    import caffe.io
  File "/root/caffe/python/caffe/io.py", line 8, in <module>
    from caffe.proto import caffe_pb2
  File "/root/caffe/python/caffe/proto/caffe_pb2.py", line 6, in <module>
    from google.protobuf.internal import enum_type_wrapper
ImportError: No module named google.protobuf.internal

報錯的原因是protobuf的Python介面沒有被正確安裝。

解決方案一:

按照第8步重新編譯protobuf的Python介面。

解決方案二:

在Anaconda中安裝protobuf:

cd /usr/local
sudo chmod 777 -R anaconda2
conda install protobuf

編譯安裝成功後便可正常使用Pycaffe。

12. 最後的一點嘮叨

囿於水平有限,文章難免有所疏漏,如果發現哪些地方表述有誤,請指出來大家可以一起討論。

另外這篇文章是我一點一點碼出來的,所以未經允許,請勿轉載,謝謝配合!