Preface
这段日子,一直在折腾 caffe, 试跑了一下 CNN、测试了一个 FCN(Fully Convolutional Networks)。
下面纪录一下自己的配置过程(Ubuntu+Driver+MKL+CUDA+cuDNN+python),我在 OS X、Ubuntu(14.04、15.04、15.10 以及 15.10 Kylin版本)上都折腾安装过。可谓战斗经验丰富,目的是给大家做个参考,因为每个人都会遇到各种不同的问题。如果能给读者一丝的帮助,那真是太好了!
一开始我在自己的 MacBook pro 上配置,不过由于 MacBook 没有显卡。之后训练了一个 160M 的数据,笔记本跑了 20 多个小时,都没跑完。风扇“呼呼“地转,心疼。强制停止了,也说明了折腾深度学习这东西,别折腾笔记本了,当个终端就好。于是在一台装有 Ubuntu + Titan X 的电脑上配置,跑数据。Ubuntu 的配置相对 OS X 还是简单多的,OS X 因为默认编译器是 Clang,会麻烦一些。
至于 Windows 版本的 caffe,倩姐折腾了一个星期多才搞定……我选择狗带……不过好像用微软编译好的也很快,不过少了一个配置的过程,感觉不是那么完整,哈哈。
Install general dependencies
caffe 依赖的库很多,这一点原作者贾扬清也承认。我在一开始配置的过程中,经常需要编译错误后停下来,安装缺失的库。
配置的第一步,就是把 caffe 所依赖的通用包直接用 sudo apt-get install ***
来解决。以下是依赖的包,参考 caffe官网配置教程:
$ sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler
$ sudo apt-get install --no-install-recommends libboost-all-dev
$ sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev
这里补充一点,由于每个人的电脑环境情况不一样,所以在后面很多时候用 caffe 的 python 接口的时候。在 import caffe
的时候,会出现 No module named lmdb
之类的情况,这时候试一下用 pip
或者 ‘easy_install’ 来安装缺失的库,如 lmdb
:
$ pip install lmdb
or
$ easy_install lmdb
一般都要加上 sudo
,赋予系统权限,因为要将这些库安装到/usr/local
目录下:
$ sudo pip install lmdb
Install BLAS or Intel MKL
然后是安装 BLAS,是为了让 CPU 矩阵计算时速度更快,可以用 ATLAS:
$ sudo apt-get install libatlas-base-dev
当然了,也可以用 OpenBLAS 或者 Intel MKL,我用的是 MKL。
MKL 是需要进行学生身份认证,并申请秘钥,并且安装包比较大,本文末尾我传一份我下载到的 MKL。安装 MKL 后,如果不配置 MKL 路径与库,编译 caffe 会报错。配置方法:
$ sudo gedit /etc/ld.so.conf.d/intel_mkl.conf
在新建的 intel_mkl.conf
中添加 intel
与 mkl
的路径:
/opt/intel/lib/intel64
/opt/intel/mkl/lib/intel64
Install Nvidia Driver
对于我这台新的工作站,我这台机器的主板是没有集成显卡的,只有 Nvidia Titan X 独显。一开始,安装完 Ubuntu 14.04 后,其显示分辨率很低很低,只有 1360×768 的分辨率。屏幕分辨率不能直视。
所以需要自己安装 Nvidia 的显卡驱动,才能高分辨率显示。但安装 Nvidia 显卡驱动中,各种折腾,吃尽了苦头。
失败的安装方式
一开始我按照网上的教程,走如下的步骤:
如果之前安装过,但每成功,需要先移除之前安装的:
$ sudo apt-get remove --purge nvidia
再安装指定版本:
$ sudo add-apt-repository ppa:xorg-edgers/ppa
$ sudo apt-get update
$ sudo apt-get install nvidia-352
我个人极其不推荐上面的安装方式!我安装的方法是用 Synaptic Package Manager,见下面。
我个人也非常不推荐用网上的驱动文件,如 NVIDIA-Linux-x86_64-361.42_0.run,按照所谓的 Ctrl+Alt+F1
进入终端安装!
关于安装好之后分辨率的调节问题
安装后 Logout,重新进入调整屏幕分辨率。发现最大只能到 1360×768 ,我以为我的显卡驱动没有安装好,因为我看我们组的服务器以及倩姐的电脑,都能达到 1080 的分辨率。这块至少折腾了我一个星期,最后得出结论:
只要是含有集成显卡的,都可以调节为1080的分辨率。而只含有Nvidia独显de机器,比如说我的机器只含有Titan X这一个显卡,就不可能调节成1080的分辨率,当然这是在系统是Ubuntu系统的情况下。对于Windows系统,发现分辨率可以支持的很高,要看你的显示器支持多大的分辨率了。我发现上面可能还是有问题,前一阵子同学告诉我说,只要用 HDMI 接口进行输出,就可以得到 1080 分辨率!买了一个 HDMI 转 VGA 的接口,连接到显示器,真的可以 1080 输出!如果你的显示器可以直接接 HDMI 接口,那就更好了,都不用买转接口了。
所以这块得看个人自己的电脑配置。软硬件最好都检查几遍,很可能不是软件的问题,而是像我这样,是硬件接口问题。
本人推荐安装显卡驱动的方式
我采取的方法是:
先去 Ubuntu Software Center 里安装 Synaptic Package Manager(新立得安装包管理器)。打开 Synaptic,输入:nvidia
:
之后,会查出所有的 nvidia 包,在里面选择 nvidia-352,选中后,再点击 Apply 按钮,Synaptic 包管理器会把 nvidia-352 所要一并安装的,都一起安装,安装完后,你会发现其实多安装了很多东西。所以这个安装驱动方式,比自己一个一个安装那些包,保险很多很多。
安装完如下:
之后,再注销,重新调整屏幕分辨率。
个人强烈推荐以上傻瓜式的驱动安装方式!
而且,这块安装显卡驱动过程中,得到教训是,Nvidia的闭源驱动真的是Linux不稳定因素的主要原因,不光难装(有的还需要按ALT+Ctrl+F1
进入控制台界面,用run文件进行安装),而且在安装之后,系统会经常性的崩溃!
所以,如果对命令行不熟悉的,我推荐可以用新立得安装包管理器(Synaptic)安装Nvidia驱动,很方便。
而且,对于自己不熟悉的命令,不要乱敲进Terminal!
Install CUDA
之后, 下载并安装 CUDA。下载到 *.deb
文件后,推荐用命令行的安装方式,直接用 Ubuntu 的 Software Center 安装之后,貌似 /usr/local/
文件夹下并不会出现关键的 cuda
这个文件,我试验了几次,都是这样的情况,所以推荐命令行(以我自己的CUDA7.5版本为例):
$ sudo dpkg -i cuda-repo-ubuntu1404-7-5-local_7.5-18_amd64
$ sudo apt-get update
$ sudo apt-get install -y cuda
完成后,记得配置 CUDA 的 /usr/local/cuda-7.5/bin
到 PATH
、/usr/local/cuda-7.5/lib64
到 LD_LIBRARY_PATH
。执行 bash
:
$ sudo vim ~/.bashrc
添加路径:
export PATH=/usr/local/cuda-7.5/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-7.5/lib64:$LD_LIBRARY_PATH
可以 Terminal 中用以下命令查看 CUDA 版本:
$ nvcc --version
CUDA 版本信息,显示如下:
Install cuDNN
cuDNN 是 GPU 加速计算神经网络的加速库。
更新真的跟快,我之前下载的时候还是 v4 版本,现在都到 v5 了。
不过提醒的是,如果你的深度学习框架,如 caffe,由于版本问题,有些 caffe 的版本只支持 cuDNN6.5 版本,有些,只支持 7.0 及更高版本。编译的时候出现 cuDNN 的报错,十有八九是 cuDNN 的版本不对导致,所以这一块按需下载,并进行正确连接。
下面我纪录下 cuDNN v2 版本,cuDNN v4,还有 cuDNN v5.1 版本的配置链接过程。
配置 cuDNN v4 版本
cuDNN v4,下载文件名称: cudnn-7.0-linux-x64-v4.0-prod.tgz
//安装cuDNN
$ sudo tar xvf cudnn-7.0-linux-x64-v4.0-prod.tgz
$ cd cuda/include
$ sudo cp *.h /usr/local/include/
$ cd ../lib64
$ sudo cp lib* /usr/local/lib/
$ cd /usr/local/lib
$ sudo chmod +r libcudnn.so.4.0.7
//链接cuDNN的库文件
$ sudo ln -sf libcudnn.so.4.0.7 libcudnn.so.4
$ sudo ln -sf libcudnn.so.4 libcudnn.so
$ sudo ldconfig -v
配置 cuDNN v2 版本
cuDNN v2,下载文件名称: cudnn-6.5-linux-x64-v2.tgz
//安装cuDNN
$ sudo cp cudnn.h /usr/local/include
$ sudo cp libcudnn.so /usr/local/lib
$ sudo cp libcudnn.so.6.5 /usr/local/lib
$ sudo cp libcudnn.so.6.5.48 /usr/local/lib
//链接cuDNN的库文件
$ sudo ln -sf /usr/local/lib/libcudnn.so.6.5.48 /usr/local/lib/libcudnn.so.6.5
$ sudo ln -sf /usr/local/lib/libcudnn.so.6.5 /usr/local/lib/libcudnn.so
$ sudo ldconfig -v
配置 cuDNN v5.1 版本
更新补充一个 cudnn v5.1 的配置过程,下载文件名称为: cudnn-7.5-linux-x64-v5.1.tgz:
$ tar zxvf cudnn-7.5-linux-x64-v5.1.tgz
$ cd cuda
$ sudo cp include/cudnn.h /usr/local/include
$ sudo cp lib64/libcudnn.* /usr/local/lib
$ sudo ln -sf /usr/local/lib/libcudnn.so.5.1.3 /usr/local/lib/libcudnn.so.5
$ sudo ln -sf /usr/local/lib/libcudnn.so.5 /usr/local/lib/libcudnn.so
$ sudo ldconfig -v
如下图所示:
Git and compile caffe
现在,基本把 caffe 所需要的各种环境及依赖安装好了,下面就是要 git
caffe 源码了:
$ git clone https://github.com/BVLC/caffe.git
再cd
进 caffe 目录下,按照官网上的教程:
$ cp Makefile.config.example Makefile.config
再修改 Makefile.config 文件,前方高能!这里坑太多……
第一步,因为我是有 GPU 的,所以,不需要 CPU_ONLY 的,如果没有的话,需要把这行取消注释,用 CPU 跑。
我也配置了 cuDNN 库,所以取消注释:
USE_CUDNN := 1
这里坑太多是因为每个人的电脑的配置、环境都不一样,所以需要根据自己的实际去判断、选择、修改Makefile.config里的环境。所以,这地方需要细心、耐心,加油!
我还修改的地方是:
//This is required only if you will compile the MATLAB wrapper
//MATLAB directory should contain the mex bin
MATLAB_DIR := /usr/local/MATLAB/R2015b
这里,我需要配置 Matlab wrapper,所以需要提供 Matlab 的环境位置。
接下来就是:
$ make all
或者:
$ make all -j8
我推荐后面一种编译方式,编译速度快很多,意思是用电脑的8个线程来编译。caffe 官网上建议根据自己计算机的实际情况合理分配线程。
之后:
$ make test -j8
$ make runtest -j8
这里,如果之前的 CUDA 没有安装好,或者 CUDA 的库没有配置好,会出现如下错误:error while loading shared libraries: libcudart.so.7.5: connot open shared object file: No such file or directory,如下图:
这里要使得编译通过,得加上如下语句:
$ export PATH = /usr/local/cuda-7.5/bin:$PATH
$ export LD_LIBRARY_PATH = /usr/local/cuda-7.5/lib64:$LD_LIBRARY_PATH
我比较奇怪,我在之前一台机子上编译的时候并没有出现这种问题,但这里却碰到很多次了。仔细 Google 一下,碰到这种问题的还挺多。
之后,make runtest -j8
完成,对于我编译的版本的 caffe,出现了如图的警报:YOU HAVE 2 DISABLED TESTS
我跑了两遍,都出现了这种情况。Google 之,发现 caffe 作者之一的 Shelhamer 在 Github 上有解答:
所以,这不是我编译出了问题,而是这个版本caffe自己本身的问题。
Compile python wrapper and Matlab wrapper
最后一部分就是编译 caffe 的 python wrapper,与编译 Matlab 的 wrapper。
$ make pycaffe
$ make matcaffe
这里一个问题是,经常当我们编译好 python 的接口后,进入 python 控制台,想 import caffe
导入 caffe 模块的时候,会出现如下的错误:
No Module named caffe
解决办法是,export
导入编译好的 python 借口的路径:
$ export PYTHONPATH=/home/chenxp/caffe/python:$PYTHONPATH
根据我的实践,只要是成功编译好 python wrapper 的情况下,这种方法还没有不成功过。
/home/chenxp/caffe/python
是我的路径,这个根据自己的路径正确填写即可。
之后,就可以import caffe
啦~^_^
至此,caffe 的配置、编译、安装已经完成,enjoy…Y(^_^)Y…
再强调一次,每个人的环境都不一样,每个人遇到的问题也会不一样,所以解决方法不能一概而论,没有完全的通解。所以,在遇到实际的报错时,还需要自己去探索解决。加油,希望你能体会到这种解决问题的快乐!
Supplementary
最后,附上我配置过程中的各种库与包,但还是强烈建议去官网下载自己对应的包。
1. Nvidia CUDA: http://pan.baidu.com/s/1gfwlb31 (key: gmxf)
2. Intel Parallel Studio XE: http://pan.baidu.com/s/1miEiN0G (key: ax67)
3. Nvidia cuDNN: http://pan.baidu.com/s/1o7Di4P0 (key: dyyk)