Cuda install

De The Linux Craftsman
Aller à la navigation Aller à la recherche

Introduction

Compute Unified Device Architecture ou CUDA est un framework propriétaire de Nvidia pour faire du General-Purpose Computing on Graphics Processing Units ou GPGPU. C'est à dire, utiliser le GPU pour faire des calculs habituellement fait par le processeur (CPU).

Les GPU possèdent plus de cours que les CPU est sont très efficaces pour faire des calculs parallélisés. Cependant, les GPU ont un espace mémoire dédié qui est différent de celui du CPU (géré par la MMU) et il faudra généralement copier vos variables d'un espace à l'autre avant de faire des calculs.

Attention donc à faire des calculs suffisamment long pour contrebalancer le temps de copie des variables, autrement le programme perdrait plus de temps en copies mémoire qu'en calculs...

Plus d'informations sur CUDA ici.

Le dépôt Nvidia

Avant d'installer les pilotes, il faut installer les il faut ajouter le dépôt Nvidia:

# dnf config-manager --add-repo https://developer.download.nvidia.com/compute/cuda/repos/rhel8/x86_64/cuda-rhel8.repo

Il faut également installer les sources du noyau, le dépôt EPEL ainsi que le compilateur C:

# dnf -y install kernel-devel kernel-headers epel-release gcc gdb

Installation du pilote

Vous pouvez maintenant lister les différentes versions avec dnf:

# dnf module list nvidia-driver
Dernière vérification de l’expiration des métadonnées effectuée il y a 0:49:08 le jeu. 20 mai 2021 04:09:26 CEST.
cuda-rhel8-x86_64
Name               Stream                 Profiles                     Summary
nvidia-driver      latest                 default [d], fm, ks, src     Nvidia driver for latest branch
nvidia-driver      latest-dkms [d][e]     default [d] [i], fm, ks      Nvidia driver for latest-dkms branch
nvidia-driver      418                    default [d], fm, ks, src     Nvidia driver for 418 branch
nvidia-driver      418-dkms               default [d], fm, ks          Nvidia driver for 418-dkms branch
nvidia-driver      440                    default [d], fm, ks, src     Nvidia driver for 440 branch
nvidia-driver      440-dkms               default [d], fm, ks          Nvidia driver for 440-dkms branch
nvidia-driver      450                    default [d], fm, ks, src     Nvidia driver for 450 branch
nvidia-driver      450-dkms               default [d], fm, ks          Nvidia driver for 450-dkms branch
nvidia-driver      455                    default [d], fm, ks, src     Nvidia driver for 455 branch
nvidia-driver      455-dkms               default [d], fm, ks          Nvidia driver for 455-dkms branch
nvidia-driver      460                    default [d], fm, ks, src     Nvidia driver for 460 branch
nvidia-driver      460-dkms               default [d], fm, ks          Nvidia driver for 460-dkms branch
nvidia-driver      465                    default [d], fm, ks, src     Nvidia driver for 465 branch
nvidia-driver      465-dkms               default [d], fm, ks          Nvidia driver for 465-dkms branch

Aide : [d]éfaut, [e]activé, [x]désactivé, [i]nstallé

On peut installer la dernière version grâce à la commande suivante :

# dnf module install -y nvidia-driver:latest-dkms

Il faut maintenant redémarrer le système pour que le noyau charge le pilote Nvidia:

# reboot

Vérification

Après un redémarrage vous pouvez voir que la carte est reconnue en listant les périphériques:

# ll /dev/nvidia*
crw-rw-rw-. 1 root root 195,   0 20 mai   04:31 /dev/nvidia0
crw-rw-rw-. 1 root root 195, 255 20 mai   04:31 /dev/nvidiactl
crw-rw-rw-. 1 root root 195, 254 20 mai   04:31 /dev/nvidia-modeset
crw-rw-rw-. 1 root root 238,   0 20 mai   04:32 /dev/nvidia-uvm
crw-rw-rw-. 1 root root 238,   1 20 mai   04:32 /dev/nvidia-uvm-tools

/dev/nvidia-caps:
total 0
cr--------. 1 root root 242, 1 20 mai   04:31 nvidia-cap1
cr--r--r--. 1 root root 242, 2 20 mai   04:31 nvidia-cap2

Toutes les cartes seront listées avec un numéro nvidia0, nvidia1, etc...

On peut utiliser la commande nvidia-smi pour lister toutes les informations sur la carte:

# nvidia-smi -a

