如何在Ubuntu 14.04 x64上安装Theano,并将其配置为使用GPU?

如何在Ubuntu 14.04 x64上安装Theano,并将其配置为使用GPU?,ubuntu,theano,Ubuntu,Theano,我尝试按照上的说明进行操作,但无效:每当我使用GPU运行Theano脚本时,它都会向我显示错误消息: 已安装CUDA,但设备gpu不可用(错误:无法获取可用gpu的数量:未检测到支持CUDA的设备) 更具体地说,按照链接网页中的说明,我执行了以下步骤: # Install Theano sudo apt-get install python-numpy python-scipy python-dev python-pip python-nose g++ libopenblas-dev git

我尝试按照上的说明进行操作,但无效:每当我使用GPU运行Theano脚本时,它都会向我显示错误消息:

已安装CUDA,但设备gpu不可用(错误:无法获取可用gpu的数量:未检测到支持CUDA的设备)


更具体地说,按照链接网页中的说明,我执行了以下步骤:

# Install Theano
sudo apt-get install python-numpy python-scipy python-dev python-pip python-nose g++ libopenblas-dev git
sudo pip install Theano

# Install Nvidia drivers and CUDA
sudo apt-get install nvidia-current
sudo apt-get install nvidia-cuda-toolkit
然后我重新启动并尝试运行:

THEANO_FLAGS=mode=FAST_RUN,device=gpu,floatX=float32 python gpu_test.py # gpu_test.py comes from http://deeplearning.net/software/theano/tutorial/using_gpu.html
但我得到:

f@f-Aurora-R4:~$ THEANO_FLAGS=’mode=FAST_RUN,device=gpu,floatX=float32,cuda.root=/usr/lib/nvidia-cuda-toolkit’ python gpu_test.py WARNING (theano.sandbox.cuda): CUDA is installed, but device gpu is not available (error: Unable to get the number of gpus available: no CUDA-capable device is detected) [Elemwise{exp,no_inplace}(<TensorType(float32, vector)>)] Looping 1000 times took 2.199992 seconds Result is [ 1.23178029 1.61879337 1.52278066 ..., 2.20771813 2.29967761 1.62323284] Used the cpu
f@f-Aurora-R4:~$THEANO_FLAGS='mode=FAST_RUN,device=gpu,floatX=float32,cuda.root=/usr/lib/nvidia cuda toolkit'python gpu_test.py WARNING(THEANO.sandbox.cuda):cuda已安装,但设备gpu不可用(错误:无法获取可用的gpu数量:未检测到支持cuda的设备)[Elemwise{exp,no_inplace}()]循环1000次耗时2.199992秒结果是[1.23178029 1.61879337 1.52278066…,2.20771813 2.29967761 1.62323284]使用了cpu
(我在Ubuntu 14.04.4 LTS x64和Kubuntu 14.04.4 LTS x64上测试了以下内容,我想它应该适用于大多数Ubuntu变体)

安装Theano和配置GPU(CUDA) 官方网站上的说明已经过时了。相反,您可以使用以下说明(假设新安装的Kubuntu 14.04 LTS x64):

此时,运行
nvidia smi
应该可以工作,但运行
nvcc
不会工作

# Execute in console, or (add in ~/.bash_profile then run "source ~/.bash_profile"):
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\u test.py
中复制粘贴以下内容:

# Start gpu_test.py
# From http://deeplearning.net/software/theano/tutorial/using_gpu.html#using-gpu
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 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')
# End gpu_test.py
然后运行它:

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
例如:

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
THEANO_FLAGS='mode=FAST_RUN,device=gpu,floatX=float32,optimizer_including=cudnn' python gpu_test.py

添加cuDNN 要添加cuDNN(来自的说明):

  • 从下载cuDNN(需要注册,免费)
  • tar-xvf cudnn-7.0-linux-x64-v3.0-prod.tgz
  • 执行以下操作之一
  • 选项1:将
    *.h
    文件复制到
    CUDA_ROOT/include
    ,将
    *.so*
    文件复制到
    CUDA_ROOT/lib64
    (默认情况下,
    CUDA_ROOT
    在Linux上是
    /usr/local/CUDA

    备选案文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 ops。因此,如果用户没有手动引入,Theano仍然有效

    若要在Theano无法使用cuDNN时获取错误,请使用此Theano标志:
    optimizer\u include=cuDNN

    例如:

    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
    
    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 是一个“帮助深度学习框架管理CUDA内存的简单库”

    要与ano一起使用,您需要添加
    lib.cnmem
    标志。例如:

    THEANO_FLAGS='mode=FAST_RUN,device=gpu,floatX=float32,lib.cnmem=0.8,optimizer_including=cudnn' python gpu_test.py
    
    OMP_NUM_THREADS=4 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
    意味着它最多可以使用80%的GPU

    据报道,CNMeM提供了一些有趣的速度改进,并得到了Theano、Torch和Caffee的支持

    :

    速度取决于许多因素,如形状和模型本身。速度从0提高到2倍

    :

    如果您不更改Theano标志allow_gc,您可以期望GPU上的速度提高20%。在某些情况下(小型机型),我们看到速度提高了50%


    在多个CPU核上运行Theano 作为补充说明,您可以使用在多个CPU核上运行Theano。例如:

    THEANO_FLAGS='mode=FAST_RUN,device=gpu,floatX=float32,lib.cnmem=0.8,optimizer_including=cudnn' python gpu_test.py
    
    OMP_NUM_THREADS=4 python gpu_test.py 
    
    该脚本输出有关使用哪个BLAS的信息:

    cd [theano_git_directory]
    OMP_NUM_THREADS=4 python theano/misc/check_blas.py
    

    要运行Theano的测试套件,请执行以下操作:

    nosetests theano
    

    共同问题:


    @talonmies感谢您的编辑,但为什么要投反对票呢?@talonmies我想是巧合吧。糟糕的是,下议院的选民通常不发表评论,我很高兴知道我是否做了一些明显不正确的事情。我猜投票结束下议院的人也投了票。这是其中一个问题与编程无关的情况。但它可能不适合其他更好的地方(例如ServerFault),所以我认为您不可能/不应该做任何不同的事情。@DanielRenshaw配置库也在这个主题上。但少数选民/关系密切者有时会忘记这一点。
    sudo pip install nose-parameterized
    import theano
    theano.test()