web-dev-qa-db-fra.com

Nvidia CUDA + Theano: Impossible de trouver le symbole "cuDevicePrimaryCtxGetState"

Je travaille sur une Ubuntu 16.04 et j'ai une carte graphique un peu ancienne Nvidia 9600 GT. Il est compatible CUDA (capacité de calcul 1.1) bien que traditionnel. J'essaie d'en tirer parti en utilisant Keras et pour ce faire, j'ai suivi ce guide pour installer CUDA et celui-ci pour installer CUDNN. Le pilote de ma carte graphique est la version 304.104 et la dernière version de CUDA prenant en charge ma carte graphique est la version 6.5. Après l'installation, je l'ai vérifié en tapant dans la console:

$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2014 NVIDIA Corporation
Built on Thu_Jul_17_21:41:27_CDT_2014
Cuda compilation tools, release 6.5, V6.5.12

$ nvidia-smi
Fri Dec 22 23:02:08 2017       
+------------------------------------------------------+                       
| NVIDIA-SMI 340.104    Driver Version: 340.104        |                       
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce 9600 GT     Off  | 0000:01:00.0     N/A |                  N/A |
| 40%   46C    P0    N/A /  N/A |     77MiB /  1023MiB |     N/A      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Compute processes:                                               GPU Memory |
|  GPU       PID  Process name                                     Usage      |
|=============================================================================|
|    0            Not Supported                                               |
+-----------------------------------------------------------------------------+

Également la compilation de l'exemple deviceQuery réussi:

CUDA Device Query (Runtime API) version (CUDART static linking)

Detected 1 CUDA Capable device(s)

Device 0: "GeForce 9600 GT"
  CUDA Driver Version / Runtime Version          6.5 / 6.5
  CUDA Capability Major/Minor version number:    1.1
  Total amount of global memory:                 1024 MBytes (1073414144 bytes)
  ( 8) Multiprocessors, (  8) CUDA Cores/MP:     64 CUDA Cores
  GPU Clock rate:                                1625 MHz (1.62 GHz)
  Memory Clock rate:                             400 Mhz
  Memory Bus Width:                              256-bit
  Maximum Texture Dimension Size (x,y,z)         1D=(8192), 2D=(65536, 32768), 3D=(2048, 2048, 2048)
  Maximum Layered 1D Texture Size, (num) layers  1D=(8192), 512 layers
  Maximum Layered 2D Texture Size, (num) layers  2D=(8192, 8192), 512 layers
  Total amount of constant memory:               65536 bytes
  Total amount of shared memory per block:       16384 bytes
  Total number of registers available per block: 8192
  Warp size:                                     32
  Maximum number of threads per multiprocessor:  768
  Maximum number of threads per block:           512
  Max dimension size of a thread block (x,y,z): (512, 512, 64)
  Max dimension size of a grid size    (x,y,z): (65535, 65535, 1)
  Maximum memory pitch:                          2147483647 bytes
  Texture alignment:                             256 bytes
  Concurrent copy and kernel execution:          Yes with 1 copy engine(s)
  Run time limit on kernels:                     Yes
  Integrated GPU sharing Host Memory:            No
  Support Host page-locked memory mapping:       Yes
  Alignment requirement for Surfaces:            Yes
  Device has ECC support:                        Disabled
  Device supports Unified Addressing (UVA):      No                                                                                                    
  Device PCI Bus ID / PCI location ID:           1 / 0                                                                                                 
  Compute Mode:                                                                                                                                        
     < Default (multiple Host threads can use ::cudaSetDevice() with device simultaneously) >                                                          

deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 6.5, CUDA Runtime Version = 6.5, NumDevs = 1, Device0 = GeForce 9600 GT                       
Result = PASS

Ensuite, j'ai suivi cette méthode d'installation recommandée et cette documentation pour installer Theano car il est capable de fonctionner sur ma carte graphique par rapport à TensorFlow. J'ai créé le fichier .theanorc

[global]
device = cuda0
floatX = float32

[cuda]
root=/usr/local/cuda-6.5/bin/

[dnn]
include_path = /usr/local/cuda-6.5/include/
library_path = /usr/local/cuda-6.5/lib64/

J'ai aussi exporté les variables appropriées vers .profile:

export PATH=/usr/local/cuda-6.5/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-6.5/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

Cependant, lorsque j'essaie d'exécuter ce script de test simple:

from theano import function, config, shared, tensor
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([], tensor.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 %f seconds" % (iters, t1 - t0))
print("Result is %s" % (r,))
if numpy.any([isinstance(x.op, tensor.Elemwise) and
              ('Gpu' not in type(x.op).__name__)
              for x in f.maker.fgraph.toposort()]):
    print('Used the cpu')
else:
    print('Used the gpu')

Je reçois l'erreur suivante:

ERROR (theano.gpuarray): Could not initialize pygpu, support disabled
Traceback (most recent call last):
  File "/home/kuba/anaconda3/lib/python3.6/site-packages/theano/gpuarray/__init__.py", line 227, in <module>
    use(config.device)
  File "/home/kuba/anaconda3/lib/python3.6/site-packages/theano/gpuarray/__init__.py", line 214, in use
    init_dev(device, preallocate=preallocate)
  File "/home/kuba/anaconda3/lib/python3.6/site-packages/theano/gpuarray/__init__.py", line 99, in init_dev
    **args)
  File "pygpu/gpuarray.pyx", line 651, in pygpu.gpuarray.init
  File "pygpu/gpuarray.pyx", line 587, in pygpu.gpuarray.pygpu_init
pygpu.gpuarray.GpuArrayException: b'Could not find symbol "cuDevicePrimaryCtxGetState": /usr/lib/libcuda.so.1: undefined symbol: cuDevicePrimaryCtxGetState'

Je ne comprends pas cette erreur car dans la documentation de Nvidia, cette fonction existe de manière cruelle. Est-ce que quelqu'un a un indice? Le problème est-il que j'utilise python 3.6 alors que, dans la documentation susmentionnée, il y a le signe < avant 3.6? Est-ce qu'il y a des chemins qui ne vont pas?

6
Colonder

De manière générale, tous ces composants requièrent au minimum CUDA 7 et 3 ou plus récente, ce qui nécessite à son tour une capacité de calcul GPU au moins égale à 2,0.

3
Colonder