2014-06-05 6 views
5

Ich versuche, eine große Anzahl von Job-Schritten mit einem Batch-Skript zu starten. Die verschiedenen Schritte können völlig unterschiedliche Programme sein und benötigen jeweils genau eine CPU. Zuerst versuchte ich dies unter Verwendung des --multi-prog Arguments zu srun. Wenn ich auf diese Weise alle CPUs nutze, die meinem Job zugewiesen sind, verschlechtert sich die Leistung leider massiv. Die Laufzeit erhöht sich fast auf ihren serialisierten Wert. Durch die Subskription konnte ich dies etwas verbessern. Ich konnte im Zusammenhang mit diesem Problem nichts online finden, daher nahm ich an, dass es sich um ein Konfigurationsproblem des Clusters handelt, den ich verwende.Slurm-Skript mit mehreren Knoten ausführen, Job-Schritte mit 1 Task starten

Also habe ich versucht, eine andere Route zu gehen. Ich implementiert das folgende Skript (gestartet über 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 

Ich bin mir bewusst, dass das --exclusive Argument ist nicht wirklich in meinem Fall erforderlich. Die aufgerufenen Shell-Skripte enthalten die verschiedenen Binärdateien und ihre Argumente. Der restliche Teil meines Skripts beruht auf der Tatsache, dass alle Prozesse damit beendet sind wait. Ich änderte die Anrufzeile, um es zu einem minimalen Arbeitsbeispiel zu machen.

Zuerst schien dies die Lösung zu sein. Leider gibt es in meinem Job Zuordnung verwendet wird, wenn die Anzahl der Knoten zu erhöhen (zB durch --ntasks auf eine Zahl größer als die Anzahl der CPUs pro Knoten in meinem Cluster erhöht wird), wird das Skript nicht wie erwartet mehr funktionieren, Rückkehr

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

und fortfahren, nur einen Knoten zu verwenden (dh 48 CPUs in meinem Fall, die die Jobschritte so schnell wie zuvor durchlaufen, werden alle Prozesse auf den anderen Knoten (n) anschließend beendet).

Dies scheint das erwartete Verhalten zu sein, aber ich kann es nicht wirklich verstehen. Warum muss jeder Jobschritt in einer bestimmten Zuweisung eine Mindestanzahl von Tasks enthalten, die der Anzahl der Knoten entspricht, die in der Zuweisung enthalten sind. Normalerweise interessiert mich die Anzahl der Knoten in meiner Zuweisung überhaupt nicht.

Wie kann ich mein Batch-Skript implementieren, sodass es zuverlässig auf mehreren Knoten verwendet werden kann?

Antwort

5

Es gefunden! Die Nomenklatur und die vielen Kommandozeilenoptionen zum Slurmen verwirrten mich. Die Lösung ist gegeben durch

#!/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 

Dies gibt an, den Job auf genau einem Knoten auszuführen, der nur eine einzelne Aufgabe enthält.

+0

Also war Ihre Lösung, explizit einen Knoten (-N1) anzufordern? – rkioji

+0

Ja, genau, es scheint, dass (meine Konfiguration von) slurm immer etwas Arbeit an jeden Knoten geben will, wenn ich nicht spezifisch nach nur einem Knoten frage. –

Verwandte Themen