您的位置:首页 > 其它

Cuda-ConvNet2——在Ubuntu16.04系统上搭建AlexNet实验环境

2018-04-10 22:46 543 查看

引言

Cuda-ConvNet2是AlexNet的算法原型库,Alex Akrizhevsky 所写关于ConvNet的文章大部分都用这个库来实现。这个库的环境搭建相当简单,下面我进行简单介绍。

正文

cuda-convnet2的环境搭建很简单,不过有个很重要的问题需要注意。这库基本上是跑GPU的,而且还要求显卡GPU对CUDA的计算兼容性在3.5以上,因此打算玩这个库的朋友需要注意一下自己的显卡是否合适别浪费时间咯。

然而,有的人会纠结难道难道3.5以下这个库就完全没戏了么?实话说,我也稍微纠结过这个问题,毕竟我的显卡GPU兼容性也就2.1。我对这个库的源码稍微分析过一下,并发现之所以不能用3.5以下GPU来跑这个库,主要是因为不同架构GPU在CUDA开发包的可用API是不一样的。以2.1兼容性的GPU为例,我发现cuda-convnet2会用到一个跟Texture有关的API,而这个API却是我这个2.1兼容性的GPU没有的。

为什么会没有了呢?我想这可能跟这个GPU的架构设计有关系,也就是兼容性低的GPU架构本来就不是为了让用户做CUDA方面的开发而设计的,所以就当然不会让这颗U正常调用cuda里面的一些函数。

那是不表示2.1兼容性的GPU性能就没有3.5的强呢?我觉着并不一定,换句话说,我认为GPU的CUDA计算兼容性与GPU的计算性能没有丝毫关系。因为计算性能的决定因素有很多方面,当然cuda核心数量肯定是一个重要方面,但是不可忽略的是显存大小也能决定一颗GPU的计算性能,毕竟现在很多优化计算问题都可采用空换时(trade space for time)策略解决。而且,有的低兼容性的GPU其cuda核心也可能比高兼容性的多,可能只是GPU内部的一些核心模块的逻辑结构与cuda的某些如纹理计算之类的实现冲突而兼容性显低而已。所以cuda兼容性低并不代表GPU的性能就差,而细心的读者也会发现,我前文一直将cuda compute capability称为cuda兼容性,而非cuda计算性能的用意。希望广大读者加以区分,或者觉着我的理解有误,欢迎评论指点纠正。

最后回到原来的问题,到底2.1兼容性的GPU能不能跑这个库? 相信大家心里都已经明白,其实我认为是可以跑的(这是TRIZ的因果链分析的简单应用)。但是这个api函数不兼容问题怎么解决?我认为只要理解了源码在该地方调用cuda的这个函数的用意,再按照原理适当修改api的调用方式即能解决那个问题。不过,这个只是我提供的一个理论上的解决思路,具体的实现由于本人对cuda和Alex该库的内部实现理解不够透彻,还没来得及对这个思路进行验证,只能请广大读者见谅。日后我可能会抽出时间来解答这个问题并分享给大家。

操作流程

前文不小心发了一段牢骚,我们现在赶紧进入主题——如何编译安装使用这个库。

首先,我们进入cuda-convnet2的代码仓库。然后,在界面中我们会看到一个Branch:master字样的按钮,这表示我们的所在分支是master主分支,我们可以在这里点击Clone or Download按钮再点击DownloadZIP直接下载代码,也可以点击Clone or Download按钮复制里面的URL地址再git clone下来。具体指令如下:

$ git clone https://github.com/akrizhevsky/cuda-convnet2.git[/code] 
然后,我们点击Branch:master按钮,再点击下面的一个wiki选项,进入wiki分支。进入wiki分支后我们会看到,很多md文件,如Arguments.md,Compiling.md,Data.md,LayerParams.md等等。我们点击Compiling.md查看这个文件的内容,并根据里面的步骤进行操作,下面我将里面的指令摆出来。

$ sudo apt-get install python-dev python-numpy python-scipy python-magic python-matplotlib libatlas-base-dev libjpeg-dev libopencv-dev git

$ cd cuda-convnet2

