Ubuntu16.04安装cuda库,然后下载和编译caffe-ssd,自己实现基于GPU的训练

最近开始琢磨深度学习中经典的 SSD 网络,了解其基本原理后,迫不及待的想自己训练 SSD 玩玩,为之后的深入研究学习打下基础。当然了,最好把 GPU 利用起来,否则整个训练周期势必会比较久。为此,我把手边闲置的显卡 GeForce GTX 1050 安好,因为不习惯在 Windows 下开发,所以决定安装 Ubuntu 系统,本文记载在刚安装好的 Ubuntu 中搭建 caffe-ssd 开发环境的过程。

安装过程并不是一帆风顺,这也是我写下本文的基本原因——记录遇到的坑以及相应的解决问题。

检查显卡是否被Ubuntu识别

执行下面这行命令:

$ lspci |grep NVIDIA
01:00.0 VGA compatible controller: NVIDIA Corporation Device 1c81 (rev a1)
01:00.1 Audio device: NVIDIA Corporation Device 0fb9 (rev a1)

输出正常。一般还可以使用nvidia-smi命令查看当前显卡的状态:

$ nvidia-smi

若是没有该命令,一般可以更新下驱动,更新驱动是简单的,因为我使用的 Ubuntu 是桌面系统,在系统设置里就能够直接更新:

系统设置

安装 cuda-toolkit

先尝试了执行 apt 命令:

$ sudo apt install nvidia-cuda-toolkit

完成后,没有找到类似于 /usr/local/cuda 之类的目录,因此决定从官网下载安装,如下图选择后,会得到下载链接:

得到下载链接

这里下载后,我多执行了一条 chmod +x 命令,否则似乎 .run 文件无法被执行。

$ wget http://developer.download.nvidia.com/compute/cuda/10.2/Prod/local_installers/cuda_10.2.89_440.33.01_linux.run
$ sudo chmod +x cuda_10.2.89_440.33.01_linux.run
$ sudo ./cuda_10.2.89_440.33.01_linux.run

此时得到下面这样的提示信息:

提示信息

大意是系统中已经有驱动了,推荐我们先卸载它再安装。最好按照推荐来,执行下面的命令卸载已有驱动:

$ sudo service lightdm stop
$ sudo apt-get --purge remove nvidia*
$ sudo apt autoremove

$ sudo apt-get --purge remove "*cublas*" "cuda*"
$ sudo apt-get --purge remove "*nvidia*"

然后再重新运行安装程序,得到下面的选择信息:

Do you accept the above EULA? (accept/decline/quit):

输入 “accept” 按下回车确认, 即可执行安装,完毕后,得到如下提示信息:

提示信息

根据提示,我们需要把 /usr/local/cuda-10.2/lib64/usr/local/cuda-10.2/bin 分别加入到环境变量 LD_LIBRARY_PATH 和 PATH 中,因此在 ~/.bashrc 中添加之:

$ vim ~/.bashrc

在最后加入下面两行

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-10.2/lib64
export PATH=$PATH:/usr/local/cuda-10.2/bin

保存后,输入下面的命令更新:

$ source ~/.bashrc

安装依赖库

Ubuntu 安装 caffe 的依赖库很方便,只需执行下面的 apt 命令就可以了:

$ sudo apt update
$ sudo apt install git
$ sudo apt install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler
$ sudo apt install --no-install-recommends libboost-all-dev
$ sudo apt install libatlas-base-dev
$ sudo apt install python-dev
$ sudo apt install libgflags-dev libgoogle-glog-dev liblmdb-dev

各个依赖库的基本作用可以参考我的这篇文章

编译 caffe-ssd

这个其实可以参考https://github.com/weiliu89/caffe.git,文档写的很细了。执行下面的命令:

$ git clone https://github.com/weiliu89/caffe.git
$ cd caffe
$ git checkout ssd
$ cp Makefile.config.example Makefile.config

接下来其实就是编译 caffe,执行 make 即可,期间遇到的问题可以参考我之前的这篇文章

$ make -j

不过,之前的那篇文章编译的是 CPU_ONLY 版本的 caffe,没有遇到下面这两个问题,这里把解决方案列一下:

nvcc fatal : Unsupported gpu architecture 'compute_20'

这个问题其实是 cuda 版本不匹配导致的,打开 Makefile.config 文件,找到相应位置:

# CUDA architecture setting: going with all of them.
# For CUDA < 6.0, comment the *_50 through *_61 lines for compatibility.
# For CUDA < 8.0, comment the *_60 and *_61 lines for compatibility.
# For CUDA >= 9.0, comment the *_20 and *_21 lines for compatibility.
CUDA_ARCH := -gencode arch=compute_20,code=sm_20 \
                -gencode arch=compute_20,code=sm_21 \
                -gencode arch=compute_30,code=sm_30 \
                -gencode arch=compute_35,code=sm_35 \
                -gencode arch=compute_50,code=sm_50 \
                -gencode arch=compute_52,code=sm_52 \
                -gencode arch=compute_60,code=sm_60 \
                -gencode arch=compute_61,code=sm_61 \
                -gencode arch=compute_61,code=compute_61

