SLURM `srun` vs` sbatch` und ihre Parameter

99

Ich versuche zu verstehen, was der Unterschied zwischen SLURMs srunund sbatchBefehlen ist. Ich freue mich über eine allgemeine Erklärung und nicht über spezifische Antworten auf die folgenden Fragen, aber hier sind einige spezifische Verwirrungspunkte, die als Ausgangspunkt dienen und eine Vorstellung davon geben können, wonach ich suche.

Gemäß der Dokumentation , srunist für die Einreichung von Arbeitsplätzen und sbatchfür Arbeitsplätze für die spätere Ausführung einreichen, aber der praktische Unterschied ist mir unklar, und ihr Verhalten 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 ausführe , wird der fünfte Job in eine Warteschlange gestellt, bis eine CPU verfügbar ist, ebenso wie die Ausführung sbatch testjob.sh.

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

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

Ein besonderer Unterschied ist , dass srunwird einen Fehler verursachen , wenn sie testjob.shnicht Ausführbarkeitsberechtigung dh haben chmod +x testjob.shwährend sbatchglücklich es laufen wird. Was passiert "unter der Haube", was dazu führt, dass dies der Fall ist?

In der Dokumentation wird auch erwähnt, dass srunhäufig in sbatchSkripten verwendet wird. Dies führt zu der Frage: Wie interagieren sie miteinander und was ist der "kanonische" Anwendungsfall für jeden von ihnen? Konkret, würde ich jemals srunalleine verwenden?

dkv
quelle

Antworten:

115

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 srunes interaktiv und blockierend ist (Sie erhalten das Ergebnis in Ihrem Terminal und können keine anderen Befehle schreiben, bis es fertig ist), während sbatches stapelweise verarbeitet und nicht blockiert wird (Ergebnisse werden in eine Datei geschrieben und Sie können andere Befehle senden jetzt sofort).

Wenn Sie srunim Hintergrund das &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 überfüllt und die srunProzesse mit Ihrem Terminal verknüpft sind. Wenn Sie die Verbindung trennen, verlieren Sie die Kontrolle über sie oder sie werden möglicherweise getötet (je nachdem, ob sie im stdoutGrunde genommen verwendet werden oder nicht). Und sie werden getötet, wenn der Computer, zu dem Sie eine Verbindung zum Senden von Jobs herstellen, neu gestartet wird.

Wenn Sie verwenden sbatch, geben Sie Ihren Job ab und er wird von Slurm bearbeitet. Sie können die Verbindung trennen, Ihr Terminal töten usw., ohne Konsequenzen. Ihr Job ist nicht mehr an einen laufenden Prozess gebunden.

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

Eine Funktion, die für sbatchund nicht für Job-Arrays verfügbar srunist . Wie in einem Skript verwendet werden kann, gibt es nichts, mit dem Sie nichts anfangen können .srunsbatchsbatch

Wie hängen diese miteinander zusammen und wie unterscheiden sie sich zwischen srun und sbatch?

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

Was passiert "unter der Haube", was dazu führt, dass dies der Fall ist?

srunFührt das Skript sofort auf dem Remote-Host aus, sbatchkopiert das Skript in einen internen Speicher und lädt es dann beim Start des Jobs auf den Rechenknoten hoch. Sie können dies überprüfen, indem Sie Ihr Übermittlungsskript nach dem Absenden ändern. Änderungen werden nicht berücksichtigt (siehe hier ).

Wie interagieren sie miteinander und was ist der "kanonische" Anwendungsfall für jeden von ihnen?

Normalerweise verwenden Sie diese Option sbatch, um einen Job zu senden, und srunim Übermittlungsskript, um Jobschritte zu erstellen, wie Slurm sie aufruft. srunwird verwendet, um die Prozesse zu starten. Wenn Ihr Programm ein paralleles MPI-Programm ist srun, werden alle MPI-Prozesse erstellt. Wenn nicht, srunwird Ihr Programm so oft ausgeführt, wie in der --ntasksOption angegeben. Es gibt viele Anwendungsfälle, je nachdem, ob Ihr Programm parallel geschaltet ist oder nicht, eine lange Laufzeit hat oder nicht, aus einer einzelnen ausführbaren Datei besteht oder nicht usw. Sofern nicht anders angegeben, srunerbt es standardmäßig die entsprechenden Optionen des sbatchoder des Programms, sallocdas es ausführt unter (von hier ).

Würde ich jemals srun alleine verwenden?

