2017-09-05 5 views
1

Nous sommes à la recherche de conseils avec slurm salloc gpu allocations. Actuellement, étant donné:Comment régler slurm/salloc pour 1 gpu par tâche mais laisser le travail utiliser plusieurs gpus?

% salloc -n 4 -c 2 -gres=gpu:1 
% srun env | grep CUDA 
CUDA_VISIBLE_DEVICES=0 
CUDA_VISIBLE_DEVICES=0 
CUDA_VISIBLE_DEVICES=0 
CUDA_VISIBLE_DEVICES=0 

Cependant, nous désirons plus qu'un simple dispositif 0 à utiliser.
est-il un moyen de spécifier un salloc avec srun/mpirun pour obtenir ce qui suit?

CUDA_VISIBLE_DEVICES=0 
CUDA_VISIBLE_DEVICES=1 
CUDA_VISIBLE_DEVICES=2 
CUDA_VISIBLE_DEVICES=3 

cela est souhaité de telle sorte que chaque tâche obtient 1 gpu, mais l'utilisation globale de gpu est réparti entre les 4 appareils disponibles (voir ci-dessous gres.conf). Pas où toutes les tâches obtiennent device = 0.

De cette façon, chaque tâche n'attend pas sur le périphérique 0 pour libérer d'autres tâches, comme cela est actuellement le cas.

Ou est-ce comportement attendu même si nous avons plus de 1 gpu disponible/libre (4 au total) pour les 4 tâches? Que manquons-nous ou malentendu?

  • Paramètre salloc/srun?
  • Paramètre slurm.conf ou gres.conf?

Résumé Nous voulons être en mesure d'utiliser slurm et mpi de telle sorte que chaque rang/tâche utilise 1 gpu, mais le travail peut se propager des tâches/se classe parmi les 4 GPUs. Actuellement, il semble que nous sommes limités à l'appareil 0 seulement. Nous voulons également éviter plusieurs soumissions srun dans un salloc/sbatch en raison de l'utilisation de mpi.

OS: CentOS 7

version Slurm: 16.05.6

Sommes-nous obligés d'utiliser wrapper based methods pour cela?

Y at-il des différences avec la version de slurm (14 à 16) dans la façon dont sont attribués GPUs?

Merci!

Référence: gres.conf

Name=gpu File=/dev/nvidia0 
Name=gpu File=/dev/nvidia1 
Name=gpu File=/dev/nvidia2 
Name=gpu File=/dev/nvidia3 

Répondre

1

Tout d'abord, essayez de demander quatre processeurs graphiques avec

% salloc -n 4 -c 2 -gres=gpu:4 

Avec --gres=gpu:1, il est le comportement attendu que toutes les tâches voir un seul GPU. Avec --gres=gpu:4, la sortie serait

CUDA_VISIBLE_DEVICES=0,1,2,3 
CUDA_VISIBLE_DEVICES=0,1,2,3 
CUDA_VISIBLE_DEVICES=0,1,2,3 
CUDA_VISIBLE_DEVICES=0,1,2,3 

obtenir ce que vous voulez, vous pouvez utiliser un script d'emballage, ou modifier votre commande srun comme ceci:

srun bash -c 'CUDA_VISIBLE_DEVICES=$SLURM_PROCID env' | grep CUDA 

alors vous obtiendrez

CUDA_VISIBLE_DEVICES=0 
CUDA_VISIBLE_DEVICES=1 
CUDA_VISIBLE_DEVICES=2 
CUDA_VISIBLE_DEVICES=3 
+1

Merci pour la réponse. Nous attendions que '--gres = gpu: 1' soit vraiment' --gres_per_task = gpu: 1', comme le comportement de l'option '-c, --cpus-per-task ='. Mais semble être plus comme un '--gres_per_node = gpu: 1'.Nous espérons également éviter les méthodes basées sur un wrapper. Nous supposions que slurm devrait être capable de gérer ce cas d'utilisation, puisque nous nous attendons à ce qu'il soit assez commun. –

+0

@CharlieHemlock Oui '--gres' est par noeud, pas par tâche. Je ne suis pas sûr qu'une demande par tâche serait aussi commune. La plupart du temps, soit les tâches sont indépendantes, et elles sont soumises en tant que tableaux de travail, soit elles ne sont pas indépendantes et font partie d'un travail MPI qui a alors un contrôle total sur tous les GPU du nœud et distribue les tâches aux GPU. meilleur moyen pour l'application à portée de main. – damienfrancois