Ubuntu16.04不用管理员权限安装caffe依赖(上)

废话时间:想必很多人都受困于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,但不知为什么没用,编译的时候还是检索不到动态库。

执行结果如下图所示,仅供参考。

 

 

Ubuntu16.04不用管理员权限安装caffe依赖(上)

 

二、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

上一篇:caffe运行时常见错误


下一篇:11.13python第一周周末练习