Exécution du script slurm avec plusieurs nœuds, lancement des étapes de travail avec 1 tâche

StackOverflow https://stackoverflow.com//questions/24056961

  •  26-12-2019
  •  | 
  •  

Question

J'essaie de lancer un grand nombre d'étapes de travail à l'aide d'un script batch.Les différentes étapes peuvent être des programmes complètement différents et nécessitent chacune exactement un processeur.J'ai d'abord essayé de faire cela en utilisant le --multi-prog argument à srun.Malheureusement, lorsque j’utilise de cette manière tous les processeurs affectés à mon travail, les performances se dégradent considérablement.Le temps d'exécution augmente presque jusqu'à sa valeur sérialisée.En me souscrivant, je pourrais améliorer un peu cela.Je n'ai rien trouvé en ligne concernant ce problème, j'ai donc supposé qu'il s'agissait d'un problème de configuration du cluster que j'utilise.

J'ai donc essayé d'emprunter un itinéraire différent.J'ai implémenté le script suivant (lancé via sbatch my_script.slurm):

#!/bin/bash
#SBATCH -o $HOME/slurm/slurm_out/%j.%N.out
#SBATCH --error=$HOME/slurm/slurm_out/%j.%N.err_out
#SBATCH --get-user-env
#SBATCH -J test
#SBATCH -D $HOME/slurm
#SBATCH --export=NONE
#SBATCH --ntasks=48

NR_PROCS=$(($SLURM_NTASKS))
for PROC in $(seq 0 $(($NR_PROCS-1)));
do
    #My call looks like this:
    #srun --exclusive -n1 bash $PROJECT/call_shells/call_"$PROC".sh &
    srun --exclusive -n1 hostname &
    pids[${PROC}]=$!    #Save PID of this background process
done
for pid in ${pids[*]};
do
    wait ${pid} #Wait on all PIDs, this returns 0 if ANY process fails
done

Je suis conscient que le --exclusive l'argument n'est pas vraiment nécessaire dans mon cas.Les scripts shell appelés contiennent les différents binaires et leurs arguments.La partie restante de mon script repose sur le fait que tous les processus sont terminés, d'où le wait.J'ai modifié la ligne d'appel pour en faire un exemple de travail minimal.

Au début, cela semblait être la solution.Malheureusement, en augmentant le nombre de nœuds utilisés dans mon allocation de tâches (par exemple en augmentant --ntasks à un nombre supérieur au nombre de CPU par nœud dans mon cluster), le script ne fonctionne plus comme prévu, renvoyant

srun: Warning: can't run 1 processes on 2 nodes, setting nnodes to 1

et continuer à utiliser un seul nœud (c'est-à-dire48 processeurs dans mon cas, qui parcourent les étapes de travail aussi rapidement qu'auparavant, tous les processus sur les autres nœuds sont ensuite tués).

Cela semble être le comportement attendu, mais je ne peux pas vraiment le comprendre.Pourquoi chaque étape de travail dans une allocation donnée doit-elle inclure un nombre minimum de tâches égal au nombre de nœuds inclus dans l'allocation.En général, je ne me soucie pas du tout du nombre de nœuds utilisés dans mon allocation.

Comment puis-je implémenter mon script batch afin qu'il puisse être utilisé de manière fiable sur plusieurs nœuds ?

Était-ce utile?

La solution

Je l'ai trouvé !La nomenclature et les nombreuses options de ligne de commande pour slurm m'ont dérouté.La solution est donnée par

#!/bin/bash
#SBATCH -o $HOME/slurm/slurm_out/%j.%N.out
#SBATCH --error=$HOME/slurm/slurm_out/%j.%N.err_out
#SBATCH --get-user-env
#SBATCH -J test
#SBATCH -D $HOME/slurm
#SBATCH --export=NONE
#SBATCH --ntasks=48

NR_PROCS=$(($SLURM_NTASKS))
for PROC in $(seq 0 $(($NR_PROCS-1)));
do
    #My call looks like this:
    #srun --exclusive -N1 -n1 bash $PROJECT/call_shells/call_"$PROC".sh &
    srun --exclusive -N1 -n1 hostname &
    pids[${PROC}]=$!    #Save PID of this background process
done
for pid in ${pids[*]};
do
    wait ${pid} #Wait on all PIDs, this returns 0 if ANY process fails
done

Cela spécifie d'exécuter le travail sur exactement un nœud incorporant une seule tâche.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top