安装Theano并配置GPU(CUDA)
官网上的指导已经过时。您可以使用以下步骤进行安装(假设您正在使用新安装的Kubuntu 14.04 LTS x64):
(我在Ubuntu 14.04.4 LTS x64和Kubuntu 14.04.4 LTS x64上测试了以下步骤,我猜应该适用于大多数Ubuntu变种)。
sudo apt-get install python-numpy python-scipy python-dev python-pip python-nose g++ libopenblas-dev git
sudo pip install Theano
wget http://developer.download.nvidia.com/compute/cuda/7.5/Prod/local_installers/cuda-repo-ubuntu1404-7-5-local_7.5-18_amd64.deb
sudo dpkg -i cuda-repo-ubuntu1404-7-5-local_7.5-18_amd64.deb
sudo apt-get update
sudo apt-get install cuda
sudo reboot
在这时候,运行 nvidia-smi
命令应该是可以正常工作的,但是运行 nvcc
命令则不能正常工作。
export PATH=/usr/local/cuda-7.5/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-7.5/lib64:$LD_LIBRARY_PATH
在此时,nvidia-smi
和 nvcc
命令都应该可以使用。
测试 Theano 是否能够使用 GPU:
将以下内容复制粘贴进 gpu_test.py
文件中:
from theano import function, config, shared, sandbox
import theano.tensor as T
import numpy
import time
vlen = 10 * 30 * 768
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 xrange(iters):
r = f()
t1 = time.time()
print("Looping %d times took %f seconds" % (iters, t1 - t0))
print("Result is %s" % (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')
并运行它:
THEANO_FLAGS='mode=FAST_RUN,device=gpu,floatX=float32' python gpu_test.py
这应该返回:
f@f-Aurora-R4:~$ THEANO_FLAGS='mode=FAST_RUN,device=gpu,floatX=float32' python gpu_test.py
Using gpu device 0: GeForce GTX 690
[GpuElemwise{exp,no_inplace}(<CudaNdarrayType(float32, vector)>), HostFromGpu(GpuElemwise{exp,no_inplace}.0)]
Looping 1000 times took 0.658292 seconds
Result is [ 1.23178029 1.61879349 1.52278066 ..., 2.20771813 2.29967761
1.62323296]
Used the gpu
了解您的CUDA版本:
nvcc -V
例子:
username@server:~$ 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
添加cuDNN
添加cuDNN(来自http://deeplearning.net/software/theano/library/sandbox/cuda/dnn.html):
- 从https://developer.nvidia.com/rdp/cudnn-download下载cuDNN(需要注册,免费)
tar -xvf cudnn-7.0-linux-x64-v3.0-prod.tgz
- 执行以下操作之一
选项1: 将*.h
文件复制到CUDA_ROOT/include
,将*.so*
文件复制到CUDA_ROOT/lib64
(默认情况下,在Linux上,CUDA_ROOT
是/usr/local/cuda
)。
sudo cp cuda/lib64/* /usr/local/cuda/lib64/
sudo cp cuda/include/cudnn.h /usr/local/cuda/include/
选项2:
export LD_LIBRARY_PATH=/home/user/path_to_CUDNN_folder/lib64:$LD_LIBRARY_PATH
export CPATH=/home/user/path_to_CUDNN_folder/include:$CPATH
export LIBRARY_PATH=/home/user/path_to_CUDNN_folder/lib64:$LD_LIBRARY_PATH
默认情况下,Theano将检测是否可以使用cuDNN,如果可以,它将使用它。如果不能,则Theano优化将不会引入cuDNN操作。因此,如果用户没有手动引入它们,Theano仍然可以正常工作。
要在Theano无法使用cuDNN时获取错误,请使用以下Theano标志:optimizer_including=cudnn
。
示例:
THEANO_FLAGS='mode=FAST_RUN,device=gpu,floatX=float32,optimizer_including=cudnn' python gpu_test.py
了解您的cuDNN版本:
cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2
添加 CNMeM
CNMeM 库 是一个 "简单的库,帮助深度学习框架管理 CUDA 内存。"
# Build CNMeM without the unit tests
git clone https://github.com/NVIDIA/cnmem.git cnmem
cd cnmem
mkdir build
cd build
sudo apt-get install -y cmake
cmake ..
make
# Copy files to proper location
sudo cp ../include/cnmem.h /usr/local/cuda/include
sudo cp *.so /usr/local/cuda/lib64/
cd ../..
要与Theano一起使用,您需要添加lib.cnmem
标志。例如:
THEANO_FLAGS='mode=FAST_RUN,device=gpu,floatX=float32,lib.cnmem=0.8,optimizer_including=cudnn' python gpu_test.py
脚本的第一个输出应该是:
Using gpu device 0: GeForce GTX TITAN X (CNMeM is enabled with initial size: 80.0% of memory, cuDNN 5005)
lib.cnmem=0.8
表示可以使用GPU的80%。
CNMeM已被报道为能够提供一些有趣的速度改进,并且得到了Theano、Torch和Caffee的支持。
Theano - source 1:
加速取决于许多因素,如形状和模型本身。速度提升范围从0到2倍。
Theano - source 2:
如果您不更改Theano标志allow_gc,则可以在GPU上期望20%的速度提升。在某些情况下(小模型),我们看到了50%的速度提升。
在多个CPU核上运行Theano
顺便说一下,您可以使用OMP_NUM_THREADS=[number_of_cpu_cores]
标志在多个CPU核上运行Theano。例如:
OMP_NUM_THREADS=4 python gpu_test.py
脚本theano/misc/check_blas.py
输出有关所使用的BLAS的信息:
cd [theano_git_directory]
OMP_NUM_THREADS=4 python theano/misc/check_blas.py
运行Theano的测试套件:
nosetests theano
或者
sudo pip install nose-parameterized
import theano
theano.test()
常见问题: