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.
- Wenn Sie 8 Rechenkerne anfordern und Ihr Programm nur seriell rechnet laufen 7 Kerne idle.
- 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 |
--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 scancelsview: 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 unterhalb von $SCRATCH anlegen MYWORKDIR=$SCRATCH/$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 exitMan beachte, dass $SCRATCH 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 SSD 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 unterhalb von $WORK anlegen MYWORKDIR=$WORK/$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 unterhalb von $SCRATCH anlegen MYWORKDIR=$SCRATCH/$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