IMB > cellule > Calcul et Développement

Calculer sur GPU

dernière mise à jour : 24/6/2021

Des cartes GPU sont disponibles sur les plateformes suivantes :

Calculer de manière fiable sur GPU (avoir des temps et des runs reproductibles)

Que ce soit sur PlaFRIM (pas de réservation GPU gérée) ou sur CURTA (réservation gérée mais qui ne fonctionne que si tous les utilisateurs jouent le jeu) la réservation des cartes GPU ne fonctionne pas bien.

Pour être sûr d’avoir un accès exclusif à une carte GPU, il faut en réalité réserver la machine entière = tous les cœurs de la machine hôte pour être sûr que personne d’autre ne pourra se connecter (lancer des jobs) dessus.

MAIS, que ce soit sur PlaFRIM ou CURTA, les machines n’ont généralement pas une, mais deux cartes GPU. Du coup, si vous réservez la machine entière, vous vous retrouvez avec deux cartes GPU. Et si vous n’utilisez qu’une seule carte, c’est du gâchis...

voici un canevas de script pour PlaFRIM3 permettant d’utiliser deux cartes GPU A100 en lançant deux programmes différents (ou ici le même programme avec des paramètres différents), un sur chaque, pendant 10 minutes.

#! /bin/bash                                                                                                                        

#SBATCH -C a100                                                                                                                      
#SBATCH -t 10                                                                                                                        
#SBATCH --exclusive -c 2 -n 1                                                                                                        

# lancement sur la carte GPU 0
CUDA_VISIBLE_DEVICES=0 srun -n 1 -c 1 .... python3 -u tralala.py 1 2 3 ....   > output1 2>&1 &
# lancement sur la carte GPU 1
CUDA_VISIBLE_DEVICES=1 srun -n 1 -c 1 .... python3 -u tralala.py 4 5 6 ....   > output2 2>&1 &
# on attend que les deux srun se terminent
wait
# fin
echo done

Note : si les deux programmes durent le même temps ou presque, tout va bien. Par contre, si un des deux programmes est beaucoup plus court, il y a encore du gâchis car une carte sera beaucoup moins utilisée.

Si le programme python est multithread, il faut ajuster les "-c" : le premier "-c" doit être égale à la somme des deux "-c" des srun. Ex : "... —exclusive -c 10 ..." + "srun ... -c 5 ...","srun ... -c 5 ..."

En étant connecté sur la machine ayant les cartes GPU, la commande nvidia-smi permet de contrôler "en live" la mémoire utilisée et les programmes qui tournent sur chaque carte GPU. (voir plus bas)

Autre canevas pour PlaFRIM3 pour montrer comment enchaîner séquentiellement plusieurs calculs sur chaque carte.

#! /bin/bash

#SBATCH -C a100
#SBATCH -t 10
#SBATCH --exclusive -c 2 -n 1

CUDA_VISIBLE_DEVICES=0 bash -c "\
     srun -n 1 -c 1 .... python3 -u tralala.py 1 2 3 .... > output1 2>&1 ;\
     srun -n 1 -c 1 .... python3 -u tralala.py 4 5 6 .... > output2 2>&1;\
echo fin1" &

CUDA_VISIBLE_DEVICES=1 bash -c "\
     srun -n 1 -c 1 .... python3 -u tralala.py  7  8  9 .... > output3 2>&1 ;\
     srun -n 1 -c 1 .... python3 -u tralala.py 10 11 12 .... > output4 2>&1;\
echo fin2" &

wait

La commande nvidia-smi : connaitre l’état des cartes GPU

La commande nvidia-smi permet d’afficher :