废话时间:想必很多人都受困于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,目前我还不知道该怎样处理这种情况,但只是有点麻烦,不影响具体使用。
更新:以上方法只能生成静态库,所以更新一下编译方法
1.执行mkdir build && cd build
2.执行cmake -DCMAKE_INSTALL_PREFIX=/path/to/save -DBUILD_SHARED_LIBS=ON ..
3.make && make install
4.配置环境变量,大功告成
六、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