Außer für kleine Tests, nein. Eine häufige Verwendung besteht srun --pty bashdarin, eine Shell für einen Rechenjob abzurufen.

damienfrancois
quelle
6
Vielen Dank für die Antwort, das ist besser als alles, was ich mir erhofft hätte. Ein Follow-up, da dies einer meiner ursprünglichen Verwirrungspunkte war: Warum sollte ich mich die Mühe machen, srundas Einreichungsskript aufzurufen ? Vielleicht bin ich verwirrt über die Bedeutung eines "Jobschritts". Wenn ich zum Beispiel ein Skript namens habe runjob.sh, das enthält #!/bin/bash srun myjob.sh, gibt es einen praktischen Unterschied zwischen dem Aufruf von (a) sbatch runjob.shvs (b) sbatch myjob.shvs (c) srun myjob.shvs (d) srun runjob.sh? (Natürlich ist der letzte albern, aber ich bin neugierig).
dkv
3
Vielleicht können Sie die Folien einer kürzlich von mir gelieferten Schulungssitzung durchsuchen, um Ideen zur Verwendung von srun in einem Einreichungsskript zu erhalten: cism.ucl.ac.be/Services/Formations/slurm/2016/slurm.pdf
damienfrancois
5
Es sieht so aus, als würden alle Beispiele in den Folien (sowie das Tutorial auf der CECI-Seite) srunim sbatchEinreichungsskript verwendet. Ich habe jedoch festgestellt, dass Befehle ohne srunim Übermittlungsskript auf dieselbe Weise ausgeführt werden. Gibt es tatsächlich einen Unterschied zwischen den vier oben erwähnten Anrufungen?
dkv
9
Alle Ihre Beispiele werden nur dann auf die gleiche Weise ausgeführt, wenn (1) die Zuordnung für eine CPU erfolgt und (2) das Programm rein sequentiell ist. Fordern Sie mehr als eine Aufgabe an, um Unterschiede festzustellen. Ein weiterer Unterschied ist, dass, wenn Sie srun nicht in sbatch verwenden, der Befehl sstat keine nützlichen Informationen
zurückgibt
1
@Atcold diese Version könnte aktueller sein: github.com/damienfrancois/slurm-helper/blob/master/slurm.vim
damienfrancois
5

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


Aus einem verwandten Thread fand ich mit einer ähnlichen Frage:

Kurz gesagt, sbatch und salloc weisen dem Job Ressourcen zu, während srun parallele Aufgaben über diese Ressourcen hinweg startet. Wenn srun innerhalb einer Jobzuweisung aufgerufen wird, werden parallele Aufgaben für einige oder alle zugewiesenen Ressourcen gestartet. In diesem Fall erbt srun standardmäßig die relevanten Optionen des sbatch oder salloc, unter dem es ausgeführt wird. Sie können dann (normalerweise) verschiedene Optionen für srun bereitstellen, die überschreiben, was standardmäßig empfangen wird. Jeder Aufruf von srun innerhalb eines Jobs wird als Jobschritt bezeichnet.

srun kann auch außerhalb einer Jobzuordnung aufgerufen werden. In diesem Fall fordert srun Ressourcen an und startet, wenn diese Ressourcen gewährt werden, Aufgaben über diese Ressourcen hinweg als einen einzelnen Job und Jobschritt.

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

doc / html / cpu_management.shtml


Weitere Informationen finden Sie auf der SLURM FAQ- Seite.

Der Befehl srun verfügt über zwei verschiedene Betriebsarten. Wenn es nicht in einem vorhandenen Job ausgeführt wird (dh nicht in einer von salloc oder sbatch erstellten Slurm-Jobzuordnung), wird zunächst eine Jobzuordnung erstellt und eine Anwendung erzeugt. Wenn der Befehl srun innerhalb einer vorhandenen Zuordnung ausgeführt wird, wird nur die Anwendung erzeugt. In dieser Frage werden wir nur den ersten Betriebsmodus behandeln und das Erstellen einer Jobzuordnung mit den Befehlen sbatch und srun vergleichen.

Der Befehl srun ist für die interaktive Verwendung vorgesehen, wobei jemand die Ausgabe überwacht. 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, und seine Ausgabe wird in eine Datei geschrieben. Die in der Jobzuweisung 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 besteht in der Fehlertoleranz. Fehler mit sbatch-Jobs führen normalerweise dazu, dass der Job angefordert und erneut 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.


Ein weiteres relevantes Gespräch hier

dkv
quelle