SLURM Batch-System

Wichtige Befehle

sbatch: Absenden von Batch-Jobs

Der Befehl sbatch dient dem Abschicken von Batchjobs. Hardware-Ressourcen werden über die #SBATCH-Direktiven definiert.
  • Bitte achten Sie unbedingt darauf, dass Sie genau die Ressourcen anfordern, die Ihr Skript später benötigt.
      • Wenn Sie 8 Rechenkerne anfordern und Ihr Programm nur seriell rechnet laufen 7 Kerne idle.
      • Wenn Sie nur einen Rechenkern anfordern und Ihr Programm 8-fach parallelisiert bremsen Sie sich oder andere Nutzer auf dem Rechenknoten aus.
  • Bei der walltime sollten Sie dagegen großzügiger sein. Hat Ihr Job 100 Stunden Rechenzeit angefordert aber nur 80 Stunden benötigt, so wird die Hardware sofort für den nächsten Job freigegeben.
  • Das Cluster ist in verschiedene Partitionen eingeteilt. Ihr Job wird anhand Ihrer Hardware-Anforderungen automatisch einer Partition zugewiesen.

SBATCH Option Beispiel Bemerkung
--ntasks --ntasks 32 Anzahl der MPI-Prozesse.
--cpus-per-task --cpus-per-task 8 Fordert die angegebene Zahl an Rechenkernen pro Task an.
--mem-per-cpu --mem-per-cpu 2000 Fordert den benötigten Arbeitsspeicher (in MB pro CPU-Core) an.
--time --time 4:00:00 Reserviert die Hardware-Ressourcen für die angebene Zeitdauer.
--gres --gres gpu:1 Reserviert generische Hardware-Ressourcen (hier: eine GPU).
Konkrete GPU-Modelle können über
--gres gpu:a100:1
--gres gpu:h100:1
angefordert werden.
--mail-type [BEGIN|END|FAIL|REQUEUE|ALL] --mail-type FAIL Definiert, ob und wann eine Benachrichtungsmail an den Nutzer verschickt werden soll.
--mail-user --mail-user name@tuhh.de TUHH E-Mail Adresse des Nutzers für Benachrichtungsmails. Externe E-Mail Adressen werden nicht unterstützt.
--time-min --time-min 1:00:00 SLURM startet den Job auch, wenn weniger Zeit als angefordert (--time) zur Verfügung steht, aber mindestens soviel wie hier angegeben. Sinnvoll für Anwendungen, die nahezu jederzeit unterbrechen können. Führt oft zu kürzeren Wartezeiten.
--test-only --test-only Schickt den Job nicht ab, sondern prüft auf syntaktische Korrektheit und schätzt, wann und wo der Job starten würde.

squeue: Jobs anzeigen

Der Befehl squeue listet die wartenden und laufenden Jobs auf. In der Manpage zu squeue finden sich vielfältige Möglichkeiten zur Ausgabeformatierung, insbesondere zur Ausgabe der erwarteten Startzeit und der Priorisierung des Jobs.

scancel: Jobs löschen

Mit scancel lassen sich eigene wartende und laufende Jobs löschen.

sview: grafisches Frontend

Alle Aufgaben können auch mit Hilfe des graphischen Frontends sview erledigt werden.


Umgebungsvariablen in SLURM

Oft möchte man zur Laufzeit des Batchskriptes auf Werte zugreifen, die beim Absenden des Batchjobs noch nicht bekannt sind, wie z.B. die Job ID.
SLURM bietet dafür eine Vielzahl an Umgebungsvariablen an (vgl. Manpage zu srun), etwa $SLURM_JOB_ID.


Modul-System und installierte Software

Das HPC-Cluster hat eine Reihe von gängigen wissenschaftlichen Anwendungsprogrammen vorinstalliert. Darüber hinaus kann nutzer-spezifische Software auch in das eigene Homeverzeichnis installiert werden.

Die meisten vorinstallierten Softwarepakete und Entwicklungstools sind über das Module-System zu erreichen. Eine Übersicht über die installierten Softwareversionen liefert das Kommando module avail.
Mit dem Subkommando module load kann eine bestimmte Software initialisiert werden, d.h. die Umgebungsvariablen werden so gesetzt, dass der Programmaufruf direkt über den Befehl erfolgen kann. So erlaubt z.B. module load matlab/2022b den Aufruf der Matlab-Version 2022b direkt über den Befehl matlab.
Mit module unload können gewählte Module wieder entfernt werden.

Abweichend davon kann Python entweder über das Anaconda-Modul oder über das system-seitig installierte Python (/usr/bin/python3) genutzt werden.

Die Nutzung der CFD-Software OpenFOAM erfolgt durch Starten eines herstellereigenen Skriptes und ist hier beschrieben.


Beispielskripte

SMP-paralleler Job

