it-swarm.com.de

SLURM `srun` vs` sbatch` und ihre Parameter

Ich versuche zu verstehen, was der Unterschied zwischen den Befehlen srun und sbatch von SLURM ist. Ich würde mich über eine allgemeine Erklärung und nicht über konkrete Antworten auf die folgenden Fragen freuen, aber hier sind einige konkrete Punkte der Verwirrung, die als Ausgangspunkt dienen und eine Vorstellung davon geben können, wonach ich suche.

Gemäß Dokumentation dient srun zum Übergeben von Jobs und sbatch zum Übergeben von Jobs zur späteren Ausführung, aber der praktische Unterschied ist mir und deren Verhalten unklar scheint das gleiche zu sein. Zum Beispiel habe ich einen Cluster mit 2 Knoten mit jeweils 2 CPUs. Wenn ich srun testjob.sh & 5x hintereinander wird der fünfte Job in eine Warteschlange gestellt, bis eine CPU verfügbar ist, ebenso wie die Ausführung von sbatch testjob.sh.

Um die Frage konkreter zu machen, denke ich, dass ein guter Anfang sein könnte: Was kann ich mit dem einen tun, was ich mit dem anderen nicht tun kann, und warum?

Viele der Argumente für beide Befehle sind gleich. Die relevantesten scheinen --ntasks, --nodes, --cpus-per-task, --ntasks-per-node. Wie hängen diese miteinander zusammen und wie unterscheiden sie sich für srun vs sbatch?

Ein besonderer Unterschied ist, dass srun einen Fehler verursacht, wenn testjob.sh hat keine ausführbare Berechtigung, d. h. chmod +x testjob.sh wohingegen sbatch es gerne ausführen wird. Was passiert "unter der Haube", wodurch dies der Fall ist?

In der Dokumentation wird auch erwähnt, dass srun häufig in sbatch Skripten verwendet wird. Dies führt zu der Frage: Wie interagieren sie miteinander und was ist der "kanonische" Verwendungszweck für jeden von ihnen? Würde ich srun jemals alleine verwenden?

57
dkv

Die Dokumentation sagt

srun is used to submit a job for execution in real time

während

sbatch is used to submit a job script for later execution.

