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=publicAlle Rechner sollen aus der Partition "public" kommen. Mehr dazu unter "Batchbetrieb mit SLURM". Default: public
#SBATCH --nodes=22 Rechner werden benötigt
#SBATCH --tasks-per-node=44 der CPUs werden von jedem Rechner benötigt
#SBATCH --mem=10001000 MB Hauptspeicher pro Rechner werden benötigt (21000 MB * Anzahl allokierte CPUs maximal). Nicht mit "--mem-per-cpu" kombinierbar!
#SBATCH --mem-per-cpu=100Mindestens 100 MB Hauptspeicher werden pro CPU benötigt (21000 MB maximal), nicht mit "--mem" kombinierbar!
#SBATCH --time=0:01:00Der 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=12coresNodes bei denen das Feature "12 Prozessorkerne" eingetragen ist. Mit sinfo --format="%20P %.40f" wird eine Liste mit allen definierten Features angezeigt.
#SBATCH --exclusiveRechnersysteme werden exklusiv benötigt, keine gemeinsame Nutzung mit anderen Jobs. Sparsam einsetzen.
#SBATCH --nodelist=its-cs104Die Maschine its-cs104 wird benötigt.Weiterer Beispielwert: its-cs[266,271-274,302]
#SBATCH –output=filenameProgrammausgaben sollen in die angegebene Datei geschrieben werden.
#SBATCH –error=filenameFehlerausgaben sollen in die angegebene Datei geschrieben werden.
#SBATCH --mail-type=BEGIN|END|FAIL|REQUEUE|ALLE-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:

  1. Die Jobnummer erscheint auf der Konsole
  2. Der Job wartet in einer Warteschlange, bis er abgearbeitet wird
  3. Die Ausgabedatei slurm.12345678.out wird im Verzeichnis des Submit-Scripts abgelegt
  4. 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
#SBATCH --job-name=hello_openmp
#SBATCH --output=slurm.%N.%j.out
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=4
#SBATCH --time=10:00
#SBATCH --mem-per-cpu=100
#SBATCH --partition=public

./hello_openmp


Die Ausgabe des Programm lautet:

Hello World from thread 0
Hello World from thread 1
Hello World from thread 3
Hello World from thread 2
There are 4 threads

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

#SBATCH --job-name=hello_mpi
#SBATCH --output=slurm.%N.%j.out
#SBATCH --error=slurm.%N.%j.err
#SBATCH --nodes=2
#SBATCH --ntasks-per-node=2
#SBATCH --time=10:00
#SBATCH --mem-per-cpu=100
#SBATCH --partition=exec

mpirun ./hello_mpi


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
Hello world from processor its-cs240.its.uni-kassel.de, rank 0 out of 4 processors
Hello world from processor its-cs241.its.uni-kassel.de, rank 3 out of 4 processors
Hello world from processor its-cs241.its.uni-kassel.de, rank 2 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
#SBATCH --job-name="hello_hybrid"
#SBATCH -o slurm.%j.out
#SBATCH -e slurm.%j.out

#SBATCH -N 2 #SBATCH --mem 100
#SBATCH -t 0-00:10
#SBATCH --mail-type=END
#SBATCH --mail-type=FAIL
#SBATCH --mail-user=uk123456@uni-kassel.de


####### Parallelism #######
#SBATCH --cpus-per-task=16
#SBATCH --ntasks=2
export OMP_NUM_THREADS=16
echo "Used nodes:" $SLURM_NODELIST

mpirun ./hello_hybrid


Die Ausgabe des Programm lautet:

Used nodes: its-cs[300,302]
There are 2 processes in total
There are 16 threads of process 0 on its-cs300.its.uni-kassel.de
Hello World from thread 0 from process 0 on node its-cs300.its.uni-kassel.de
Hello World from thread 8 from process 0 on node its-cs300.its.uni-kassel.de
Hello World from thread 12 from process 0 on node its-cs300.its.uni-kassel.de
Hello World from thread 14 from process 0 on node its-cs300.its.uni-kassel.de
Hello World from thread 3 from process 0 on node its-cs300.its.uni-kassel.de
Hello World from thread 1 from process 0 on node its-cs300.its.uni-kassel.de
Hello World from thread 4 from process 0 on node its-cs300.its.uni-kassel.de
Hello World from thread 10 from process 0 on node its-cs300.its.uni-kassel.de
Hello World from thread 6 from process 0 on node its-cs300.its.uni-kassel.de
Hello World from thread 11 from process 0 on node its-cs300.its.uni-kassel.de
Hello World from thread 2 from process 0 on node its-cs300.its.uni-kassel.de
Hello World from thread 9 from process 0 on node its-cs300.its.uni-kassel.de
Hello World from thread 13 from process 0 on node its-cs300.its.uni-kassel.de
Hello World from thread 7 from process 0 on node its-cs300.its.uni-kassel.de
Hello World from thread 15 from process 0 on node its-cs300.its.uni-kassel.de
Hello World from thread 5 from process 0 on node its-cs300.its.uni-kassel.de
There are 16 threads of process 1 on its-cs302.its.uni-kassel.de
Hello World from thread 0 from process 1 on node its-cs302.its.uni-kassel.de
Hello World from thread 10 from process 1 on node its-cs302.its.uni-kassel.de
Hello World from thread 11 from process 1 on node its-cs302.its.uni-kassel.de
Hello World from thread 15 from process 1 on node its-cs302.its.uni-kassel.de
Hello World from thread 5 from process 1 on node its-cs302.its.uni-kassel.de
Hello World from thread 13 from process 1 on node its-cs302.its.uni-kassel.de
Hello World from thread 9 from process 1 on node its-cs302.its.uni-kassel.de
Hello World from thread 7 from process 1 on node its-cs302.its.uni-kassel.de
Hello World from thread 3 from process 1 on node its-cs302.its.uni-kassel.de
Hello World from thread 14 from process 1 on node its-cs302.its.uni-kassel.de
Hello World from thread 6 from process 1 on node its-cs302.its.uni-kassel.de
Hello World from thread 8 from process 1 on node its-cs302.its.uni-kassel.de
Hello World from thread 4 from process 1 on node its-cs302.its.uni-kassel.de
Hello World from thread 2 from process 1 on node its-cs302.its.uni-kassel.de
Hello World from thread 1 from process 1 on node its-cs302.its.uni-kassel.de
Hello World from thread 12 from process 1 on node its-cs302.its.uni-kassel.de

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
#SBATCH --job-name=job-array
#SBATCH --output=slurm.%N.%j.out
#SBATCH --ntasks=1
#SBATCH --array=10-100:10
#SBATCH --time=01:00
#SBATCH --mem-per-cpu=10
#SBATCH --partition=minijobs

echo "SLURM_ARRAY_TASK_ID: "$SLURM_ARRAY_TASK_ID ./myprogram $SLURM_ARRAY_TASK_ID

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'
1-3 bash -c 'printenv SLURM_PROCID'

Beispiel 5-2: myscript_master_slave.sh

#!/bin/bash
#SBATCH --job-name=master_slave
#SBATCH --output=slurm.%N.%j.out
#SBATCH --ntasks=4
#SBATCH --time=10:00
#SBATCH --mem-per-cpu=100

srun --multi-prog multi.conf


Die Ausgabe des Programms ist in der definierten Output-Datei zu finden:

I am the Master
3
1
2