Mit dem folgenden Skript möchten wir eine Abaqus-Berechnung durchführen. Da FEM-Programme nicht sehr gut parallelisieren und oftmals intensives I/O aufweisen, fordern wir 8 Kerne auf einem Rechner an. Um unser Programm nicht durch langsames I/O auszubremsen rechnen wir auf der lokalen Festplatte unter /usertemp.
Es werden 5GB RAM pro Rechenkern, d.h. insgesamt 40GB RAM angefordert.

#!/bin/bash -l
#SBATCH --ntasks 1
#SBATCH --cpus-per-task 8
#SBATCH --mem-per-cpu 5000
#SBATCH --time=12:00:00

# Module initialisieren und Modul fuer Abaqus laden
. /etc/profile.d/module.sh
module load abaqus/2021

# Lokales Arbeitsverzeichnis anlegen
# grp und id ist an die Unix-Gruppe und Nutzername anzupassen !
MYWORKDIR=/usertemp/grp/id/$SLURM_JOBID
mkdir $MYWORKDIR

# Kopiere die Eingabedaten aus dem Verzeichnis, aus dem das Skript abgeschickt wurde,
# in das Arbeitsverzeichnis.
cp $SLURM_SUBMIT_DIR/Beispiel.inp $MYWORKDIR

# Ins Arbeitsverzeichnis wechseln und Rechnung starten
cd $MYWORKDIR
abaqus job=Beispiel input=Beispiel cpus=8 interactive

# Wichtige Ergebnisse zuruecksichern.
cp -r Beispiel.* $SLURM_SUBMIT_DIR

# Aufraeumen.
rm -rf $MYWORKDIR

exit
Man beachte, dass /usertemp auf den Login-Knoten und jedem Rechenknoten lokale (d.h. unterschiedliche) Verzeichnisse sind.

Deshalb werden die Eingabedaten erst zur Laufzeit des Jobs aus einem Netzwerkverzeichnis (z.B. dem Homeverzeichnis) auf die lokale Festplatte des Rechenknotens kopiert und die Ausgabedateien nach der Abaqus-Rechnung wieder dorthin zurückkopiert.

MPP-paralleler Job

Mit dem folgenden Skript möchten wir eine MPI-parallele Berechnung mit dem Programm my_program starten. Da das Programm knotenübergreifend rechnet nutzen wir als Arbeitsverzeichnis den Bereich unter /work.

#!/bin/bash -l
#SBATCH --ntasks 32
#SBATCH --cpus-per-task 1
#SBATCH --mem-per-cpu 2000
#SBATCH --time=12:00:00

# Module initialisieren und Modul fuer Intel (wegen Intel MPI) laden
. /etc/profile.d/module.sh
module load intel/2019

# Arbeitsverzeichnis im BeeGFS-Netzwerkdateisystem anlegen
# grp und id ist an die Unix-Gruppe und Nutzername anzupassen !
MYWORKDIR=/work/grp/id/$SLURM_JOBID
mkdir $MYWORKDIR

# Kopiere die Eingabedatei aus dem Homeverzeichnis in das Arbeitsverzeichnis
cp ~/Meine_Rechnung/eingabedatei $MYWORKDIR
cd $MYWORKDIR

# Erzeuge Hostfile, in dem steht wohin der Job verteilt werden soll
srun hostname > hostfile_$SLURM_JOBID

# Rechnung starten
mpirun -np 32 -machinefile hostfile_$SLURM_JOBID my_program

# Alle Ausgabedaten zurueck ins Homeverzeichnis sichern.
cp -r * ~/Meine_Rechnung/

# Aufraeumen.
rm -rf $MYWORKDIR

exit

GPU-Job

Mit dem folgenden Skript möchten wir eine Berechnung mit dem Programm gromacs mit 8 CPU-Kernen und einer Grafikkarte starten. In der Umgebungsvariable GPU_DEVICE_ORDINAL steht, welche Grafikkarte uns zugewiesen wurde.

#!/bin/bash -l
#SBATCH --ntasks 1
#SBATCH --cpus-per-task 8
#SBATCH --gres gpu:1
#SBATCH --mem-per-cpu 2000
#SBATCH --time 12:00:00

# Module initialisieren und Modul fuer Gromacs laden
. /etc/profile.d/module.sh
module load gromacs/4.6.5-gpu

# Lokales Arbeitsverzeichnis anlegen
# grp und id ist an die Unix-Gruppe und Nutzername anzupassen !
MYWORKDIR=/usertemp/grp/id/$SLURM_JOBID
mkdir $MYWORKDIR

# Kopiere die Eingabedatei aus dem Homeverzeichnis in das Arbeitsverzeichnis
cp ~/Gromacs_Rechnung/* $MYWORKDIR

# Ins Arbeitsverzeichnis wechseln und Rechnung starten
cd $MYWORKDIR
mdrun_mpi -ntomp 8 -v -s a.tpr -o a.trr -c a.pdb -e a.edr -g a.log

# Alle Ausgabedaten zurueck ins Homeverzeichnis sichern.
cp * ~/Gromacs_Rechnung/

# Aufraeumen.
rm -rf $MYWORKDIR

exit