Beide akzeptieren praktisch den gleichen Parametersatz. Der Hauptunterschied besteht darin, dass srun interaktiv und blockierend ist (Sie erhalten das Ergebnis in Ihrem Terminal und können keine anderen Befehle schreiben, bis es abgeschlossen ist), während sbatch Stapelverarbeitung und nicht blockierend ist ( Die Ergebnisse werden in eine Datei geschrieben und Sie können sofort weitere Befehle senden.

Wenn Sie srun im Hintergrund mit dem Zeichen & Verwenden, entfernen Sie die Blockierungsfunktion von srun, die interaktiv, aber nicht blockierend wird. Es ist jedoch immer noch interaktiv, was bedeutet, dass die Ausgabe Ihr Terminal überfrachtet und die srun -Prozesse mit Ihrem Terminal verknüpft sind. Wenn Sie die Verbindung trennen, verlieren Sie die Kontrolle über sie oder sie werden getötet (abhängig davon, ob sie stdout verwenden oder nicht). Und sie werden beendet, wenn der Computer, zu dem Sie eine Verbindung herstellen, um Aufträge zu senden, neu gestartet wird.

Wenn Sie sbatch verwenden, übergeben Sie Ihren Auftrag und er wird von Slurm bearbeitet. Sie können die Verbindung trennen, Ihr Terminal usw. ohne Konsequenz beenden. Ihr Job ist nicht mehr mit einem laufenden Prozess verbunden.

Was kann ich mit dem einen tun, was mit dem anderen nicht und warum?

Eine Funktion, die sbatch und nicht srun zur Verfügung steht, ist Job-Arrays . Da srun in einem sbatch Skript verwendet werden kann, können Sie mit sbatch nichts anfangen.

Wie hängen diese miteinander zusammen und wie unterscheiden sie sich für srun vs sbatch?

Alle Parameter --ntasks, --nodes, --cpus-per-task, --ntasks-per-node Haben in beiden Befehlen die gleiche Bedeutung. Dies gilt für fast alle Parameter, mit Ausnahme von --exclusive.

Was passiert "unter der Haube", wodurch dies der Fall ist?

srun führt das Skript sofort auf dem Remote-Host aus, während sbatch das Skript in einen internen Speicher kopiert und es dann beim Start des Jobs auf den Rechenknoten hochlädt. Sie können dies überprüfen, indem Sie Ihr Übermittlungsskript nach dem Übermitteln ändern. Änderungen werden nicht berücksichtigt (siehe this ).

Wie interagieren sie miteinander und was ist der "kanonische" Verwendungszweck für sie?

Normalerweise verwenden Sie sbatch, um einen Job zu übergeben, und srun im Übergabeskript, um Jobschritte zu erstellen, wie Slurm sie aufruft. srun wird verwendet, um die Prozesse zu starten. Wenn Ihr Programm ein paralleles MPI Programm ist, kümmert sich srun um die Erstellung aller MPI Prozesse. Wenn nicht, srun führt Ihr Programm so oft aus, wie mit der Option --ntasks angegeben. Es gibt viele Anwendungsfälle, je nachdem, ob Ihr Programm parallel läuft oder nicht, eine lange Laufzeit hat oder aus einer einzelnen ausführbaren Datei besteht oder nicht nicht usw. Sofern nicht anders angegeben, erbt srun standardmäßig die entsprechenden Optionen des sbatch oder salloc, unter dem es ausgeführt wird (von hier ) .

Würde ich jemals selbst srun verwenden?

Anders als für kleine Tests, nein. Eine gebräuchliche Verwendung ist srun --pty bash, Um eine Shell für einen Rechenjob zu erhalten.

64
damienfrancois

Dies beantwortet die Frage nicht vollständig, aber hier sind einige weitere Informationen, die ich gefunden habe und die für jemanden in der Zukunft hilfreich sein könnten:


Aus einem verwandten Thread, den ich gefunden habe mit einer ähnlichen Frage:

Kurz gesagt, sbatch und salloc weisen dem Job Ressourcen zu, während srun über diese Ressourcen hinweg parallele Tasks startet. Beim Aufrufen innerhalb einer Jobzuweisung startet srun parallele Aufgaben für einige oder alle zugewiesenen Ressourcen. In diesem Fall erbt srun standardmäßig die entsprechenden Optionen des sbatch oder salloc, unter denen es ausgeführt wird. Sie können dann (normalerweise) verschiedene Optionen für srun angeben, die die standardmäßig empfangenen Optionen außer Kraft setzen. Jeder Aufruf von srun innerhalb eines Jobs wird als Jobschritt bezeichnet.

srun kann auch außerhalb einer Auftragszuordnung aufgerufen werden. In diesem Fall fordert srun Ressourcen an, und wenn diese Ressourcen gewährt werden, werden Aufgaben für diese Ressourcen als ein einzelner Job und Jobschritt gestartet.

Es gibt eine relativ neue Webseite, die detaillierter auf die Optionen -B und --exklusiv eingeht.

doc/html/cpu_management.shtml


Zusätzliche Informationen finden Sie auf der Seite SLURM FAQ .

Der Befehl srun hat zwei verschiedene Betriebsarten. Wenn er nicht in einem vorhandenen Job ausgeführt wird (d. H. Nicht in einer von salloc oder sbatch erstellten Slurm-Jobzuordnung), wird zunächst eine Jobzuordnung erstellt und eine Anwendung erstellt. Wenn der Befehl srun innerhalb einer vorhandenen Zuordnung ausgeführt wird, wird nur die Anwendung erzeugt. Bei dieser Frage werden wir nur den ersten Betriebsmodus ansprechen und die Erstellung einer Auftragszuordnung mit den Befehlen sbatch und srun vergleichen.

Der Befehl srun ist für die interaktive Verwendung konzipiert, wobei die Ausgabe von jemandem überwacht wird. Die Ausgabe der Anwendung wird als Ausgabe des Befehls srun angesehen, normalerweise am Terminal des Benutzers. Der Befehl sbatch dient zum Senden eines Skripts zur späteren Ausführung. Die Ausgabe wird in eine Datei geschrieben. Die in der Auftragszuordnung verwendeten Befehlsoptionen sind nahezu identisch. Der auffälligste Unterschied bei den Optionen besteht darin, dass der Befehl sbatch das Konzept von Job-Arrays unterstützt, srun jedoch nicht. Ein weiterer wesentlicher Unterschied liegt in der Fehlertoleranz. Fehler mit sbatch-Jobs führen normalerweise dazu, dass der Job erneut angefordert und ausgeführt wird, während Fehler mit srun normalerweise dazu führen, dass eine Fehlermeldung mit der Erwartung generiert wird, dass der Benutzer angemessen reagiert.

4
dkv