Submit-Scripte erstellen
Submit-Skript erstellen
Ein Submit-Skript ist ein Shell-Skript, mit welchem ein Rechenauftrag an den Linux Cluster übergeben wird. Kommentare beginnen mit dem #-Zeichen (# am Zeilenanfang). Zeilen, die mit #SBATCH beginnen, werden von SLURM als Parameter zur Ressourcenanforderung und anderen Submit-Skript-Optionen interpretiert. Während es in dieser Anleitung nur um die Erstellung eines Submit-Skrits geht, wird im nächsten Kapitel Programme im Batchbetrieb starten gezeigt, wie dieses gestartet wird und die Ergebnisse angezeigt werden.
In der folgenden Tabelle werden die gängigsten Parameter mit einer kurzen Erläuterung gelistet.
sbatch
Kommando | Beschreibung |
---|---|
#SBATCH --partition=public | Alle Rechner sollen aus der Partition "public" kommen. Mehr dazu unter "Batchbetrieb mit SLURM". Default: public |
#SBATCH --nodes=2 | 2 Rechner werden benötigt |
#SBATCH --tasks-per-node=4 | 4 der CPUs werden von jedem Rechner benötigt |
#SBATCH --mem=1000 | 1000 MB Hauptspeicher pro Rechner werden benötigt (21000 MB * Anzahl allokierte CPUs maximal). Nicht mit "--mem-per-cpu" kombinierbar! |
#SBATCH --mem-per-cpu=100 | Mindestens 100 MB Hauptspeicher werden pro CPU benötigt (21000 MB maximal), nicht mit "--mem" kombinierbar! |
#SBATCH --time=0:01:00 | Der Job wird maximal 1 Minute benötigen. Wird der Wert überschritten, wird der Job abgebrochen. Das Maximum ist paritions-abhängig. Format hh:mm:ss |
#SBATCH --constraint=12cores | Nodes bei denen das Feature "12 Prozessorkerne" eingetragen ist. Mit sinfo --format="%20P %.40f" wird eine Liste mit allen definierten Features angezeigt. |
#SBATCH --exclusive | Rechnersysteme werden exklusiv benötigt, keine gemeinsame Nutzung mit anderen Jobs. Sparsam einsetzen. |
#SBATCH --nodelist=its-cs104 | Die Maschine its-cs104 wird benötigt.Weiterer Beispielwert: its-cs[266,271-274,302] |
#SBATCH –output=filename | Programmausgaben sollen in die angegebene Datei geschrieben werden. |
#SBATCH –error=filename | Fehlerausgaben sollen in die angegebene Datei geschrieben werden. |
#SBATCH --mail-type=BEGIN|END|FAIL|REQUEUE|ALL | E-Mail beim Start, Ende, Abbruch, Requeue oder alle Status-Änderungen des Jobs. Nur eine Option pro Zeile verwenden. |
#SBATCH --mail-user=[Ihre Emailadresse] | E-Mail Adresse für Benachrichtigungen. |
#SBATCH --job-name="MeinJob" | Dem Job einen Namen geben. Mehrere Jobs können den selben Namen haben. Der Jobname kann z.B. im Submit-Script mit %N verwendet werden, um die .out Datei zu benennen. Man kann auch mit scancel <Jobname> alle Jobs mit dem angegebenen Jobnamen gleichzeitig abbrechen. |
In folgendem Beispiel wird ein Knoten in der Partition public mit 100 MB Hauptspeicher für 5 Minuten allokiert. Am Ende des Skripts wird gewöhnlich ein Programm gestartet. In unserem Fall wird nur Beispielhaft der Name des Servers ausgegeben, auf dem das Programm ausgeführt worden ist.
Beispiel 1: myscript.sh | |
---|---|
#!/bin/bash | |
#SBATCH --partition=public | # Partition public |
#SBATCH --nodes=1 | # 1 Node wird benötigt |
#SBATCH --tasks-per-node=1 | # Anzahl Tasks |
#SBATCH --mem=100 | # 100 MB Hauptspeicher |
#SBATCH --time=0:05:00 | # max. Laufzeit 5 min |
#SBATCH --output=slurm.%j.out | # Datei für stdout |
#SBATCH --error=slurm.%j.err | # Datei für stderr # (%N: Nodename, %j: Job-Nr.) |
#SBATCH --mail-type=END | # Benachrichtigung bei Ende |
#SBATCH --mail-type=FAIL | # Benachrichtigung bei Fehler |
#SBATCH --mail-user=user@host.de | # EMail Adresse |
echo "Hello from `hostname`" | # Programm ausfuehren |
Sie können dieses Submit-Script nun zum Testen im Batchbetrieb starten. Es sollte folgendes passieren:
- Die Jobnummer erscheint auf der Konsole
- Der Job wartet in einer Warteschlange, bis er abgearbeitet wird
- Die Ausgabedatei slurm.12345678.out wird im Verzeichnis des Submit-Scripts abgelegt
- Sie erhalten eine EMail, dass der Job beendet wurde
Wenn Sie die Datei z.B. mit cut slurm.12345678.out ausgeben, sollte darin der Name des Knotens erscheinen, der den Job ausgeführt hat.
Sie können für die Ausgabe des Programm und die Ausgabe der Fehlermeldungen auch die gleiche Datei angeben. Hat Ihr Programm ohnehin nicht viele Ausgaben, kann das übersichtlicher sein.
Submit-Skript Generator
Mit dem Skript Generator ist es möglich, sich Submit-Skripte passend zum Linux Cluster Kassel generieren zu lassen. Sie können die Vorgabe dann durch das Laden von Modulen und das Starten Ihres Programms erweitern.
Im linken Bereich befinden sich aufklappbare Elemente in denen spezielle Ressourcenanforderungen oder Job Informationen angegeben werden können. Der im rechten Bereich erzeugte Code kann per Copy&Paste in ein Shell-Skript eingefügt werden. Es ist natürlich erforderlich das Skript mit dem Befehl für den Aufruf Ihres eigenen Programms o.ä. zu erweitern.
Parallele Jobs
Es gibt verschiedene Möglichkeiten parallele Jobs zu erstellen, dessen Prozesse simultan abgearbeitet werden:
- MPI-Applikation
- Multithread-Programm mit OpenMP
- mehrere Instanzen eines Single-Thread-Programms
Tasks und Prozesse
Für den Workload Manager SLURM ist ein Task ein Prozess. Ein multi-process program besteht aus mehreren Tasks wobei ein multithreaded program nur aus einem Task besteht, dass mehrere CPUs nutzten kann.
Die Option --ntasks erzeugt eine Anzahl an Tasks in einem multi-process program. CPUs werden hingegen für multithreaded programs mit --cpus-per-task angefordert. Tasks können nicht auf mehrere Knoten eines Clusters verteilt werden. Die Option --cpu-per-task würde also mehrere CPUs auf ein und dem selben Knoten allokieren. Im Gegensatz dazu würde --ntasks mehrere CPUs auf unterschiedlichen Knoten anfordern.
Submit-Skript für OpenMP
Hier werden vier Cores für einen Task allokiert. Das Skript hello_openmp.c wird mit gcc -fopenmp hello_openmp.c -o hello_openmp kompiliert und am Ende des Submit-Skripts mit ./hello_openmp aufgerufen:
Beispiel 3: myscript_openmp.sh |
---|
#!/bin/bash |
Die Ausgabe des Programm lautet:
Hello World from thread 0 |
Submit-Skript für MPI
Im folgenden Beispiel werden 2 Rechenknoten mit jeweils 100 MB pro CPU für zehn Minuten in der Partition exec allokiert. Auf den zwei Knoten werden jeweils zwei Prozesse ausgeführt. Das Programm hello_mpi.c wurde zuvor mit mpicc hello_mpi.c -o hello_mpi kompiliert (Compiler lassen sich mit Hilfe des Modulsystems auf dem Cluster ändern) und am Ende des Skripts mit mpirun gestartet:
Beispiel 2: myscript_mpi.sh |
---|
#!/bin/bash |
Die Ausgabe des Programms könnte wie folgt aussehen:
Hello world from processor its-cs240.its.uni-kassel.de, rank 1 out of 4 processors |
Tipp: Sie können die Ausgabe aller beteidigten Nodes auch durch den Befehl echo "Maschinenliste:" $SLURM_NODELIST direkt im Submit-Script erreichen.
Submit-Skript für OpenMP mit MPI (hybrid)
Wenn ein Programm OpenMP sowie MPI nutzt, muss natürlich beides im SubmitScript definiert werden. Das Programm hello_hybrid.c wird hierbei mit mpicc -fopenmp hello_hybrid.c -o hello_hybrid compiliert. Im folgenden Beispiel werden für das Programm 2 Nodes (MPI Prozesse) angefordert, von denen wiederum jeweils 4 Threads (OpenMP Threads) verwendet werden.
Beispiel 4: hybrid_submitscript.sh |
---|
#!/bin/bash |
Die Ausgabe des Programm lautet:
Used nodes: its-cs[300,302] |
Job Array
Mit Hilfe des Job Arrays ist es möglich, eine Vielzahl von Jobs gleicher Prozesse mit unterschiedlichen Parametern oder Übergabe-Dateien auszuführen. Nachdem Ausführen des Submit-Skripts wird eine bestimmte Anzahl von "Array Tasks" erstellt, bei der die Variable SLURM_ARRAY_TASK_ID einen eindeutigen Wert besitzt. Der Wert wird über den Index (#SBATCH --array=<index>) angegeben.
Im folgenden Skript werden zehn Array-Tasks mit den Indizes 10, 20, ... , 100 erstellt. Am Ende eines jeden Array-Task wird dem auszuführenden Programm die Variable $SLURM_ARRAY_TASK_ID, die den Index als Wert besitzt, als Parameter übergeben:
Beispiel 4: myscript_job_array.sh |
---|
#!/bin/bash |
Master/Slave
Ein Master/Slave-Betrieb kann ebenfalls mit SLURM realisiert werden. SLURM erstellt mehrere Tasks, denen mit einer weiteren Konfigurationsdatei verschiedene Kommandos zugewiesen werden können:
Beispiel 5-1: multi.conf |
---|
0 echo 'I am the Master' |
Beispiel 5-2: myscript_master_slave.sh |
---|
#!/bin/bash |
Die Ausgabe des Programms ist in der definierten Output-Datei zu finden:
I am the Master |