感谢支持
我们一直在努力

Ubuntu 14.04配置cuda-convnet

在这个链接中(http://www.linuxidc.com/Linux/2014-10/107501.htm),我配置了cuda,有强大的GPU,自然不能暴殄天物,让资源白白空闲着,所以配置一下卷积神经网络跑一下程序喽。至于卷积神经网络的原理,容后再写。打算先写库的用法,再写原理,以行动带动对理论的追求。

话不多说,步入正题。

1. 预说明

关于cuda-convnet,起源于一篇经典论文①,论文中针对ILSVRC-2010的数据进行实验,然后公布了其实验使用的代码,链接为②。但是,事实往往跟论文是有差距的,链接②中的代码根本不能重现论文中的结果。在下不才,在使用这个链接的库很久之后才发现的,觉得很坑,希望后来者慎之。

之所以说它坑,首先,论文中提到特性中,multi-GPUdropout就没有实现,而且也没有给出论文中8层卷积神经网络的配置文件。总之不能直接拿来用,需要自己探索。

虽然如此,但有总比没有好,毕竟这个库实现的卷积神经网络封装的很好,论文中的大神的贡献非我等小菜所能企及的。给大神点32个赞。

本文只对cuda-convnetcuda-convnet2的配置进行说明,论文中的作者还公布了其他版本的库,尚未用到,故且按下不提。

 

Ubuntu 12.04 下 CUDA 编程 http://www.linuxidc.com/linux/2014-06/103056.htm

 

Ubuntu 12.04 安装 CUDA-5.5  http://www.linuxidc.com/Linux/2013-10/91101.htm

 

Ubuntu 11.10 上安装CUDA开发环境 http://www.linuxidc.com/Linux/2012-04/58913.htm

 

Fedora 15系统下配置CUDA环境 http://www.linuxidc.com/Linux/2011-12/49874.htm

 

Ubuntu 11.04 安装 NVIDIA CUDA 4.0 RC2 http://www.linuxidc.com/Linux/2011-10/46304.htm

 

Linux Mint 13/Ubuntu 12.04 配置CUDA 4.2 & OpenCV 2.4.2 方法 http://www.linuxidc.com/Linux/2013-10/91102.htm

 

CUDA入门教程 http://www.linuxidc.com/Linux/2014-07/104328.htm

 

2. Cuda-convnet配置
2.1. 源码下载

参考链接②,先将源码下载下来。

  1. svn checkout http://cuda-convnet.googlecode.com/svn/trunk/ cuda-convnet-read-only 
svn checkout http://cuda-convnet.googlecode.com/svn/trunk/ cuda-convnet-read-only

取出的版本是562

2.2. 安装必要的库

然后,安装必须的库,我使用的是ubuntu系统。所以命令为

  1. sudo apt-get install Python-dev python-numpy python-magic python-matplotlib libatlas-base-dev 
sudo apt-get install python-dev python-numpy python-magic python-matplotlib libatlas-base-dev

 当然,还要确认你安装了cuda,我安装的是cuda6.5,在/usr/local/目录下,如下所示:

  1. $ ls /usr/local 
  2. bin  cuda  cuda-6.5  etc  games  include  lib  man  sbin  share  src 
$ ls /usr/local
bin  cuda  cuda-6.5  etc  games  include  lib  man  sbin  share  src

2.3. 更改build.sh

进入到刚才下载的cuda-convnet-read-only目录,更改build.sh文件中的配置路径。如下所示:

  1. # CUDA toolkit installation directory. 
  2. export CUDA_INSTALL_PATH=/usr/local/cuda 
  3.    
  4. # CUDA SDK installation directory. 
  5. export CUDA_SDK_PATH=/usr/local/cuda-6.5/samples/common/inc 
  6.    
  7. # Python include directory. This should contain the file Python.h, among others. 
  8. export PYTHON_INCLUDE_PATH=/usr/include/python2.7 
  9.    
  10. # Numpy include directory. This should contain the file arrayobject.h, among others. 
  11. export NUMPY_INCLUDE_PATH=/usr/lib/python2.7/dist-packages/numpy/core/include/numpy 
  12.    
  13. # ATLAS library directory. This should contain the file libcblas.so, among others. 
  14. export ATLAS_LIB_PATH=/usr/lib/atlas-base 
  15.    
  16. make $* 
# CUDA toolkit installation directory.
export CUDA_INSTALL_PATH=/usr/local/cuda
 
# CUDA SDK installation directory.
export CUDA_SDK_PATH=/usr/local/cuda-6.5/samples/common/inc
 
# Python include directory. This should contain the file Python.h, among others.
export PYTHON_INCLUDE_PATH=/usr/include/python2.7
 
# Numpy include directory. This should contain the file arrayobject.h, among others.
export NUMPY_INCLUDE_PATH=/usr/lib/python2.7/dist-packages/numpy/core/include/numpy
 
# ATLAS library directory. This should contain the file libcblas.so, among others.
export ATLAS_LIB_PATH=/usr/lib/atlas-base
 
make $*

按照官网的教程,配置完build.sh后就可以进行编译了。但是会发生错误,还需要改如下几个地方才可以。

2.4. 头文件添加

直接编译会发生找不到cutil_inline.h头文件的错误。分析原因可能是原来有这个头文件,后来这个头文件的功能被实现到其他头文件中去了。

include子文件夹下田间cutil_inline.h文件,并输入内容。

  1. #include “helper_cuda.h” 
  2. #define cutilCheckMsg(a) getLastCudaError(a) 
  3. #define cutGetMaxGflopsDeviceId() gpuGetMaxGflopsDeviceId() 
  4. #define MIN(a,b) (a) < (b) ? (a) : (b) 
#include "helper_cuda.h"
#define cutilCheckMsg(a) getLastCudaError(a)
#define cutGetMaxGflopsDeviceId() gpuGetMaxGflopsDeviceId()
#define MIN(a,b) (a) < (b) ? (a) : (b)

2.5. MakeFile文件更改

MakeFile3行,原文如下:

  1. INCLUDES :=  -I$(PYTHON_INCLUDE_PATH) -I$(NUMPY_INCLUDE_PATH) -I./include -I./include/common -I./include/cudaconv2 -I./include/nvmatrix 
INCLUDES :=  -I$(PYTHON_INCLUDE_PATH) -I$(NUMPY_INCLUDE_PATH) -I./include -I./include/common -I./include/cudaconv2 -I./include/nvmatrix

添加cuda的路径后如下:

  1. INCLUDES :=  -I$(PYTHON_INCLUDE_PATH) -I$(NUMPY_INCLUDE_PATH) -I$(CUDA_SDK_PATH) -I./include -I./include/common -I./include/cudaconv2 -I./include/nvmatrix 
INCLUDES :=  -I$(PYTHON_INCLUDE_PATH) -I$(NUMPY_INCLUDE_PATH) -I$(CUDA_SDK_PATH) -I./include -I./include/common -I./include/cudaconv2 -I./include/nvmatrix

保存之。

2.6. 最后的库链接错误

做完上述改动后,可以编译了,但到最后会发生一个库链接的错误,不用管,直接将那个库注释掉。

common-gcc-cuda-4.0.mk文件的332行。直接用#号注释。

  1. # LIB += -lcutil_$(LIB_ARCH) $(LIBSUFFIX) -lshrutil_$(LIB_ARCH) $(LIBSUFFIX) 
# LIB += -lcutil_$(LIB_ARCH) $(LIBSUFFIX) -lshrutil_$(LIB_ARCH) $(LIBSUFFIX)

 至此,就可以完成cuda-convnet的编译了。

 

更多详情见请继续阅读下一页的精彩内容: http://www.linuxidc.com/Linux/2014-10/107500p2.htm

 

3. Cuda-convnet2配置

顾名思义,这是cuda-convnet2.0版本,支持多GPU运行。

3.1. 源码下载

git clone https://code.google.com/p/cuda-convnet2/

3.2. 必要的库

  1. sudo apt-get install Python-dev python-numpy python-scipy python-magic python-matplotlib libatlas-base-dev libjpeg-dev libopencv-dev 
sudo apt-get install python-dev python-numpy python-scipy python-magic python-matplotlib libatlas-base-dev libjpeg-dev libopencv-dev

 

3.3. 配置

我只能说,这个版本的比上个版本人性化多了,这个版本的build.sh直接如此。

  1. # CUDA toolkit installation directory. 
  2. export CUDA_INSTALL_PATH=/usr/local/cuda 
  3.    
  4. # Python include directory. This should contain the file Python.h, among others. 
  5. export PYTHON_INCLUDE_PATH=/usr/include/python2.7 
  6.    
  7. # Numpy include directory. This should contain the file arrayobject.h, among others. 
  8. export NUMPY_INCLUDE_PATH=/usr/lib/python2.7/dist-packages/numpy/core/include/numpy/ 
  9.    
  10. # ATLAS library directory. This should contain the file libcblas.so, among others. 
  11. export ATLAS_LIB_PATH=/usr/lib/atlas-base 
  12.    
  13. # You don’t have to change these: 
  14. export LD_LIBRARY_PATH=$CUDA_INSTALL_PATH/lib64:$LD_LIBRARY_PATH 
  15. export CUDA_SDK_PATH=$CUDA_INSTALL_PATH/samples 
  16. export PATH=$PATH:$CUDA_INSTALL_PATH/bin 
# CUDA toolkit installation directory.
export CUDA_INSTALL_PATH=/usr/local/cuda
 
# Python include directory. This should contain the file Python.h, among others.
export PYTHON_INCLUDE_PATH=/usr/include/python2.7
 
# Numpy include directory. This should contain the file arrayobject.h, among others.
export NUMPY_INCLUDE_PATH=/usr/lib/python2.7/dist-packages/numpy/core/include/numpy/
 
# ATLAS library directory. This should contain the file libcblas.so, among others.
export ATLAS_LIB_PATH=/usr/lib/atlas-base
 
# You don't have to change these:
export LD_LIBRARY_PATH=$CUDA_INSTALL_PATH/lib64:$LD_LIBRARY_PATH
export CUDA_SDK_PATH=$CUDA_INSTALL_PATH/samples
export PATH=$PATH:$CUDA_INSTALL_PATH/bin

如果是在Ubuntu下的话,这样就直接已经基本把路径都配置对了。

3.4. 链接错误

但是直接编译的话还是会遇到错误,如下所示:

  1. cd ./bin/ && g++  -O3   -DNUMPY_INTERFACE -shared -Wl,-no-undefined -o libutilpy.so src/matrix.o -L/usr/lib/atlas-base -latlas -lcblas -lpython2.7 
  2. /usr/bin/ld: cannot find -latlas 
  3. /usr/bin/ld: cannot find -lcblas 
  4. collect2: error: ld returned 1 exit status 
cd ./bin/ && g++  -O3   -DNUMPY_INTERFACE -shared -Wl,-no-undefined -o libutilpy.so src/matrix.o -L/usr/lib/atlas-base -latlas -lcblas -lpython2.7
/usr/bin/ld: cannot find -latlas
/usr/bin/ld: cannot find -lcblas
collect2: error: ld returned 1 exit status

主要是因为atlas库中没有libatlas.solibctlas.so。查看atlas的目录发现结构如此:

  1. :/usr/lib/atlas-base$ ls -l 
  2. 总用量 4292 
  3. drwxr-xr-x 2 root root    4096  9月 22 11:41 atlas 
  4. lrwxrwxrwx 1 root root      15  2月  4  2014 libatlas.so.3 -> libatlas.so.3.0 
  5. -rw-r–r– 1 root root 3746968  2月  4  2014 libatlas.so.3.0 
  6. lrwxrwxrwx 1 root root      15  2月  4  2014 libcblas.so.3 -> libcblas.so.3.0 
  7. -rw-r–r– 1 root root  135376  2月  4  2014 libcblas.so.3.0 
  8. lrwxrwxrwx 1 root root      17  2月  4  2014 libf77blas.so.3 -> libf77blas.so.3.0 
  9. -rw-r–r– 1 root root  131000  2月  4  2014 libf77blas.so.3.0 
  10. lrwxrwxrwx 1 root root      22  2月  4  2014 liblapack_atlas.so.3 -> liblapack_atlas.so.3.0 
  11. -rw-r–r– 1 root root  369472  2月  4  2014 liblapack_atlas.so.3.0 
:/usr/lib/atlas-base$ ls -l
总用量 4292
drwxr-xr-x 2 root root    4096  9月 22 11:41 atlas
lrwxrwxrwx 1 root root      15  2月  4  2014 libatlas.so.3 -> libatlas.so.3.0
-rw-r--r-- 1 root root 3746968  2月  4  2014 libatlas.so.3.0
lrwxrwxrwx 1 root root      15  2月  4  2014 libcblas.so.3 -> libcblas.so.3.0
-rw-r--r-- 1 root root  135376  2月  4  2014 libcblas.so.3.0
lrwxrwxrwx 1 root root      17  2月  4  2014 libf77blas.so.3 -> libf77blas.so.3.0
-rw-r--r-- 1 root root  131000  2月  4  2014 libf77blas.so.3.0
lrwxrwxrwx 1 root root      22  2月  4  2014 liblapack_atlas.so.3 -> liblapack_atlas.so.3.0
-rw-r--r-- 1 root root  369472  2月  4  2014 liblapack_atlas.so.3.0

添加两个软链接,执行命令:

  1. sudo ln -s libatlas.so.3.0 libatlas.so 
  2. sudo ln -s libcblas.so.3.0 libcblas.so
sudo ln -s libatlas.so.3.0 libatlas.so
sudo ln -s libcblas.so.3.0 libcblas.so

目录结构变为如此:

  1. /usr/lib/atlas-base$ ls -l 
  2. 总用量 4292 
  3. drwxr-xr-x 2 root root    4096  9月 22 11:41 atlas 
  4. lrwxrwxrwx 1 root root      15 10月  1 22:35 libatlas.so -> libatlas.so.3.0 
  5. lrwxrwxrwx 1 root root      15  2月  4  2014 libatlas.so.3 -> libatlas.so.3.0 
  6. -rw-r–r– 1 root root 3746968  2月  4  2014 libatlas.so.3.0 
  7. lrwxrwxrwx 1 root root      15 10月  1 22:36 libcblas.so -> libcblas.so.3.0 
  8. lrwxrwxrwx 1 root root      15  2月  4  2014 libcblas.so.3 -> libcblas.so.3.0 
  9. -rw-r–r– 1 root root  135376  2月  4  2014 libcblas.so.3.0 
  10. lrwxrwxrwx 1 root root      17  2月  4  2014 libf77blas.so.3 -> libf77blas.so.3.0 
  11. -rw-r–r– 1 root root  131000  2月  4  2014 libf77blas.so.3.0 
  12. lrwxrwxrwx 1 root root      22  2月  4  2014 liblapack_atlas.so.3 -> liblapack_atlas.so.3.0 
  13. -rw-r–r– 1 root root  369472  2月  4  2014 liblapack_atlas.so.3.0 
/usr/lib/atlas-base$ ls -l
总用量 4292
drwxr-xr-x 2 root root    4096  9月 22 11:41 atlas
lrwxrwxrwx 1 root root      15 10月  1 22:35 libatlas.so -> libatlas.so.3.0
lrwxrwxrwx 1 root root      15  2月  4  2014 libatlas.so.3 -> libatlas.so.3.0
-rw-r--r-- 1 root root 3746968  2月  4  2014 libatlas.so.3.0
lrwxrwxrwx 1 root root      15 10月  1 22:36 libcblas.so -> libcblas.so.3.0
lrwxrwxrwx 1 root root      15  2月  4  2014 libcblas.so.3 -> libcblas.so.3.0
-rw-r--r-- 1 root root  135376  2月  4  2014 libcblas.so.3.0
lrwxrwxrwx 1 root root      17  2月  4  2014 libf77blas.so.3 -> libf77blas.so.3.0
-rw-r--r-- 1 root root  131000  2月  4  2014 libf77blas.so.3.0
lrwxrwxrwx 1 root root      22  2月  4  2014 liblapack_atlas.so.3 -> liblapack_atlas.so.3.0
-rw-r--r-- 1 root root  369472  2月  4  2014 liblapack_atlas.so.3.0

 

然后就可以正常编译了。

参考文献

① ImageNet Classification with Deep Convolutional Neural Networks

② https://code.google.com/p/cuda-convnet

③ https://code.google.com/p/cuda-convnet2

更多Ubuntu相关信息见Ubuntu 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=2

本文永久更新链接地址:http://www.linuxidc.com/Linux/2014-10/107500.htm 

赞(0) 打赏
转载请注明出处:服务器评测 » Ubuntu 14.04配置cuda-convnet
分享到: 更多 (0)

听说打赏我的人,都进福布斯排行榜啦!

支付宝扫一扫打赏

微信扫一扫打赏