2016年1月2日 星期六

筆記:在Mac上安裝Caffe(CPU only)

這篇文章其實不算安裝Caffe的教學,比較像是我自己在安裝的過程中遇到的問題以及所學知識的筆記。

根據官方教學

在Mac上需要做的事
http://caffe.berkeleyvision.org/install_osx.html

編譯Caffe需要做的事
http://caffe.berkeleyvision.org/installation.html#compilation

brew tap指令用來增加brew對資源庫的搜尋[1]。
brew tap <user/repo> <URL>
可以讓brew安裝特定URL的repo下的軟體

若要移除tap過的repo,可使用
brew untap user/repo [user/repo user/repo ...]

brew install option介紹
brew install -vd
-v: verbose
-d: debug

Homebrew是使用git來管理你所下載的repo,local的repo可以在電腦的/usr/local/裡面找到(.git/.gitignore)。以opencv為例,我們可以使用
brew edit opencv
來編輯brew對opencv安裝及編譯的腳本。我們可以利用git來查看我們對腳本所做過的修改,也可以復原我們所做的修改。首先,要使用git查看我們所安裝過的repo前,應該先執行
brew update
更新brew的local repo資訊,接下來就可以
cd /usr/local/

cd $(brew --prefix)
進入repo所在資料夾,然後用
git status
查看修改過的項目了。若要將修改復原,也是使用git,利用reset、checkout等指令將repo回復[17][18]。

snappy: 快速壓縮/解壓縮軟體[2]
leveldb: 資料庫軟體[3]
lmdb: 資料庫軟體[4]
gflags : Commandline flags module for C++[5]
glog : Logging library for C++[6]
szip: HDF裡面使用的壓縮程式[7]
hdf5: 一種儲存和管理資料的格式和函式庫[8]
opencv: 影像處理函式庫
protobuf: 一種輕便高效的結構化數據儲存格式,可將數據進行序列化和反序列化[9][10]
boost: 一群有廣泛功能的函式庫[11]
BLAS: Basic Linear Algebra Subprograms(基礎線性代數程式集),用於線性代數計算的界面規範(or API)[12]
OpenBLAS: Open source的BLAS實作[13]
MKL: Math Kernel Library,Intel的數學函式庫[14]
Clang: 由蘋果公司贊助開發的編譯器前端,以LLVM為後端,希望作為GCC的替代品[15]
Atlas: Automatically Tuned Linear Algebra Software,一個以BLAS API開發的線性代數函式庫[16]


其中OpenBLAS、MKL和Atlas都是BLAS API的實作。Mac OS中本身也有包含BLAS的實作,也就是Accelerate和vecLib函式庫。在安裝Caffe時可以根據情況設定使用上述不同的BLAS函式庫。
    leveldb、lmdb和hdf5都是用來儲存大量數據時使用的資料庫,他們在記憶體使用量及效能上有些差異[24][25],但都能在caffe中使用。
    protobuf是一種儲存格式,在caffe中就是用來制訂每個layer的種類、關係等。


homebrew/science是homebrew收納的函式庫中其中的一個來源。全部函式庫來源可參考homebrew的github首頁:
https://github.com/Homebrew


想要查看所有安裝過的python package,可在python shell/prompt下執行
help('modules')
或是直接在普通command line下執行
pydoc modules

在python中查看當前python使用的版本
import sys
print (sys.version)

pip指令是python下的套件管理工具[19]

Anaconda python是python眾多發行版本中的其中一個,此版本包含了許多好用的功能在裡面。在Mac中會安裝在使用者的Home目錄下(~/anaconda),刪掉此資料夾就可以移除。因為每個版本的python執行檔都是獨立分開的,因此互相不會衝突,但是要使用特定版本時也要指定對應的路徑。

根據官方教學,在brew編譯及安裝python版opencv的腳本中(執行brew edit opencv),有兩行類似
-DPYTHON_LIBRARY=#{py_prefix}/lib/libpython2.7.dylib 
-DPYTHON_INCLUDE_DIR=#{py_prefix}/include/python2.7
(我們可以在vim中用"/"來搜尋)
這兩行是用來規範我們將要用來編譯opencv的python的路徑。在這兩行上方可以找到py_prefix的定義
py_prefix = `python-config --prefix`.chomp
這表示真正py_prefix其實是由一個python-config檔來決定。若我們cd進入系統python的執行檔目錄下,真的可以看到這個python-config檔
cd /usr/bin | grep python
且這個檔本身也是個腳本。因為若打開這個檔,我們可以看到這個"--prefix"確實是這個腳本中的一個參數。順便一提,在Mac中的python-config是沒有"--configdir"這個參數選項的,所以brew的腳本中才會寫到"OS.linux?"這個判斷式吧。
    回到原本的問題,我們這裡要做到的是利用官方很推薦的Anaconda python來幫我們的opencv編譯,但是根據brew的腳本,系統首先會找到的是/usr/bin/下的python-config檔,因此最終會使用的python也是/usr/bin/下的python,而不是我們家目錄的Anaconda python。因此我們需要做的就是改變環境變數,使得家目錄下的Anaconda python優先被找到。