因为我用到的 cuda 版本号为 10.x,所以按照提示信息,把下面这两行注释掉或者删除即可解决:

-gencode arch=compute_20,code=sm_20
-gencode arch=compute_20,code=sm_21

cannot find -lhdf5_hl / -lhdf5

我们前面使用的 apt 命令安装的 hdf5 带了 serial 后缀,因此在相应的库路径里,其实链接库也是带 serial 后缀的,解决方法很简单,执行下面的命令即可:

$ cd /usr/lib/x86_64-linux-gnu   //hdf5库链接所在路径
$ sudo cp libhdf5_serial.so libhdf5.so
$ sudo cp libhdf5_serial_hl.so libhdf5_hl.so

编译好 caffe 后,执行下面的命令:

$ make py
CXX/LD -o python/caffe/_caffe.so python/caffe/_caffe.cpp
python/caffe/_caffe.cpp:10:31: fatal error: numpy/arrayobject.h: No such file or directory
compilation terminated.
Makefile:507: recipe for target 'python/caffe/_caffe.so' failed
make: *** [python/caffe/_caffe.so] Error 1

报错了,按照提示信息,应该是没找到 python 的 numpy 库,执行下面的命令安装之:

$ sudo apt install python-pip
$ sudo pip install numpy

这里使用 python2.7 安装 numpy 库可能会遇到的问题是:

RuntimeError: Python version >= 3.5 required.

我的机器 python 链接的是 python-2.7,而 caffe 默认使用的也是 python2,因此这里就懒得修改了,尝试安装更低版本的 numpy(版本尽量高一点,否则稍后的ssd生成数据部分的python程序不能正常运行):

$ sudo pip install numpy==1.12.0
...
Successfully installed numpy-1.12.0

此时便可成功安装,安装成功后,可以在下面的目录找到 numpy:

/usr/local/lib/python2.7/dist-packages/numpy

这样看来,还需要修改 Makefile.config 文件中关于 numpy 路径的内容:

修改 Makefile.config 文件

现在再执行 make py 便可成功:

$ make py
$ make test -j3

make test 可以编译出若干测试程序。

下载和制作数据集

编译工作完成后,就可以下载数据集准备训练了。要是为了快速测试,可以使用默认目录,也即将数据集下载到 $HOME 目录里:

$ cd $HOME/data
$ wget http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar
$ wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar
$ wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar

$ tar -xvf VOCtrainval_11-May-2012.tar
$ tar -xvf VOCtrainval_06-Nov-2007.tar
$ tar -xvf VOCtest_06-Nov-2007.tar

下载完毕后,便可执行下面两条命令制作数据集:

$ ./data/VOC0712/create_list.sh
$ ./data/VOC0712/create_data.sh

执行这两条命令前,我们可能需要将 caffe 库的链接路径,以及编译后的 python 目录添加到相应的环境变量:

$ export LD_LIBRARY_PATH=/usr/local/cuda-10.2/targets/x86_64-linux/lib
$ export PYTHONPATH=<caffe根目录>/python

然后需要额外安装两个 python 库,执行下面两条命令即可:

$ sudo apt-get install python-skimage
$ sudo pip install protobuf 

下载 VGG 网络

ssd 网络似乎用到了一部分的 VGG 网络,点击这里可以下载到相应的文件。同样的,为了快速实验,可以将其下载到默认目录:

$ cd <caffe源码根目录>/models
$ mkdir VGGNet
$ cd VGGNet
# wget -c <VGG网络下载链接>
# unzip VGG.zip

训练

训练很简单,只需要执行下面的命令即可:

$ python examples/ssd/ssd_pascal.py

可以看出,负责训练的脚本即为 ssd_pascal.py,若是训练过程中有需要修改的东西,大都在该文件中完成。例如我的显卡比较 low,显存只有 2GB,在执行上述命令后,得到错误信息“显卡内存不足”,便可在 ssd_pascal.py 文件内搜索“batch_size”关键字,将其改小。

训练过程中,能够发现 loss 总体是不断变小的,如下图:

loss 总体是不断变小的

这里我遇到了一个问题,使用默认参数训练时,几百次迭代后,出现了 loss 为 nan 的情况,我把 ssd_pascal.py 里的 base_lr 缩小 10 倍解决了该问题。(若是还出现这个问题,再缩小10倍,或者尝试放大一点。)

阅读更多:   Caffe , 深度学习
添加新评论

icon_redface.gificon_idea.gificon_cool.gif2016kuk.gificon_mrgreen.gif2016shuai.gif2016tp.gif2016db.gif2016ch.gificon_razz.gif2016zj.gificon_sad.gificon_cry.gif2016zhh.gificon_question.gif2016jk.gif2016bs.gificon_lol.gif2016qiao.gificon_surprised.gif2016fendou.gif2016ll.gif