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?
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.