首先利用
export PATH="$HOME/anaconda/bin:$PATH"
將bin資料夾加入PATH,然後
export DYLD_FALLBACK_LIBRARY_PATH="$HOME/anaconda/lib:/usr/local/lib:/usr/lib:$DYLD_FALLBACK_LIBRARY_PATH"
將其他的lib資料夾也加一加。
    這裡有幾點事項,以Mac來說,這兩行應該寫到家目錄下~/.bash_profile中,這樣每次開新terminal才不用再加一次。再來是其實我們安裝anaconda時它其實已經會自動幫我們把export bin的指令加入~/.bash_profile中,所以也不用自己加。最後,export lib資料夾到DYLD_FALLBACK_LIBRARY其實是官方網站的建議,但根據brew編譯opencv的腳本,其實它自己會找的到anaconda的lib,所以理論上我們也不用自己加入...anyway,現在應該已經可以開始編譯anaconda版的opencv了,因為我之前已經先安裝過一次普通版的,所以先執行
brew uninstall opencv
將原先的移除,然後再安裝一次。附帶一提,這時突然出現一個很跳tone的問題,就是brew提示我的一個函式庫numpy的link有問題,要執行
brew link numpy
來修復,但修復到一半又出現什麼f2py已經存在,等等等問題。這裡的重點是,在brew出現這些奇怪提示時,非常建議使用
brew doctor
這個指令,他會幫我們列出許多潛在可能出現的問題,幫助我們解決這些疑難雜症。

依賴函式庫都裝完後,就可以開始正式編譯Caffe了。有兩種方式:
一)先修改目錄底下的Makefile.config.example文件符合自己的電腦系統配備,並將其檔名改為Makefile.config,再執行make
二)直接執行cmake,他會偵測我們的電腦配備,並自動產生合適的Makefile[23]。接下來我們再執行make就好了
這裡我選擇第二種方式。執行下列指令:
mkdir build 
cd build 
cmake .. 
make all -j4
出現下列問題
問題1:
error: expected function body after function declarator
extern void ATLU_DestroyThreadMemory() __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_2, __MAC_10_9, __IPHONE_4_0, __IPHONE_NA);
原因:
是不知道為何,一個在10.9 sdk中的header檔A,include另一個header檔B,而這個B竟然是include到10.8 sdk中的檔。其實在10.9中也有和B同名的header檔,但不知道為何系統會優先去找10.8的。

解法:暫時先利用將xcode目錄下
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk
這個資料夾名稱改掉(前面加個底線就好),但是不確定這樣是否系統會接著找10.9 sdk,但至少這樣改錯誤資訊不一樣了...

問題2[20]:
Building with 'Xcode Clang++'.
ld: library not found for -lpython2
clang: error: linker command failed with exit code 1 (use -v to see invocation)
我以為這個問題是出在我的python library路徑沒有設對,所以去查看了cmake檔中的設定
build/CMakeCache.txt
真的發現不知為何PYTHON_INCLUDE_DIR和PYTHON_LIBRARY這兩個的位置都指到系統的python位置,而不是我所用的anaconda python,所以手動將兩個改掉:
PYTHON_INCLUDE_DIR:PATH=/Users/lindol/anaconda/include/python2.7
PYTHON_LIBRARY:FILEPATH=/Users/lindol/anaconda/lib/libpython2.7.dylib
再次make,發現錯誤資訊回到問題2,表示問題2可能和python路徑沒有關...(*更新)。後來發現其實這個步驟是在build matlab的東西時發生的錯誤,目前也不知道該如何處理,但因為已經花太多時間在build環境,暫時先關閉build matcaffe,讓make能順利跑完。

後續:在runtest時跑出HDF5 library版本不符的問題,但因為我裝的(1.8.16)其實比他要求的(1.8.15)更新,所以我覺得應該沒有問題。在環境變數中設定
export HDF5_DISABLE_VERSION_CHECK="1"
來跳過錯誤訊息。

其他安裝教學[21][22]

*(2016/1/21 更新)後來安裝別人發佈的RNN版caffe,發現將這兩個路徑更改正確非常重要,不然會很容易出現
Segmentation fault 11
的錯誤

參考:
[1] https://github.com/Homebrew/homebrew/blob/master/share/doc/homebrew/brew-tap.md
[2] http://brewformulas.org/Snappy
[3] https://zh.wikipedia.org/wiki/LevelDB
[4] http://symas.com/mdb/
[5] http://brewformulas.org/Gflags
[6] http://brewformulas.org/Glog
[7] https://www.hdfgroup.org/doc_resource/SZIP/
[8] https://www.hdfgroup.org/HDF5/
[9] https://www.ibm.com/developerworks/cn/linux/l-cn-gpb/
[10] http://www.searchtb.com/2012/09/protocol-buffers.html
[11] http://blog.monkeypotion.net/gameprog/note/first-touch-of-boost-cpp-libraries
[12] https://zh.wikipedia.org/wiki/BLAS
[13] http://www.openblas.net/
[14] https://software.intel.com/en-us/intel-mkl
[15] https://zh.wikipedia.org/wiki/Clang
[16] https://en.wikipedia.org/wiki/Automatically_Tuned_Linear_Algebra_Software
[17] http://stackoverflow.com/questions/9369519/reset-homebrew-formula
[18] http://stackoverflow.com/questions/3987683/homebrew-install-specific-version-of-formula
[19] https://blog.longwin.com.tw/2014/08/python-setup-pip-package-2014/
[20] https://github.com/BVLC/caffe/issues/915
[21] http://hoondy.com/2015/04/03/how-to-install-caffe-on-mac-os-x-10-10-for-dummies-like-me/
[22] http://coldmooon.github.io/2015/08/03/caffe_install/
[23] https://github.com/BVLC/caffe/pull/1667
[24] http://wubinblog.com/deep%20learning/2015/07/13/Use_Caffe_For_Classification/
[25] https://www.readability.com/articles/u2ejbfkc


沒有留言:

張貼留言