廢話時間:想必很多人都受困於Caffe的環境,上一篇講了如何安裝CUDA,不得不用了很多管理員許可權。我在第一家公司實習的時候,CUDA是放在/usr/local目錄下的,大家都可以用,但自己的home目錄下是空的,其他依賴包括opencv、boost等都要自己解決,且不能使用管理員許可權,可能會把別人的環境搞亂。當時各種亂七八糟搞了一氣總算把環境裝好了,但很多東西我都不懂,導致每次環境出點小問題都要解決好久,平時沒問題的時候也要小心翼翼不敢多做修改,好好的軟體工程活生生玩成了環境工程。現在即將成為正式職工,再這樣搞肯定是不行的,因此(從LOL中)抽出些時間,專門研究一下如何穩穩地不用管理員許可權在自己home目錄下把環境裝好。(也許部分操作不得不用管理員許可權,如有類似操作,我會加粗標示。除非迫不得已,不會用)
廢話時間結束,下面開始正文。
按照github中給出的環境支援,gpu版Caffe地環境依賴主要有以下7個方面:
1.CUDA(已安裝成功);
2.BLAS,這裡我選擇openblas;
3.boost>=1.55;
4.protobuf(臭名昭著,懂的都懂),glog,gflags(這G家兩兄弟曾一度差點把我搞死,這次我決心搞死這兩兄弟),hdf5(又一個闌尾);
5.opencv,我選擇3.1版;
6.lmdb,leveldb(snappy);
7.cudnn。
我將按序安裝。
一、OpenBLAS
OpenBLAS的安裝可以說沒有任何坑。
git clone一份原始碼就不用多說了吧,相信各位git clone工程師都熟練(滑稽)。
進入到OpenBLAS目錄下,直接make,然後按照指示make PREFIX=/path/to/your/save install。然後去指定目錄找取OpenBLAS的include、lib和bin檔案即可。
這裡有一點和其他教程有所不同,很多其他人的教程說了要用apt-get安裝gfortran,但我安裝的系統已經自帶gfortran,所以就直接make了,如果有人需要,我會嘗試一下from source code編譯gfortran,而不用apt-get。
在bashrc檔案里加入export C_INCLUDE_PATH=/path/to/your/save/include:$C_INCLUDE_PATH,export CPLUS_INCLUDE_PATH=/path/to/your/save/include:$CPLUS_INCLUDE_PATH,export LD_LIBRARY_PATH=/path/to/your/save/include:$LD_LIBRARY_PATH,然後source。
這裡我從別人那拷貝來的測試程式,稍做了一點點修改。
#include <cblas.h> #include <stdio.h> int main() { int i = 0; double A[6] = {1.0,2.0,1.0,-3.0,4.0,-1.0}; double B[6] = {1.0,2.0,1.0,-3.0,4.0,-1.0}; double C[9] = {.5,.5,.5,.5,.5,.5,.5,.5,.5}; int M = 3; // row of A and C int N = 3; // col of B and C int K = 2; // col of A and row of B double alpha = 1.0; double beta = 0.0; cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, M, N, K, alpha, A, K, B, N, beta, C, N); for (i = 0; i < 9; i++) { printf("%lf ", C[i]); } printf("\n"); return 0; }
用gcc -o openblas_test openblas_test.cpp -L/path/to/your/save/lib/ -lopenblas編譯然後執行,如果沒報錯,說明openblas編譯成功。
其中-L用於連結動態庫儲存地址,-l用於連結動態庫,我嘗試了在bashrc中加入LD_LIBRARY_PATH,但不知為什麼沒用,編譯的時候還是檢索不到動態庫。
執行結果如下圖所示,僅供參考。
二、boost
boost好像沒聽說有什麼坑。
在boost.org下載的最新版本(1.70.0)boost壓縮檔案;
進入boost所在資料夾;
./bootstrap.sh --with-libraries=all --with-toolset=gcc 其中with-libraries參數列示編譯哪些庫,with-toolset則是編譯工具,如果有多個gcc可以指定版本;
./b2 toolset=gcc 開始進行編譯,這一步會比較漫長,需要耐心等候;
隨後執行./b2 install --prefix=/path/to/save進行安裝,安裝完成後一樣要將安裝目錄下的include路徑export到bashrc檔案中;
至此安裝已經完成,測試我和我參考的部落格不太一致,我編譯使用boost::thread程式的時候需要新增pthread庫,且輸出結果也不太一致。因為我自己尚不太懂多執行緒,這裡就先留白了,等我搞懂了多執行緒再回頭解決這個問題。
我參考的部落格在參考文獻中,原部落格寫的比我詳盡,仍有疑問的朋友可以移步原部落格。
三、protobuf
臭名昭著的protobuf來了,相信大多數玩過caffe的人都一度被這傢伙折磨得痛不欲生,這玩意版本實在太多了,而且版本不相容問題嚴重,這裡我選擇的是3.5.0。
驚聞編譯protobuf需要curl,我係統裡又沒有,為儘可能不使用管理員許可權,這裡選擇build curl from source code,詳情見附錄1。
1.執行./autogen。這一步就搞出一堆么蛾子,我真是不懂為什麼我用G家的東西永遠都這麼痛苦。
第一個問題就是提示無法正確安裝gmock,建議自己下載一個gmock-1.7.0,開啟autogen檔案,按照autogen的指示,將gmock-1.7.0分別重新命名為gmock和gmock/gtest,再執行./autogen。第一個問題解決。
第二個問題更讓人無語,說possible undefined macro: AC_PROG_LIBTOOL,這個問題稍微谷歌了一下,原來是bashrc中還要加一句export ACLOCAL_PATH=$HOME/install/libtool/share/aclocal:$ACLOCAL_PATH。至此autogen終於成功執行。
2.執行./configure --prefix=/path/to/save
3.make
4.(很耗時)make check
5.make install
6.環境什麼的和前面差不多,自行解決吧。
protobuf編譯與安裝主要參考文獻5,這裡推薦儘量使用bashrc管理protobuf的版本,用自己親手裝的版本肯定要有把握一些,儘量不要用自己不清楚來路的東西,以免混亂。
四、glog
1.執行./autogen.sh
2.執行./configure --prefix=XXX
3.make && make install
4.配置環境變數
五、gflag
這個有點麻煩,需要cmake,不巧的是我係統裡也沒有cmake,具體編譯與安裝見附錄2。
1.cmake .
2.make
3.make DESTDIR=/path/to/install install
4.配置環境
使用DESTDIR指定目錄有一個問題,以include為例你生成的最終目錄就是/path/to/install/usr/local/include,目前我還不知道該怎樣處理這種情況,但只是有點麻煩,不影響具體使用。
六、hdf5
這個玩意很雞肋,反正我是從來沒有用過,還經常導致各種奇奇怪怪的報錯,如果有興趣的話可以從caffe中將關於hdf5的內容盡數刪去(也不是很麻煩,以前嘗試過,大概需要半個小時吧)。不過這裡還是編譯一份hdf5以備後患。我這裡下載的版本是1.10.5。
1.執行./configure --prefix=/path/to/save/hdf5/
2.make
3.make install
我最討厭hdf5這個東西,編譯的時候也一直在報warning,雖然程式設計師的世界沒有warning,但還是讓人喜歡不起來。
Ubuntu16.04不用管理員許可權安裝caffe依賴(上)就到這裡了,仔細看下來我們會發現,其實就那麼幾種套路反覆使用,只要最開始安裝的時候環境是乾淨的,就不會有任何問題,即使出現問題也很容易解決。這個系列將會繼續寫下去,直到Caffe跑通為止。
附錄1:build curl from source code
安裝curl需要先後預安裝m4,autoconf,automake和libtool,安裝見參考文獻3中的內容,不需要管理員許可權,沒有任何坑,一次成功。只需要注意兩點,一個是記得用prefix將安裝目錄指定在自己的home下,另外一個是安裝好後要在bashrc中將bin資料夾export path。
1.git clone https://github.com/curl/curl.git
2.執行./buildconf
3../configure --prefix=/path/to/save
4.make && make install
5.在bashrc中將bin資料夾export path
更詳細內容請看參考文獻4
附錄2:編譯cmake
同樣是build from source
1.執行./bootstrap
2.make
3.make DESTDIR=/path/to/install install
參考文獻:
1. https://www.cnblogs.com/qujingtongxiao/p/10197784.html 測試openblas程式的出處
2. https://blog.csdn.net/this_capslock/article/details/47170313 編譯boost參考的部落格,內容比較詳盡
3. https://blog.csdn.net/kobesdu/article/details/83048574 編譯並安裝m4和autoconf
4. https://blog.csdn.net/qianghaohao/article/details/51684862 編譯並安裝curl