Frage

Ich versuche, eine große Anzahl von Jobschritten mithilfe eines Batch-Skripts zu starten.Die verschiedenen Schritte können völlig unterschiedliche Programme sein und benötigen jeweils genau eine CPU.Zuerst habe ich versucht, dies mit dem zu tun --multi-prog Argument zu srun.Leider nimmt die Leistung massiv ab, wenn alle meinem Job zugewiesenen CPUs auf diese Weise genutzt werden.Die Laufzeit erhöht sich nahezu auf ihren serialisierten Wert.Durch ein Abonnement könnte ich dies ein wenig verbessern.Ich konnte online nichts zu diesem Problem finden und ging daher davon aus, dass es sich um ein Konfigurationsproblem des von mir verwendeten Clusters handelte.

Also habe ich versucht, einen anderen Weg zu gehen.Ich habe das folgende Skript implementiert (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

Mir ist bewusst, dass die --exclusive Ein Argument ist in meinem Fall nicht wirklich nötig.Die aufgerufenen Shell-Skripte enthalten die verschiedenen Binärdateien und ihre Argumente.Der verbleibende Teil meines Skripts basiert auf der Tatsache, dass alle Prozesse abgeschlossen sind wait.Ich habe die Aufrufzeile geändert, um daraus ein minimal funktionierendes Beispiel zu machen.

Das schien zunächst die Lösung zu sein.Wenn ich die Anzahl der in meiner Jobzuweisung verwendeten Knoten erhöhe (z. B. durch Erhöhen). --ntasks auf eine Zahl, die größer ist als die Anzahl der CPUs pro Knoten in meinem Cluster), funktioniert das Skript nicht mehr wie erwartet und kehrt zurück

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

und weiterhin nur einen Knoten verwenden (d. h.48 CPUs in meinem Fall, die die Jobschritte genauso schnell durchlaufen wie zuvor, alle Prozesse auf den anderen Knoten werden anschließend getötet.

Dies scheint das erwartete Verhalten zu sein, aber ich kann es nicht wirklich verstehen.Warum muss jeder Jobschritt in einer bestimmten Zuordnung eine Mindestanzahl an Aufgaben umfassen, die der Anzahl der in der Zuordnung enthaltenen Knoten entspricht?Normalerweise ist mir die Anzahl der Knoten, die in meiner Zuteilung verwendet werden, überhaupt nicht wichtig.

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

War es hilfreich?

Lösung

Fand es!Die Nomenklatur und die vielen Befehlszeilenoptionen zum Slurmen haben mich verwirrt.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, dass der Job auf genau einem Knoten ausgeführt werden soll und nur eine einzelne Aufgabe umfasst.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top