Ubuntu16.04不用管理員許可權安裝caffe依賴(上)

left4back發表於2019-05-31

廢話時間:想必很多人都受困於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

相關文章