標籤:mac os x10.10 caffe cuda opencv gflags
Mac OS X10.10 下安裝caffe
[email protected]
http://blog.csdn.net/surgewong
在Linux學習 Caffe【1】有一段時間了,也漸漸地對 Caffe 的架構有了一點認識。在 Linux 下學習 Caffe 的人很多,網上的參考資料也想對比較多。安裝配置教程很多,出了問題都相對比較好解決。前兩天老大弄了一台Mac 筆記本過來,叫我幫他在 Mac上安裝 Caffe。窮屌絲以前沒有玩過 Mac 筆記本,衝著對 Mac 的這份好奇,開始痛苦的安裝之旅。
一、Mac下軟體安裝方式
習慣了Linux下的 sudo apt-get install XXXX 的軟體安裝方式,對 Mac下 brew install XXXX 很容易上手。不過之前對 Mac 幾乎沒有任何基礎,要瞭解其中的一些特定術語,比如:formula,framework還是有些困難的。多用幾次,就開始慢慢對其有些瞭解。brew 的方式安裝是通過一個叫著 homebrew【2】 軟體包管理工具來實現的。圍繞 brew 的安裝的常用命令有:
brew install XXXX --> 安裝軟體包或者相應的庫
brew uninstall XXXX --> 卸載軟體包或者相應的庫
brew update --> 更新 Homebrew自己
brew upgrade --> 升級所有可以升級的軟體(通過brew方式安裝的)
brew list --> 列出所有通過 brew 安裝的軟體
brew doctor --> 診斷是否安裝成功
brew edit XXXX --> 編輯 XXXX (Formula)相應的軟體配安裝置檔案
brew help --> 列出常用命令
二、 安裝 Caffe 必要的依賴
參考官方教程【3】,Caffe需要安裝的內容有:
CUDA 最好是 6.5 版本
BLAS 可以通過ATLAS,MKL,OpenBLAS 提供
Opencv 版本大於或等於 2.4
Boost 版本大約或等於 1.5, 如有必要還需要提供 python 版本
glog, gflags, protobuf, leveldb, snappy, hdf5, lmdb
下面是非必需的:
Python Python 2.7 numpy 版本大於或等於1.7
Matlab 提供 mex 編譯器
三、CUDA 及 BLAS 的安裝
1.CUDA 的安裝: Mac 下面 CUDA 的安裝相比 Linux 要簡單很多,直接下載【4】,然後直接雙擊,按照提示直接安裝就可以,其他的相關設定可以參考文檔【5】。
主要是需要設定 cuda 相關的路徑,可以在 /etc/profile 中設定下面環境變數:
export PATH=/Developer/NVIDIA/CUDA-6.5/bin:$PATH
export DYLD_LIBRARY_PATH=/Developer/NVIDIA/CUDA-6.5/lib:$DYLD_LIBRARY_PATH
2.Atlas 的安裝: Mac 系統下面的 vecLib 架構(Accelerate Frame)本身就整合了 Atlas的實現,在編譯Caffe的時候只需要指定相應標頭檔所在的目錄就可以。
3.OpenBlas 的安裝: 使用 brew 安裝 就可以。(直接使用brew安裝可能有些問題,後面會介紹)
brew install homebrew/science/openblas ---> 直接安裝
brew install --build-from-source homebrew/science/openblas --> 通過編譯源碼安裝
4.MKL 的安裝: Intel MKL 是一個商業化針對CPU最佳化的一個庫,可以使用學生免費版,可以到intel官網【6】註冊一個帳號,下載相應的mac版本的 MKL。
四、 OpenCV, glog, gflags, protobuf, leveldb, snappy, hdf5, lmdb 的安裝
從Mac 10.9 開始 系統預設的C/C++ 編譯器是 clang/clang++ 而不是 gcc/g++,相應使用的C++ 標準庫是 libc++ (主要是針對 C++ X11)。在Caffe中很多依賴庫主要是基於libstdc++ 庫,所以使用預設編譯選項時,很容易出現:undefined symbols for architecture x86_64 的錯誤。要解決這個問題,就不必須,保證其相應的依賴本身就是基於 libstdc++ 來編譯安裝的。
首先可以通過 brew 的方式來安裝上述依賴,不過需要選擇通過源碼安裝,並且在編譯時間選擇使用 libstdc++庫進行編譯。使用這種方式可以通過編輯 相應的 homebrew formula。前面提到的 openblas 最好也通過該方式進行編譯安裝。對於每個需要安裝的Homebrew formula:
boost snappy leveldb protobuf gflags glog szip lmdb homebrew/science/opencv
使用 brew edit FORMULA(例如 brew edit boost) 加入相應的環境 ENV定義:
def install # ADD THE FOLLOWING: ENV.append "CXXFLAGS", "-stdlib=libstdc++" ENV.append "CFLAGS", "-stdlib=libstdc++" ENV.append "LDFLAGS", "-stdlib=libstdc++ -lstdc++" # The following is necessary because libtool likes to strip LDFLAGS: ENV["CXX"] = "/usr/bin/clang++ -stdlib=libstdc++"
對於每個 formula 按順序 先卸載然後重新通過源碼編譯安裝:
for x in snappy leveldb gflags glog szip lmdb homebrew/science/opencv; do brew uninstall $x; brew install --build-from-source --fresh -vd $x; donebrew uninstall protobuf; brew install --build-from-source --with-python --fresh -vd protobufbrew install --build-from-source --fresh -vd boost boost-python
註: 即便是上面編譯安裝成功,在編譯caffe過程中,可能會提示缺失 tr1/truple 標頭檔,這還需要安裝hdf5 依賴,通過上述類似方式安裝即可。
五、OpenCV 本地源碼編譯,以及 gflags ,glog 本地源碼編譯
1.OpenCV的安裝:上面提到的 brew 的安裝方式可能會安裝失敗。筆者在安裝 opencv 的遇到了不少麻煩。
a. 直接使用 brew install homebrew/science/opencv 能夠成功安裝 opencv,但是該 opencv 沒有編譯 有關 cuda 庫,其本身是通過預設的 libc++ 庫編譯的,因此在使用編譯 Caffe 的時候就會出現上述講的 undefined symbols for architecture x86_64 錯誤。這種方式是不可取的。
b. 筆者在使用 brew install --build-from-source --fresh -vd homebrew/science/opencv 的方式安裝,系統安裝的是2.4.10.1 版本,該版本,有個與cuda相容性問題的 bug,無法正常編譯。(註:對Mac不是很熟悉,沒有嘗試方法修複 該問題)筆者在Linux下使用的版本是 2.4.9,遇到過類似的 bug【7】。因此放棄使用該方法,轉而使用 2.4.9 源碼直接編譯。
c. 在使用源碼編譯的時候,最大的就是如何在 opencv 編譯的時候 讓其選擇 libstdc++ 而不是 libc++。OpenCV 是通過 cmake 來產生 makefile的,要添加 相應的設定就需要修改相應的 cmake 配置。由於對 cmake 的文法不是很熟悉,只能大概猜測。筆者對檔案cmake/OpenCVDetectCUDA.cmake 的第 151行處 添加了
set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS} "-Xcompiler -stdlib=libstdc++; -Xlinker -stdlib=libstdc++")
然後直接按照正常的編譯步驟即可,不過編譯時間比較長。
2. gflags的安裝:筆者使用 第四步的 brew 的方式 安裝並沒有使得 gflags 成功使用 libstdc++庫進行編譯(編譯caffe報錯)。同樣的對 gflags的 cmake 相關檔案 添加 相應的配置。筆者在 cmake/CMakeCXXInformation.cmake 中 第 209 行出添加
set(CMAKE_CXX_FLAGS "-stdlib=libstdc++" ${CMAKE_CXX_FLAGS})
然後直接按照正常的編譯步驟編譯安裝。
3. glog的安裝:glog對 gflags 有依賴,所以安裝 glog之前 必須安裝 gflags,在編譯 glog 時,部分檔案(*unittest.cc)編譯錯誤,其主要問題是名字空間的問題(沒有深究其原因,這裡只給出解決方案)。只需要在相應的檔案中加入
using namespace gflags;
六、編譯 Caffe
在編譯 Caffe 時,需要設定好相關依賴的路徑以及庫依賴,然後等待 make 成功。至此好好享受在 Mac 下使用 Caffe 編程吧!
參考資料:
【1】 Caffe首頁
【2】 Homebrew 首頁
【3】 Caffe 安裝官網
【4】 CUDA 官網
【5】 CUDA 線上文檔
【6】 Intel 官網 MKL
【7】 一個OpenCV 2.4.9 與 CUDA 相容性的 Bug
Mac OS X10.10 下安裝caffe