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)
    • 192 GB RAM
    • 4 NVidia Tesla V100 PCIe → 4 GPU Nvidia avec 32 GB HBM2
    • pas d’InfiniBand

À la soumission l’utilisateur doit choisir le type de GPU par une déclaration de ressource :

-l GPUtype=K80 ou -l GPUtype=V100

Les queues disponibles pour les jobs GPU sont les suivantes :

jobs GPU interactifs :
mc_gpu_interactive
jobs GPU multi-coeurs :
mc_gpu_medium mc_gpu_long mc_gpu_longlasting
jobs GPU parallèles :
pa_gpu_long

Pour connaître les limites des queues, veuillez vous référer à la page Informations sur les queues batch.

Attention

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

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. Pour compiler en CUDA veuillez vous référer au paragraphe dedié.

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 (voir aussi la page Jobs interactifs) 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).

En résumé les options de qsub sont :

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

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

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.