$ sh build.sh


需要注意的是,我上面的步骤是默认大家已经安装在ubuntu系统上安装好Nvidia显卡驱动和搭建好cuda的开发环境。如果cuda开发环境有问题的话,可以去参考我的另一篇博客,我的是2.1兼容性的,5.0兼容性以上的我建议搭建cuda8.0环境,n卡驱动安装和cuda编译的方法基本一样。

build完后,我们可以根据作者的这个说明,下载数据集,测试是否安装成功。下面给出我在cuda-convnet2目录下所用到的指令:

$ mkdir data

$ cp ~/Download/cifar-10-py-colmajor.tar.gz data

$ tar xvf data/cifar-10-py-colmajor.tar.gz

$ python convnet.py --data-provider cifar --test-range 6 --train-range 1-5 --data-path data/cifar-10-py-colmajor --inner-size 24 --save-path data --gpu 0 --layer-def layers/layers-cifar10-11pct.cfg --layer-params layers/layer-params-cifar10-11pct.cfg


最后,我给出这边的部分运行结果:

Initialized data layer 'data', producing 1728 outputs
Initialized data layer 'labels', producing 1 outputs
Initialized convolutional layer 'conv1' on GPUs 0, producing 24x24 64-channel output
Initialized max-pooling layer 'pool1' on GPUs 0, producing 12x12 64-channel output
Initialized cross-map response-normalization layer 'rnorm1' on GPUs 0, producing 12x12 64-channel output
Initialized convolutional layer 'conv2' on GPUs 0, producing 12x12 64-channel output
Initialized cross-map response-normalization layer 'rnorm2' on GPUs 0, producing 12x12 64-channel output
Initialized max-pooling layer 'pool2' on GPUs 0, producing 6x6 64-channel output
Initialized locally-connected layer 'local3' on GPUs 0, producing 6x6 64-channel output
Initialized locally-connected layer 'local4' on GPUs 0, producing 6x6 32-channel output
Initialized fully-connected layer 'fc10' on GPUs 0, producing 10 outputs
Initialized softmax layer 'probs' on GPUs 0, producing 10 outputs
Initialized logistic regression cost 'logprob' on GPUs 0
Initialized neuron layer 'conv2_neuron' on GPUs 0, producing 9216 outputs
Initialized neuron layer 'conv1_neuron' on GPUs 0, producing 36864 outputs
Initialized neuron layer 'local4_neuron' on GPUs 0, producing 1152 outputs
Initialized neuron layer 'local3_neuron' on GPUs 0, producing 2304 outputs
Layer local4_neuron using acts from layer local4
Layer conv2_neuron using acts from layer conv2
Layer local3_neuron using acts from layer local3
Layer conv1_neuron using acts from layer conv1
=========================
Importing cudaconvnet._ConvNet C++ module
Fwd terminal: logprob
found bwd terminal conv1[0] in passIdx=0
=========================
Training ConvNet
Add PCA noise to color channels with given scale                        : 0     [DEFAULT]
Check gradients and quit?                                               : 0     [DEFAULT]
Conserve GPU memory (slower)?                                           : 0     [DEFAULT]
Convert given conv layers to unshared local                             :
Cropped DP: crop size (0 = don't crop)                                  : 24
Cropped DP: test on multiple patches?                                   : 0     [DEFAULT]
Data batch range: testing                                               : 6-6
Data batch range: training                                              : 1-5
Data path                                                               : /home/czy/cuda-convnet2/data/cifar-10-py-colmajor
Data provider                                                           : cifar
Force save before quitting                                              : 0     [DEFAULT]
GPU override                                                            : 0
Layer definition file                                                   : layers/layers-cifar10-11pct.cfg
Layer file path prefix                                                  :       [DEFAULT]
Layer parameter file                                                    : layers/layer-params-cifar10-11pct.cfg
Load file                                                               :       [DEFAULT]
Logreg cost layer name (for --test-out)                                 :       [DEFAULT]
Minibatch size                                                          : 128   [DEFAULT]
Number of epochs                                                        : 50000 [DEFAULT]
Output test case predictions to given path                              :       [DEFAULT]
Save file override                                                      :
Save path                                                               : /home/czy/cuda-convnet2/data
Subtract this scalar from image (-1 = don't)                            : -1    [DEFAULT]
Test and quit?                                                          : 0     [DEFAULT]
Test on one batch at a time?                                            : 1     [DEFAULT]
Testing frequency                                                       : 57    [DEFAULT]
Unshare weight matrices in given layers                                 :
Write test data features from given layer                               :       [DEFAULT]
Write test data features to this path (to be used with --write-features):       [DEFAULT]
=========================
Running on CUDA device(s) 0
Current time: Sun Nov 13 00:31:56 2016
Saving checkpoints to /home/czy/cuda-convnet2/data/ConvNet__2016-11-13_00.31.53
=========================
1.1 (0.00%)... logprob:  2.131817, 0.791100, 0.791100 (0.923 sec)
1.2 (0.00%)... logprob:  1.848215, 0.677400, 0.677400 (0.634 sec)
1.3 (0.00%)... logprob:  1.691642, 0.619000, 0.619000 (0.682 sec)
1.4 (0.00%)... logprob:  1.641809, 0.601800, 0.601800 (0.668 sec)
1.5 (0.00%)... logprob:  1.580539, 0.575400, 0.575400 (0.672 sec)
2.1 (0.00%)... logprob:  1.499334, 0.536500, 0.536500 (0.799 sec)
2.2 (0.00%)... logprob:  1.488749, 0.535900, 0.535900 (0.668 sec)
2.3 (0.00%)... logprob:  1.405309, 0.498600, 0.498600 (0.665 sec)
2.4 (0.00%)... logprob:  1.398284, 0.504500, 0.504500 (0.658 sec)
2.5 (0.00%)... logprob:  1.375380, 0.489900, 0.489900 (0.721 sec)
3.1 (0.00%)... logprob:  1.309617, 0.461900, 0.461900 (0.767 sec)
3.2 (0.00%)... logprob:  1.323348, 0.471600, 0.471600 (0.683 sec)
3.3 (0.00%)... logprob:  1.256998, 0.443600, 0.443600 (0.700 sec)
3.4 (0.01%)... logprob:  1.261199, 0.452100, 0.452100 (0.712 sec)
3.5 (0.01%)... logprob:  1.221494, 0.435300, 0.435300 (0.662 sec)


FAQ

问题1:

我的GPU的CUDA兼容性在3.5以上的,但为什么运行时会出现下面这个错误?

src/nvmatrix.cu(394) : getLastCudaError() CUDA error : kSetupCurand: Kernel execution failed : (8) invalid device function .


解答:这其实是cuda编译工具nvcc的一个不完善之处,nvcc编译程序时,并不会自动根据当前系统中现存GPU的兼容性来调整对程序的编译方式,所以其实你的GPU在cuda里面是能用这个api的,只是nvcc编译的时候统一按照3.5的兼容架构编译,编译结果在你的GPU上无法运行而已。具体解决方案是修改几个makefile文件(cudaconv3/Makefile, cudaconvnet/Makefile 以及 nvmatrix/Makefile)。修改点如下(以5.0兼容架构为例):

原来的:
GENCODE_SM35    := -gencode arch=compute_35,code=sm_35
GENCODE_FLAGS   := $(GENCODE_SM35)
变成:
GENCODE_SM50    := -gencode arch=compute_50,code=sm_50
GENCODE_FLAGS   := $(GENCODE_SM50)


也就是将原来35,换成我们自己对应的兼容性值。另外,还需要注意修改后,在编译之前需要将原来编译目标结果都删掉,不然可能编出来还有问题。

问题2:

出现类似Import Error: libcudart.so can not be found 的问题。

解答:这可能是因为你的cuda没安装正确导致的,一般cuda编译安装完成后,会提示让你在~/.bashrc(或/etc目录下的一个指定文件中)做一个环境变量设置:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-8.0/lib64


你按照他提示操作完后,source ~/.bashrc 或重启你的终端这个问题就解了。

(FIN)

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  AlexNet
相关文章推荐