====== SLURM Benutzungsanleitung ====== ===== Der SLURM Workload Manager ===== SLURM (**S**imple **L**inux **U**tility for **R**esource **M**anagement) ist ein freies Open-Source System zum Management von Batchjobs und Ressourcen, welches es Nutzern des Clusters erlaubt, Aufgaben scriptgesteuert auf dem LUIS Clustersystem ablaufen zu lassen. SLURM ist ein modernes und erweiterbares Batchsystem, welches weltweit von HPC Clustern unterschiedlichster Größe eingesetzt wird. Im Folgenden wird die grundlegende Arbeit mit SLURM auf dem LUIS Clustersystem beschrieben. Detailliertere Informationen finden sich in der [[https://slurm.schedmd.com/documentation.html|offiziellen Dokumentation zu SLURM]]. Die folgenden Befehle sind nützlich, um mit SLURM zu interagieren: * **sbatch** - submit a batch script * **salloc** - allocate compute resources * **srun** - allocate compute resources and launch job-steps * **squeue** - check the status of running and/or pending jobs * **scancel** - delete jobs from the queue * **sinfo** - view intormation abount cluster nodes and partitions * **scontrol** - show detailed information on active and/or recently completed jobs, nodes and partitions * **sacct** - provide the accounting information on running and completed jobs Nachfolgend sind einige Beispiele aufgeführt. Weitere Informationen über den jeweiligen Befehl sind der entsprechenden Manpage, z.B. ''man squeue'', oder natürlich der [[https://slurm.schedmd.com/man_index.html|offiziellen SLURM Dokumentation]] zu entnehmen. ===== Partitionen ===== In SLURM sind Rechenknoten zu Partitionen gruppiert. Jede Partition kann als separate Warteschlange ("Queue") angesehen werden, obwohl ein Job in mehrere Partitionen geschickt werden und ein Rechenknoten mehreren Partitionen angehören kann. Jobs bekommen innerhalb einer Partition Ressourcen zugewiesen, um innerhalb einer bestimmten Zeit Aufgaben auf dem Cluster auszuführen. Zusätzlich existiert das Konzept der “job steps” in SLURM. Innerhalb eines Jobs können mit dem Befehl ''srun'' so genannte “job steps” gleichzeitig oder nacheinander abgearbeitet werden. Tabelle listet alle Partitionen mit den zugehörigen Parametern auf. Die aufgeführten Limits können durch Nutzer nicht überschritten werden. ^Partition name ^Max Job Runtime ^Max Nodes Per Job ^Max Number of Jobs per User ^Max CPUs per User ^Default Memory per CPU ^Shared Node Usage | |gpu |24 hours |1 |32 |no limit |1600 MB |yes | Um die Last auf dem Cluster zu im Rahmen und SLURM reaktionsfähig zu halten, bestehen die folgenden Beschränkungen für die Gesamtzahl an Jobs: ^SLURM limits ^Max Number of Running Jobs ^Max Number of Submitted Jobs | |Cluster wide |10000 |20000 | |Per User |64 |500 | Wenn Sie für Ihre Arbeit angepasste Limits benötigen, schicken Sie bitte eine Email mit kurzer Begründung an ''cluster-help@luis.uni-hannover.de''. Je nach den vorhandenen Ressourcen kann es möglich sein, auch spezielle Anforderungen für einige Zeit zu berücksichtigen, ohne die restliche Nutzerschaft über Gebühr zu benachteiligen. Um die für Sie gültigen Limits aufzulisten, verwenden Sie das Kommando ''sacctmgr''. Beispielsweise: sacctmgr -s show user sacctmgr -s show user format=user,account,maxjobs,maxsubmit,qos Eine Übersicht über alle gegenwärtig verfügbaren Rechenknoten erhalten Sie mit den folgenden Kommandos: sinfo -Nl scontrol show nodes Die verfügbaren Partitionen und ihre Konfiguration erhalten Sie mit: sinfo -s scontrol show partitions ===== Interaktive Jobs ===== Der Rechencluster wird normalerweise und am effizientesten im Batch-Modus verwendet. Interaktive Jobs sind ebenfalls möglich; diese können sinnvoll sein für Dinge wie z.B.: * working with an interactive terminal or GUI applications like R, iPython, ANSYS, MATLAB, etc. * software development, debugging, or compiling Eine interaktive Sitzung auf einem Rechenknoten starten Sie entweder mit ''salloc'' oder mit ''srun''. Im folgenden Beispiel wird ein interaktiver Job abgeschickt, welcher zwei Tasks (das entspricht zwei CPU-Kernen) und 4 GB Arbeitsspeicher für eine Stunde anfordert: [user@login02 ~]$ srun --time=1:00:00 --ntasks=2 --mem-per-cpu=4G --x11 --pty $SHELL -i srun: job 222 queued and waiting for resources srun: job 222 has been allocated resources [user@euklid-n001 ~]$ Sobald der Job startet, erhalten Sie eine interaktive Shell (eine “Kommandozeile”) auf dem ersten ihrem Job zugewiesenen Rechenknoten (''euklid-n001'' im obigen Beispiel). Die Option ''--x11'' erstellt eine X11-Umleitung auf diesen ersten Knoten, was die Nutzung grafischer Anwendungen ermöglicht. Die interaktive Sitzung wird beendet, indem die Shell verlassen wird. Eine interaktive Sitzung mit Zugriff auf GPU Ressourcen muss über das Kommando ''salloc'' gestartet werden. Das folgende Beispiel belegt für einen Zeitraum von zwei Stunden zwei GPUs pro Knoten: [user@login02 ~]$ salloc --time=2:00:00 --gres=gpu:2 salloc: Granted job allocation 228 salloc: Waiting for resource configuration salloc: Nodes euklid-n002 are ready for job Sobald eine Reservierung erstellt wurde, startet das Kommando ''salloc'' eine Shell auf dem **Loginknoten**, auf welchem der Job abgeschickt wurde. Um ihre Anwendung auf den zugewiesenen Rechenknoten zu starten (''euklid-n002'' im Beispiel), führen Sie entweder das ''srun''-Kommando in der Loginshell aus: [user@login02 ~]$ module load my_module [user@login02 ~]$ srun ./my_program … oder Sie verbinden sich via ssh mit den von Ihnen belegten Rechenknoten: [user@login02 ~]$ echo $SLURM_NODELIST # assigned compute node(s) euklid-n002 [user@login02 ~]$ ssh euklid-n002 [user@euklid-n002 ~]$ module load my_module [user@euklid-n002 ~]$ ./my_program Um die Sitzung zu beenden, geben Sie ''exit'' in der Loginshell ein: [user@login02 ~]$ exit exit salloc: Relinquishing job allocation 228 salloc: Job allocation 228 has been revoked. ===== Ein Batchscript abschicken ===== Ein SLURM Jobscript ist nichts anderes als ein Shellscript, welches im Beginn einen Satz spezieller Anweisungen (“Direktiven”) enthält. Direktiven sind durch die Zeichenkette ''#SBATCH'' am Zeilenbeginn zu erkennen. Dieses Batchscript wird dann mit dem Kommando ''sbatch'' an das Batchsystem übergeben. ==== Beispiel eines seriellen Jobs ==== Das folgende ist ein Beispiel eines einfachen seriellen Jobscripts (speichern Sie die Zeilen in die Datei ''test_serial.sh''). **Hinweis:** ändern Sie die ''#SBATCH''-Direktiven so ab, dass sie Ihrem Anwendungsfall entsprechen. #!/bin/bash #SBATCH --job-name=test_serial #SBATCH --ntasks=1 #SBATCH --mem-per-cpu=2G #SBATCH --time=00:20:00 #SBATCH --constraint=[skylake|haswell] #SBATCH --mail-user=user@uni-hannover.de #SBATCH --mail-type=BEGIN,END,FAIL #SBATCH --output test_serial-job_%j.out #SBATCH --error test_serial-job_%j.err # Change to my work dir cd $SLURM_SUBMIT_DIR # Load modules module load my_module # Start my serial app srun ./my_serial_app Um den Batchjob abzuschicken, verwenden Sie sbatch test_serial.sh **Hinweis:** sobald Rechenknoten für Ihren Job belegt wurden, können Sie sich per ''ssh'' von den Loginrechnern damit verbinden. **Hinweis:** wenn Ihr job versucht, mehr Ressourcen zu verwenden, als Sie mit den ''#SBATCH''-Direktiven angefordert haben, wird er automatisch vom SLURM-Server beendet. **Hinweis:** wir empfehlen, in Batchjobs die option ''#SBATCH --export=NONE'' zu setzen. Ansonsten übergibt SLURM die gegenwärtig gesetzten Umgebungsvariablen an den Job. Tabelle [[#tablesbatch_options|1.3]] zeigt häufig benutzte sbatch-Optionen, welche entweder im Jobscript über die ''#SBATCH''-Direktive oder auf der Kommandozeile angegeben werden können. Kommandozeilenoptionen überschreiben Optionen im Script. Die Kommandos ''srun'' und ''salloc'' akzeptieren die selben Optionen. sbatch/srun/salloc options. Both long and short options are listed ^Options ^ Default Value ^Description | |–nodes= or -N | 1 |Number of compute nodes | |–ntasks= or -n | 1 |Number of tasks to run | |–cpus-per-task= or -c | 1 |Number of CPU cores per task | |–ntasks-per-node= | 1 |Number of tasks per node | |–ntasks-per-core= | 1 |Number of tasks per CPU core | |–mem-per-cpu= | partition dependent |memory per CPU core in MB | |–mem= | partition dependent |memory per node in MB | |–gres=gpu:: | - |Request nodes with GPUs | |–time=