Instalación del CUDA Toolkit

Se asume que el controlador que manipula la tarjeta GPU está activo, por lo que el proceso de instalación de CUDA Toolkit para el desarrollo de aplicaciones Python con uso de GPU está solventado para iniciar:

Instalación de CUDA Toolkit

El primer objetivo a lograr es adquirir el CUDA ToolKit desde el sitio del desarrollador (https://developer.nvidia.com/cuda-toolkit).

Nota: Para esta documentación la implementación se realizó en una máquina Linux usando a Centos 7 como distro, utilizando los repositorios oficiales de Nvidia para dicho caso, rpm network

Instalación de dependencias

Esto para el caso de querer instalar el toolkit de modo manual:

Centos

En Centos la instalación de dependencias siempre es confiable realizarlas a través de su gestor de paquetes YUM y desde los repositorios oficiales

yum install kernel-devel gcc-c++ freeglut freeglut-devel libX11-devel  mesa-libGLU-devel libXmu-devel libXi-devel gcc* compat-gcc*  compat-glibc* compat-lib*

O

yum groupinstall ‘Development Tools’ ‘Development Libraries’

CUDA Toolkit

Centos

Es necesario agregar el repositorio, para el caso se debe descargar el paquete RPM desde la página del desarrollador que corresponde a network, para este ejercicio se ha bajado el fichero cuda-repo-rhel7-9.0.176-1.x86_64.rpm y se instala del siguiente modo con privilegios de superusuario y se actualiza la lista de cache de YUM:

rpm -i cuda-repo-rhel7-9.0.176-1.x86_64.rpm
yum clean
yum make cache

Descargar cuda-repo-rhel7-9.0.176-1.x86_64.rpm

Como es el caso de instalación vía repositorio (YUM), se utiliza la siguiente instrucción para instalar:

yum install cuda-7-5.x86_64

Instalar NUMBA

En un entorno virtual de python que puede ser creado del siguiente modo:

virtualenv --python=/usr/bin/python3 <folder>

source <folder>/bin/activate

estableceremos nuestro ambiente de desarrollo.

Una vez creado el entorno virtual se procede a instalar los siguientes paquetes catalogados como esenciales utilizando pip (pip install <paquetes>):

Cython
llvmlite
numba
numpy
pyculib
scipy

Pyculib - Pyculib_sorting

Una dependencia necesaria para ejecutar las GPU-accelerated libraries es Pyculib, puesto que entrega los bindings necesarios para las librerías de CUDA tales como:

Para instalar esto es extremadamente necesario la librería de pyculib_sorting, y para ello se requiere hacer lo siguiente:

git clone https://github.com/numba/pyculib_sorting.git

cd pyculib_sorting

git submodule update --init

python build_sorting_libs.py

pytest

mv lib/* $YOUR_PYTHONPATH/lib

Hay que considerar que al ser bindings de las librerías nativas, las rutas o variables de entorno estén correctamente visibles para que el sistema sepa donde están a las librerías de CUDA (generalmente /usr/local/cuda-<version>/lib/) y se proceda con la construcción (python build_sorting_libs.py).

Para hacer una prueba rápida de que esto funciona de buena manera, podemos probar con la siguiente y simple linea de import:

$ python

>>> from pyculib import rand as curand
>>>

No arrojando ningún mensaje es motivo de que todo está bien.

Agregar variables de entorno

Se hace necesario agregar unas variables de entorno para referenciar algunos complementos de CUDA y Python sepa donde localizar estas librerías necesarias

# CUDA Toolkit
export CUDA_HOME=/usr/local/cuda-<version>
export LD_LIBRARY_PATH=${CUDA_HOME}/lib64:$LD_LIBRARY_PATH
export PATH=${CUDA_HOME}/bin:${PATH}
export NUMBAPRO_NVVM=${CUDA_HOME}/nvvm/lib64/libnvvm.so
export NUMBAPRO_LIBDEVICE=${CUDA_HOME}/nvvm/libdevice/
export NUMBAPRO_CUDALIB=${CUDA_HOME}/lib64

Una opción es que sean agregadas directamente en $HOME/.bashrc.

Para poder chequear que todo está correcto, se puede utilizar el comando numba -s o numba --system-info, obteniendo una salida como la siguiente:

$ numba -s
System info:
--------------------------------------------------------------------------------
__Time Stamp__
2017-10-18 13:21:45.954662
__Hardware Information__
Machine               : x86_64
CPU Name              : broadwell
CPU Features          :
adx aes avx avx2 bmi bmi2 cmov cx16 f16c fma fsgsbase hle invpcid lzcnt mmx
movbe pclmul popcnt prfchw rdrnd rdseed rtm smap sse sse2 sse3 sse4.1 sse4.2
ssse3 xsave xsaveopt
__OS Information__
Platform              : Linux-3.10.0-693.2.2.el7.x86_64-x86_64-with-centos-7.4.1708-Core
Release               : 3.10.0-693.2.2.el7.x86_64
System Name           : Linux
Version               : #1 SMP Tue Sep 12 22:26:13 UTC 2017
OS specific info      : CentOS Linux7.4.1708Core
glibc info            : glibc 2.2.5
__Python Information__
Python Compiler       : GCC 4.8.5 20150623 (Red Hat 4.8.5-11)
Python Implementation : CPython
Python Version        : 3.6.3
Python Locale         : en_US UTF-8
__LLVM information__
LLVM version          : 4.0.0
__CUDA Information__
Found 4 CUDA devices
id 0    b'GeForce GTX 1080 Ti'                              [SUPPORTED]
                      compute capability: 6.1
                           pci device id: 0
                              pci bus id: 2
id 1    b'GeForce GTX 1080 Ti'                              [SUPPORTED]
                      compute capability: 6.1
                           pci device id: 0
                              pci bus id: 3
id 2    b'GeForce GTX 1080 Ti'                              [SUPPORTED]
                      compute capability: 6.1
                           pci device id: 0
                              pci bus id: 129
id 3    b'GeForce GTX 1080 Ti'                              [SUPPORTED]
                      compute capability: 6.1
                           pci device id: 0
                              pci bus id: 130
Summary:
    4/4 devices are supported
CUDA driver version   : 8000
CUDA libraries:
Finding cublas
    named  libcublas.so.7.5.18
    trying to open library...    ok
Finding cusparse
    named  libcusparse.so.7.5.18
    trying to open library...    ok
Finding cufft
    named  libcufft.so.7.5.18
    trying to open library...    ok
Finding curand
    named  libcurand.so.7.5.18
    trying to open library...    ok
Finding nvvm
    named  libnvvm.so
    trying to open library...    ok
    finding libdevice for compute_20...    ok
    finding libdevice for compute_30...    ok
    finding libdevice for compute_35...    ok
    finding libdevice for compute_50...    ok
__Conda Information__
Conda not present/not working.
Error was [Errno 2] No such file or directory: 'conda': 'conda'
--------------------------------------------------------------------------------
If requested, please copy and paste the information between
the dashed (----) lines, or from a given specific section as
appropriate.
=============================================================
IMPORTANT: Please ensure that you are happy with sharing the
contents of the information present, any information that you
wish to keep private you should remove before sharing.
=============================================================

Notas

Primera aplicación

A modo de prueba y para comprobar la correcta instalación se puede copiar y ejecutar la siguiente aplicación:

   1 #!/usr/bin/python3
   2 import numpy as np
   3 from timeit import default_timer as timer
   4 from numba import vectorize
   5 @vectorize(["float32(float32, float32)"], target='cuda')
   6 def VectorAdd(a, b):
   7     return a + b
   8 
   9 
  10 def main():
  11     N = 32000000 #Numeros de elementos del array
  12 
  13     A = np.ones(N, dtype=np.float32)
  14     B = np.ones(N, dtypes=np.float32)
  15     C = np.zeros(N, dtypes=np.float32)
  16 
  17     start = timer()
  18 
  19     C = VectorAdd(A, B)
  20     vectoradd_time = timer() - start
  21 
  22     print("C[:5] = " + str(C[:5]))
  23     print("C[-5:] = " + str(C[-5:]))
  24 
  25     print("VectorAdd took %f seconds" % vectoradd_time)
  26 
  27 if __name__ == '__main__':
  28     main()

Descargar

El resultado debiese ser similar a esto e indicará que el programa corrió de buena manera:

C[:5] = [ 2.  2.  2.  2.  2.]
C[-5:] = [ 2.  2.  2.  2.  2.]
VectorAdd took 4.264653 seconds

programacion/python/installcudatoolkit (última edición 2017-10-19 21:57:48 efectuada por FabioDuran)