Jobs GPU

Le CC-IN2P3 met à disposition une plateforme de calcul GPGPU basée sur CentOS 7 qui consiste en 2 types de GPU :

  • 10 Dell C4130 avec 4 GPU et 16 coeurs CPU par serveur de calcul
    • 2 Xeon E5-2640v3 (8c @2.6 Ghz)
    • 128 GB RAM
    • 2 Nvidia Tesla K80 → 4 GPU Nvidia GK210 avec 12 GB DDR5
    • InfiniBand entre les noeuds
  • 6 Dell C4140 avec 4 GPU et 20 coeurs CPU par serveur de calcul
    • 2 Xeon Silver 4114 (10c @2.2 GHz)
    • 4 NVidia Tesla V100 PCIe → 4 GPU Nvidia avec 32 GB HBM2
    • pas d’InfiniBand

Attention

À l’exception de mc_gpu_interactive, toutes les queues batch GPU sont à accès restreint. Vous devez contacter votre czar pour avoir accès à ce type de ressources.

Les jobs demandant l’accès aux serveur de calcul GPU doivent utiliser ceux-ci de la manière la plus efficace possible. En effet, les GPU monopolisés par un job inefficace sont perdus pour les jobs en ayant réellement besoin. Pour vérifier si votre job utilise bien les GPU :

  • nvidia-smi vous permet de visualiser l’efficacité de vos jobs interactifs en temps réél.
  • le cartouche de fin de job (dans le fichier de sortie) vous donne des métriques liées à son efficacité sur toute la durée du job.

Les environnements CUDA 10.1 et OpenCL 1.2 sont disponibles dans /opt/cuda-10.1.

CUDA est mis régulièrement à jour, mais la version n-1 est toujours conservée afin de répondre aux besoins spécifiques. Actuellement, CUDA 9.2 est disponible dans /opt/cuda-9.2. Pour bénéficier de logiciels indisponibles sur la ferme de calcul, ou utiliser une version antérieure, le CC-IN2P3 propose la solution de virtualisation “Singularity”.

Si vous devez utiliser des bibliothèques CUDA ou OpenCL, précisez dans votre script :

  • bash
if ! echo ${LD_LIBRARY_PATH} | /bin/grep -q /opt/cuda-10.1/lib64 ; then
       LD_LIBRARY_PATH=/opt/cuda-10.1/lib64:${LD_LIBRARY_PATH}
fi
  • csh
if ($?LD_LIBRARY_PATH) then
       setenv LD_LIBRARY_PATH /opt/cuda-10.1/lib64:${LD_LIBRARY_PATH}
else
       setenv LD_LIBRARY_PATH /opt/cuda-10.1/lib64
endif

Jobs GPU interactifs

Les jobs GPU interactifs sont lancés avec la commande qlogin (avec les mêmes options que celles de qsub pour les jobs batch) et en choisissant la queue mc_gpu_interactive.

En résumé :

% qlogin -l GPU=<number_of_gpus> -l GPUtype=<gpu_type> -q mc_gpu_interactive -pe multicores_gpu 4

Exemple :

% qlogin -l GPU=1 -l GPUtype=V100 -q mc_gpu_interactive -pe multicores_gpu 4

Les soumissions de jobs interactifs doivent obligatoirement demander exactement 4 CPU (-pe multicores_gpu 4) pour être exécutables.

Jobs GPU multi-coeurs

Pour soumettre un job GPU, vous devez spécifier la queue GPU (par exemple -q mc_gpu_long), le nombre de GPUs requis (par exemple -l GPU=2, jusqu’à 4 GPUs sont disponibles par serveur) et l’environnement multi-cœurs dédié (-pe multicores_gpu). Vous devez aussi préciser le type de GPU que vous souhaitez utiliser avec le complexe GPUtype. Les valeurs possibles pour ce complexe sont : K80 et V100 (par exemple : -l GPUtype=K80).

En résumé les options de qsub sont :

% qsub -l GPU=<number_of_gpus> -l GPUtype=<gpu_type> -q <QueueName> -pe multicores_gpu 4 ...

Les queues batch disponibles sont :

  • mc_gpu_medium,
  • mc_gpu_long,
  • mc_gpu_longlasting.

La variable CUDA_VISIBLE_DEVICES est définie automatiquement.

Exemple de soumission :

% qsub -l GPU=2 -l GPUtype=K80 -q mc_gpu_long -pe multicores_gpu 4 ...

Les soumissions de jobs multicœurs doivent obligatoirement demander exactement 4 CPU (-pe multicores_gpu 4) pour être exécutables. Cependant, cette requête ne contraint pas le job, il peut donc utiliser réellement plus ou moins de 4 CPU, selon son besoin ; veuillez seulement éviter d’occuper tous les CPU d’un serveur (16) si vous n’en utilisez pas tous les GPU.

Jobs GPU parallèles

Pour soumettre un job GPU parallèle, vous devez spécifier :

  • la queue -q pa_gpu_long
  • le nombre de GPU souhaités par serveur -l GPU=x, avec 1 ≤ x ≤ 4
  • l’environnement openmpigpu_4 qui va vous servir à déterminer le nombre de serveur de calcul voulu -pe openmpigpu_4 x, avec x = (4 * le nombre de serveurs que vous souhaitez utiliser)
  • le type de GPU disponible pour les jobs parallèles est uniquement K80 -l GPUtype=K80

Votre script doit contenir certaines directives propres à OpenMPI (dont le lancement de MPIEXEC), qui sont précisées dans la section Jobs parallèles.

Les options sont donc :

% qsub -l GPU=<nombre_de_gpus_par_node> -l GPUtype=K80 -q pa_gpu_long -pe openmpigpu_4 <nombre_de_serveurs_fois_4> ...

La queue disponible est pa_gpu_long.

Exemple :

% qsub -l GPU=3 -l GPUtype=K80 -q pa_gpu_long -pe openmpigpu_4 8 mon_script_pour_2_noeuds_et_6_GPU.sh

Compiler en CUDA

Pour compiler votre code CUDA, vous devriez vous connecter sur le serveur GPU interactif avec par exemple la ligne de commande suivante :

% qlogin -l GPU=1 -l GPUtype=K80 -q mc_gpu_interactive -pe multicores_gpu 4

Ensuite vous serez connecté en SSH sur le serveur, et vous pourrez compiler votre code avec le compilateur nvcc :

% /opt/cuda-10.1/bin/nvcc

Une fois le code compilé, nous vous conseillons de sortir du serveur interactif et soumettre vos jobs avec qsub.