备注:之前服务器上已经安装caffe,后安装Theano,所有有些步骤简略。
安装caffe详情见
Caffe + Ubuntu 15.04 + CUDA 7.5 在服务器上安装配置及卸载重新安装(已测试可执行)
安装所需的安装包见
链接: http://pan.baidu.com/s/1jIRJ6mU
提取密码:xehi
Theano官方网站:
http://deeplearning.net/software/theano/#
BLAS(Basic Linear Algebra Subprograms)是基础线性代数子程序库,里面拥有大量已经编写好的关于线性代数运算的程序;
LAPACK (Linear Algebra PACKage)包含了求解科学与工程计算中最常见的数值线性代数问题,如求解线性方程组、线性最小二乘问题、特征值问题和奇异值问题等;
ATLAS是python下的一个线性代数库,是基于另外两个线性代数库BLAS和lapack的;
NumPy提供了一个在python中做科学计算的基础库,它重在数值计算,甚至可以说是用于多维数组处理的库;
SciPy是基于numpy,提供了一个在python中做科学计算的工具集,也就是说它是更上一个层次的库;
Theano则是基于NumPy以及SciPy的一个更高级的用于科学计算的库。
要安装Theano,就需要先安装好numpy和scipy;
要安装numpy和scipy,就需要ATLAS;
要安装ATLAS,就需要安装BLAS和LAPACK;
相关库的安装顺序
安装顺序:BLAS → LAPACK → ATLAS → numpy → scipy → Theano
第1步:安装cuda,若已经安装可进入第2步
sudo dpkg -i cuda-repo-ubuntu1504-7-5-local_7.5-18_amd64.deb
sudo apt-get update
sudo apt-get install -y cuda
但此时查询cuda会出现问题
nvcc -V
问题是
The program 'nvcc' is currently not installed. You can install it by typing:
sudo apt-get install nvidia-cuda-toolkit
但是我们已经安装了cuda,在 /usr/local 能够看到文件夹 cuda-7.5。 这需要如下设置
执行sudo gedit ~/.bashrc,在最后面,64位的话粘贴以下内容:
export PATH=/usr/local/cuda-7.5/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-7.5/lib64:$LD_LIBRARY_PATH
接着执行 source ~/.bashrc 使其立即生效
下面查询
nvcc -V
可见如下结果
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2015 NVIDIA Corporation
Built on Tue_Aug_11_14:27:32_CDT_2015
Cuda compilation tools, release 7.5, V7.5.17
第2步:配置cuda
执行
nvidia-settings
会弹出显卡配置的界面,至少7个大项,其中有一项叫GPU-0(Quadro K5200)和GPU-1(Tesla K40c),如果能看到自己的显卡的话,应该就算安装成功了。下面进行配置。
使用自带的samples进行GPU运算测试。进入到cuda-7.5的samples目录,一般都是cd /usr/local/cuda-7.5/samples,然后会有一个Makefile文件,执行命令
sudo make
不出意外地话,会出现带有红颜色的error错误,大概是这样的:unsupported GNU version! gcc versions later than 4.9 are not supported! 意思也很明显了,就是gcc的版本高于4.9,Cuda不支持。
解释一下:ubuntu15.04自带的gcc是4.9.2,可以通过
gcc --version
查看,但是cuda不支持超过4.9.2的gcc编译器。要么安装一个低版本的编译器,要么把cuda的这个限制给去掉。
方法1:降级安装gcc/g++版本为4.7.x
(a). 下载gcc/g++ 4.7.x
sudo apt-get install -y gcc-4.7
sudo apt-get install -y g++-4.7
(b). 链接gcc/g++实现降级
cd /usr/bin
sudo rm gcc
sudo ln -s gcc-4.7 gcc
sudo rm g++
sudo ln -s g++-4.7 g++
方法2 去掉 cuda的限制
sudo cd /usr/local/cuda/include/ #进入到头文件目录cuda(而不是cuda-7.5);
sudo cp host_config.h host_config.h.bak #备份原头文件;
sudo gedit host_config.h #编辑头文件;
ctrl+F查找4.9出现的地方,大约位于115行,在第113行处应该显示if GNUC>4 || (GNUC == 4 && GNUC_MINOR > 9),因为我们的是4.9.2,因此,把上面的2个4都改成5就ok了,保存退出。
备注:Matlab 2014a(2015a)的版本是4.7.x所以在使用matla调用mex文件的时候,基本上都会报错。综上所述,建议使用方法1来修改。
接着进行编译
cd /usr/local/cuda-7.5/samples
sudo make
这个过程会比较长,让他在哪编译一会,剩下的时间可以用来安装Theano。
第3步: 安装 Theano
更新源
sudo apt-get update
安装依赖包
sudo apt-get install python-numpy python-scipy python-dev python-pip python-nose g++ libopenblas-dev git
安装scipy依赖包
scipy的安装需要依赖于numpy、lapack、atlas(后两者都是线性代数工具包),而numpy和sci的测试程序的运行又依赖于nose,因此,整个安装过程必须要按顺序执行的,否则是无法执行下去的。
1、先安装nose包
sudo apt-get install python-nose
2、接下来安装各种包
# 安装gfortran,后面编译过程中会用到
sudo apt-get install gfortran
# 安装blas,Ubuntu下对应的是libopenblas,其它操作系统可能需要安装其它版本的blas——这是个OS相关的。
sudo apt-get install libopenblas-dev
# 安装lapack,Ubuntu下对应的是liblapack-dev,和OS相关。
sudo apt-get install liblapack-dev
# 安装atlas,Ubuntu下对应的是libatlas-base-dev,和OS相关。
sudo apt-get install libatlas-base-dev
sudo apt-get install python-numpy # python2.7
sudo apt-get install python3-numpy # python3.5
sudo apt-get install python-scipy # python2.7
sudo apt-get install python3-scipy # python3.5
安装Theano
sudo pip install Theano
测试numpy是否启用了blas加速,进入python
在命令行输入
python
>>>import numpy
>>>id(numpy.dot) == id(numpy.core.multiarray.dot)
>>>False
输出False表示加速成功,如果输出True,参考官方教程修改,理论上很少加速失败。失败请查看高性能Numpy/Scipy加速:使用Intel MKL和Intel Compilers或OpenBLAS(待续)
第4步: 编辑Theano配置文件
sudo gedit ~/.theanorc
写入以下下内容:
[global]
openmp=False
floatX=float32
device=gpu
allow_input-downcast=True
[blas]
ldflags=
[nvcc]
flags=-D_FORCE_INLINES
[lib]
cnmem = 1
第5步:命令端其他测试
NumPy (~40s)
python -c "import numpy;numpy.test()"
SciPy (~2m)
python -c "import scipy;scipy.test()"
Theano (~30m)
python -c "import theano;theano.test()"
在Theano测试时可能会有问题
Using gpu device 0: Tesla K40c (CNMeM is disabled, cuDNN Version is too old. Update to v5, was 4004.)
所以这需要升级为cuDNN v5。
出现了no module named nose-parameterized问题
pip install nose-parameterized
第6步:测试经典的GPU测试代码保存至test.py
sudo gedit test.py
写入以下内容
from theano import function, config, shared, sandbox
import theano.tensor as T
import numpy
import time
vlen = 10 * 30 * 768 # 10 x #cores x # threads per core
iters = 1000
rng = numpy.random.RandomState(22)
x = shared(numpy.asarray(rng.rand(vlen), config.floatX))
f = function([], T.exp(x))
print (f.maker.fgraph.toposort())
t0 = time.time()
for i in range(iters):
r = f()
t1 = time.time()
print ('Looping %d times took' % iters, t1 - t0, 'seconds')
print ('Result is', r)
if numpy.any([isinstance(x.op, T.Elemwise) for x in f.maker.fgraph.toposort()]):
print ('Used the cpu')
else:
print ('Used the gpu')
结果显示如下
Using gpu device 0: Tesla K40c (CNMeM is disabled, cuDNN 5103)
/home/bids/.local/lib/python2.7/site-packages/theano/sandbox/cuda/__init__.py:600: UserWarning: Your cuDNN version is more recent than the one Theano officially supports. If you see any problems, try updating Theano or downgrading cuDNN to version 5.
warnings.warn(warn)
[GpuElemwise{exp,no_inplace}(), HostFromGpu(GpuElemwise{exp,no_inplace}.0)]
-------------------------------------------------------
Looping 1000 times took 0.630527973175 seconds
---------------------------------------------------------
Result is [ 1.23178029 1.61879349 1.52278066 ..., 2.20771813 2.29967761
1.62323296]
Used the gpu
如果想用cpu测试的话,就sudo gedit ~/.theanorc,将其中的gpu修改为cpu就可以了。
结果显示如下
[Elemwise{exp,no_inplace}()]
-----------------------------------------------------------
Looping 1000 times took 3.24689912796 seconds
-----------------------------------------------------------
Result is [ 1.23178029 1.61879337 1.52278066 ..., 2.20771813 2.29967761
1.62323284]
Used the cpu
结果显示 GPU加速效果明显
Using gpu device 0: Tesla K40c (CNMeM is disabled, cuDNN 5103)
解决方法
cnmem package: https://github.com/NVIDIA/cnmem
cd $HOME
% git clone https://github.com/NVIDIA/cnmem.git cnmem
% cd cnmem
% mkdir build
% cd build
% cmake ..
% make
link with cnmem
The source folder contains a header file include/cnmem.h and the build directory contains the library libcnmem.so, put them into your cuda path: /usr/local/cuda/include,/usr/local/cuda/lib64
sudo cnmem
sudo cp -rf ./include/cnmem.h /usr/local/cuda/include
sudo cp -rf ./build/libcnmem.so /usr/local/cuda/lib64
sudo gedit ~/.theanorc
[global]
openmp=False
floatX=float32
device=cpu
allow_input-downcast=True
[blas]
ldflags=
[nvcc]
flags=-D_FORCE_INLINES
[lib]
cnmem = 1
测试
python test.py
Using gpu device 0: Tesla K40c (CNMeM is enabled with initial size: 95.0% of memory, cuDNN 5110)
参考主页:
Ubuntu15.10_64位安装Theano+cuda7.5详细笔记
Ubuntu-安装-theano+caffe-超详细教程
Caffe + Ubuntu 15.04 + CUDA 7.5 在服务器上安装配置及卸载重新安装(已测试可执行)
Ubuntu14.04安装Theano详细教程
Theano: CNMeM is disabled, CuDNN not available
Windows10 64Bit完美配置Theano并实现GPU加速并解决((CNMeM is disable,CuDNN not available))