==============NVSMI LOG==============

Timestamp                                 : Thu May 20 05:04:16 2021
Driver Version                            : 465.19.01
CUDA Version                              : 11.3

Attached GPUs                             : 1
GPU 00000000:01:00.0
    Product Name                          : NVIDIA GeForce GT 640
    Product Brand                         : GeForce
    Display Mode                          : N/A
    Display Active                        : N/A
    Persistence Mode                      : Disabled
    MIG Mode
...

Ou un résumé:

# nvidia-smi
Thu May 20 05:09:08 2021
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 465.19.01    Driver Version: 465.19.01    CUDA Version: 11.3     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  NVIDIA GeForce ...  Off  | 00000000:01:00.0 N/A |                  N/A |
| 40%   31C    P0    N/A /  N/A |      0MiB /  1999MiB |     N/A      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

Comme on peut le voir ici, le serveur est équipé d'une carte GT 640:

Msi gt640.jpg

Installation de CUDA

Choix de la version

Avant d'installer CUDA, il faut savoir quelle version est supportée par votre carte graphique. Malheureusement, Il n'y a pas de lien direct entre la version de CUDA et le modèle de carte graphique mais il faut regarder les capacités de calcul (Compute Capability). Le site de Nvidia déclare la GT 640 comme ayant des capacités de calcul 3.5 mais c'est faux ! Le site techpowerup donne de meilleures informations et on peut voir que c'est 3.0:

Gt640 compute capability.png

Si on en crois ce tableau de compatibilité trouvé sur stackoverflow il faut installer la version 10.x de cuda:

Cuda cc capability.png

Installation

Sur CentOS 8, la dernière version disponible est la 10.2 :

# dnf search cuda-10
Last metadata expiration check: 1:15:13 ago on Mon May 24 13:55:11 2021.
======================================================== Name Matched: cuda-10 ========================================================
cuda-10-1.x86_64 : CUDA 10.1 meta-package
cuda-10-2.x86_64 : CUDA 10.2 meta-package

Ici nous installerons la version 10.2 mais vous devez installer al version en adéquation avec votre GPU ! :

# dnf install cuda-10-2

Les fichiers de CUDA se trouvent dans le répertoire /usr/local et nous allons créer un lien symbolique pour pointer toujours vers la version utilisée. Cette astuce permet de changer rapidement de version (on change le lien symbolique) pour faire des tests ou compiler :

# ln -fs /usr/local/cuda-10.2 /usr/local/cuda

Variables d'environnement

Il faut maintenant charger dans l'environnement les exécutables et les librairies utilisés par CUDA. Pour cela, nous allons modifier le fichier bash_profile qui se trouve dans le répertoire de l'utilisateur (ici root) pour y ajouter / modifier les variables PATH et LD_LIBRAIRY_PATH :

# vi ~/.bash_profile

Ajouter à la fin du fichier:

# CUDA specific environment
PATH=/usr/local/cuda/bin:$PATH:$HOME/bin
export PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64

Il ne reste plus qu'a recharger le contexte du bash :

# . ~/.bash_profile

Test de fonctionnement

Normalement vous devriez pouvoir afficher la version du compilateur CUDA :

# nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2019 NVIDIA Corporation
Built on Wed_Oct_23_19:24:38_PDT_2019
Cuda compilation tools, release 10.2, V10.2.89

release 10.2 cela correspond à la version que nous venons d'installer !

On peut vérifier les compatibilité de la carte avec cette version de CUDA en compilant un programme exemple:

# cd /usr/local/cuda/samples/1_Utilities/deviceQuery
# make
# ./deviceQuery
./deviceQuery Starting...

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

Detected 1 CUDA Capable device(s)

Device 0: "GeForce GT 640"
  CUDA Driver Version / Runtime Version          11.2 / 10.2
  CUDA Capability Major/Minor version number:    3.0
  Total amount of global memory:                 2000 MBytes (2097086464 bytes)
  ( 2) Multiprocessors, (192) CUDA Cores/MP:     384 CUDA Cores
  GPU Max Clock rate:                            902 MHz (0.90 GHz)
  Memory Clock rate:                             810 Mhz
  Memory Bus Width:                              128-bit
...

On peut voir que la capacité de calcul supportée par la carte est bien 3.0:

CUDA Capability Major/Minor version number: 3.0

Il ne vous reste plus qu'a apprendre l'API CUDA pour pouvoir utiliser votre GPU pour faire des calculs...