User Tools

Site Tools


de:guide:slurm_usage_guide

SLURM Benutzungsanleitung

Der SLURM Workload Manager

SLURM (Simple Linux Utility for Resource Management) 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 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 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 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=<N> or -N <N> 1 Number of compute nodes
–ntasks=<N> or -n <N> 1 Number of tasks to run
–cpus-per-task=<N> or -c <N> 1 Number of CPU cores per task
–ntasks-per-node=<N> 1 Number of tasks per node
–ntasks-per-core=<N> 1 Number of tasks per CPU core
–mem-per-cpu=<mem> partition dependent memory per CPU core in MB
–mem=<mem> partition dependent memory per node in MB
–gres=gpu:<type>:<N> - Request nodes with GPUs
–time=<time> or -t <time> partition dependent Walltime limit for the job
–partition=<name> or -p <name> none Partition to run the job
–constraint=<list> or -C <list> none Node-features to request
–job-name=<name> or -J <name> job script’s name Name of the job
–output=<path> or -o <path> slurm-%j.out Standard output file
–error=<path> or -e <path> slurm-%j.err Standard error file
–mail-user=<mail> your account mail User’s email address
–mail-type=<mode> - Event types for notifications
–exclusive nodes are shared Exclusive acccess to node

Eine vollständige Liste der Parameter finden Sie in der sbatch man page: man sbatch

Hinweis: ein mit –mem=0 abgeschickter Job erhält Zugriff auf den vollständigen Speicher der belegten Knoten.

Als Voreinstellung werden die stdout- und stderr-Dateideskriptoren eines Batchjobs in die Dateien slurm-%j.out und slurm-%j.err umgeleitet. Dabei wird für %j die SLURM Batchjob-ID Ihres Jobs eingesetzt. Beide Dateien werden in dem Verzeichnis erstellt, in welchem Sie Ihren Job abgeschickt haben. Mit den Optionen –output und –error können Sie andere Namen bzw. Verzeichnisse angeben. Die Ausgabedateien werden erstellt, sobald der Job startet, und die Ausgabe wird umgeleitet, während der Job läuft, so dass sie seinen Fortschritt verfolgen können. Da SLURM allerdings die Daten aus Effizienzgründen puffert und nur gelegentlich wegschreibt, werden Sie die Augaben Ihres Jobs nicht unmittelbar sehen. Um dieses Verhalten zu ändern, können Sie entweder im Script oder auf der Kommandozeile -u oder –unbuffered verwenden. Wir empfehlen, das NICHT allgemein zu tun, besonders dann nicht, wenn der Job große Datenmengen ausgibt.

Falls die Option –error nicht angegeben wird, werden stdout und stderr in die Datei umgeleitet, welche durch –output bestimmt wurde.

Beispiel eines OpenMP jobs

Für OpenMP jobs müssen Sie –cpus-per-task auf einen Wert größer eins setzen und zusätzlich die Variable OMP_NUM_THREADS definieren. Das Beispielscript startet acht Threads mit jeweils 2 GiB Speicher und einer maximalen Laufzeit von 30 Minuten.

#!/bin/bash
#SBATCH --job-name=test_openmp
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=8
#SBATCH --mem-per-cpu=2G
#SBATCH --time=00:30:00
#SBATCH --constraint=[skylake|haswell]
#SBATCH --mail-user=user@uni-hannover.de
#SBATCH --mail-type=BEGIN,END,FAIL
#SBATCH --output test_openmp-job_%j.out
#SBATCH --error test_openmp-job_%j.err
 
# Change to my work dir
cd $SLURM_SUBMIT_DIR
 
# Bind your OpenMP threads
export OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK
export KMP_AFFINITY=verbose,granularity=core,compact,1
export KMP_STACKSIZE=64m
 
## Load modules
module load my_module
 
# Start my application
srun ./my_openmp_app

Das srun-Kommando im Skript oben startet die Umgebung für eine Anwendung auf mehreren CPU-Kernen, aber auf einem Knoten. Für MPI Jobs werden Sie möglicherweise mehrere CPU-Kerne auf mehreren Knoten verwenden. Dazu sehen Sie sich das folgende Beispiel für einen MPI-Job an.

Hinweis: Statt der “traditionell üblichen” MPI-Startprogramme wie mpirun oder mpiexec sollte immer srun Verwendung finden.

Beispiel eines MPI Jobs

In diesem Beispiel werden auf dem Lena-Cluster 10 Rechenknoten mit jeweils 16 CPU-Kernen und insgesamt 320 GiB Speicher für einen Zeitraum von maximal 2 Stunden angefordert.

#!/bin/bash
#SBATCH --job-name=test_mpi
#SBATCH --partition=lena
#SBATCH --nodes=10
#SBATCH --ntasks-per-node=16
#SBATCH --mem-per-cpu=2G
#SBATCH --time=02:00:00
#SBATCH --mail-user=user@uni-hannover.de
#SBATCH --mail-type=BEGIN,END,FAIL
#SBATCH --output test_mpi-job_%j.out
#SBATCH --error test_mpi-job_%j.err
 
# Change to my work dir
cd $SLURM_SUBMIT_DIR
 
# Load modules
module load foss/2018b
 
# Start my MPI application
srun --cpu_bind=cores --distribution=block:cyclic ./my_mpi_app

Wie oben erwähnt sollten Sie statt mpirun oder mpiexec besser srun verwenden, um Ihre parallele Anwendung zu starten.

Innerhalb des selben MPI-Jobs können Sie srun benutzen, um mehrere Anwendungen gleichzeitig zu starten, wobei jede nur einen Teil der reservierten Ressourcen benutzt. Die bevorzugte Methoden ist es allerdings, ein Job Array zu verwenden (siehe Abschnitt ). Das folgende Beispielscript startet gleichzeitig 3 MPI Programme, die jeweils 64 Tasks verwenden (4 Knoten, jeweils 16 Cores), insgesamt also 192 Tasks:

#!/bin/bash
#SBATCH --job-name=test_mpi
#SBATCH --partition=lena
#SBATCH --nodes=12
#SBATCH --ntasks-per-node=16
#SBATCH --mem-per-cpu=2G
#SBATCH --time=00:02:00
#SBATCH --constraint=[skylake|haswell]
#SBATCH --mail-user=user@uni-hannover.de
#SBATCH --mail-type=BEGIN,END,FAIL
#SBATCH --output test_mpi-job_%j.out
#SBATCH --error test_mpi-job_%j.err
 
# Change to my work dir
cd $SLURM_SUBMIT_DIR
 
# Load modules
module load foss/2018b
 
# Start my MPI application
srun --cpu_bind=cores --distribution=block:cyclic -N 4 --ntasks-per-node=16 ./my_mpi_app_1 &
srun --cpu_bind=cores --distribution=block:cyclic -N 4 --ntasks-per-node=16 ./my_mpi_app_1 &
srun --cpu_bind=cores --distribution=block:cyclic -N 4 --ntasks-per-node=16 ./my_mpi_app_2 &
wait

Beachten Sie das wait-Kommando im Script; dieses bewirkt, dass das Script so lange wartet, bis alle zuvor mit $&$ (Ausführung im Hintergrund) abgeschickten Kommandos beendet sind. Wir bitten höflich darum darauf zu achten, dass die für die Ausführung jedes Einzelkommandos benötigte Zeit nicht zu unterschiedlich zu den anderen ist, damit nicht zu viel wertvolle CPU-Zeit verschwendet wird.

Jobarrays

Jobarrays können verwendet werden, um mehrere Jobs mit den selben Ressourcenanforderungen abzuschicken. Um ein Jobarray zu verwenden, benutzen Sie die Direktive #SBATCH –array im Jobscript bzw. die Option –array oder -a auf der Kommandozeile von sbatch. Das folgende Script erstellt 12 Jobs mit den Arrayindizes 1 bis 10, 15 und 18:

#!/bin/bash
#SBATCH --job-name=test_job_array
#SBATCH --ntasks=1
#SBATCH --mem-per-cpu=2G
#SBATCH --time=00:20:00
#SBATCH --mail-user=user@uni-hannover.de
#SBATCH --mail-type=BEGIN,END,FAIL
#SBATCH --array=1-10,15,18
#SBATCH --output test_array-job_%A_%a.out
#SBATCH --error test_array-job_%A_%a.err
 
# Change to my work dir
cd $SLURM_SUBMIT_DIR
 
# Load modules
module load my_module
 
# Start my app
srun ./my_app $SLURM_ARRAY_TASK_ID

Innerhalb eines Jobscripts wie im obigen Beispiel können Arrayindizes über die Variable $SLURM_ARRAY_TASK_ID abgefragt werden. Die Variable $SLURM_ARRAY_JOB_ID hingegen enthält die Job ID des gesamten Job-Arrays. Falls Sie die Anzahl maximal gleichzeitig laufender Jobs innerhalb eines Arrays begrenzen wollen, – z.B. wegen umfangreicher Datentransfers zum/vom dem BIGWORK Dateisystem – können Sie das mit dem %-Trennzeichen tun. Beispiel: die Direktive #SBATCH –array 1-50%5 erzeugt 50 Jobs, wovon nur jeweils fünf zu jeder Zeit gleichzeitig aktiv sind.

Hinweis: Die maximale Anzahl der Jobs in einem Job-Array ist auf 100 begrenzt.

Umgebungsvariablen von SLURM

SLURM setzt etliche Umgebungsvariablen für die unter seiner Kontrolle laufenden Jobs. Tabelle 1.4 zeigt häufig verwendete Umgebungsvariablen, die sich als nützlich in Ihren Job Scripts erweisen könnten. Eine vollständige Liste finden Sie untr der Überschrift “OUTPUT ENVIRONMENT VARIABLES” in der man page von sbatch.

SLURM environment variables

$SLURM_JOB_ID Job id
$SLURM_JOB_NUM_NODE Number of nodes assigned to the job
$SLURM_JOB_NODELIST List of nodes assigned to the job
$SLURM_NTASKS Number of tasks in the job
$SLURM_NTASKS_PER_CORE Number of tasks per allocated CPU
$SLURM_NTASKS_PER_NODE Number of tasks per assigned node
$SLURM_CPUS_PER_TASK Number of CPUs per task
$SLURM_CPUS_ON_NODE Number of CPUs per assigned node
$SLURM_SUBMIT_DIR Directory the job was submitted from
$SLURM_ARRAY_JOB_ID Job id for the array
$SLURM_ARRAY_TASK_ID Job array index value
$SLURM_ARRAY_TASK_COUNT Number of jobs in a job array
$SLURM_GPUS Number of GPUs requested

GPU-Jobs auf dem Cluster

Einige der Knoten im LUIS-Cluster sind mit NVIDIA Tesla GPU-Karten ausgestattet.

Derzeit sind 4 Dell-Rechner mit jeweils 2 NVIDIA Tesla V100 für die allgemeine Benutzung in der Partition gpu zugelassen.

Mit diesem Kommando können Sie sich den gegenwärtigen Status aller Knoten in der gpu-Partition und die von ihnen bereit gestellten Ressourcen einschließlich Typ und Anzahl der installierten GPUs anzeigen lassen:

 $ sinfo -p gpu -NO nodelist:15,memory:8,disk:10,cpusstate:15,gres:20,gresused:20
  NODELIST      MEMORY  TMP_DISK  CPUS(A/I/O/T)  GRES                GRES_USED
  euklid-n001   128000  291840    32/8/0/40      gpu:v100:2(S:0-1)   gpu:v100:2(IDX:0-1)
  euklid-n002   128000  291840    16/24/0/40     gpu:v100:2(S:0-1)   gpu:v100:1(IDX:0)
  euklid-n003   128000  291840    0/40/0/40      gpu:v100:2(S:0-1)   gpu:v100:0(IDX:N/A)
  euklid-n004   128000  291840    0/40/0/40      gpu:v100:2(S:0-1)   gpu:v100:0(IDX:N/A)

Um eine GPU-Ressource anzufordern, müssen Sie Ihrem Job Script (bzw. auf der Kommandozeile) die Direktive #SBATCH –gres=gpu:<type>:n hinzufügen. Dabei stellt “n” die Anzahl der gewünschten GPUs dar. Die Angabe des Typs der gewünschten GPU (<type>) kann weg gelassen werden. Das folgende Jobscript fordert 2 Tesla V100 GPUs, 8 CPUs in der gpu-Partition und 30 Minutes Laufzeit an:

#!/bin/bash
#SBATCH --job-name=test_gpu
#SBATCH --partition=gpu
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=8
#SBATCH --gres=gpu:v100:2
#SBATCH --mem-per-cpu=2G
#SBATCH --time=00:30:00
#SBATCH --mail-user=user@uni-hannover.de
#SBATCH --mail-type=BEGIN,END,FAIL
#SBATCH --output test_gpu-job_%j.out
#SBATCH --error test_gpu-job_%j.err
 
# Change to my work dir
cd $SLURM_SUBMIT_DIR
 
# Load modules
module load fosscuda/2018b
 
# Run GPU application
srun ./my_gpu_app

Wenn Sie einen Job in die gpu-Partition schicken, müssen Sie die Anzahl der GPUs angeben. Ansonsten wird Ihr Job unmittelbar beim Abschicken zurückgewiesen.

Hinweis: Auf den Tesla V100-Knoten dürfen Sie derzeit nur bis zu 20 CPUs für jede angeforderte GPU anfordern.

Kommandos für Jobsteuerung und -statusabfragen

Dieser Abschnitt gibt einen Überblick über oft zur Steuerung und Überwachung von Jobs verwendete SLURM-Kommandos.

Abfragekommandos

Den Status Ihrer Jobs in der Warteschlange können Sie mit dem folgenden Kommando abfragen:

 $ squeue

oder – falls Sie Arrayjobs verwenden und jeweils ein Element eines Jobarrays pro Zeile anzeigen lassen wollen –

 $ squeue -a

Beachten Sie, dass das Dollarzeichen $ für das Shellprompt steht und kein Bestandteil des eigentlichen Kommandos ist. Sie sollten das Dollarzeichen $ also NICHT selbst eingeben.

Die Ausgabe von squeue sollte mehr oder weniger aussehen wie dieses Beispiel:

 $ squeue
  JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
    412       gpu     test username PD       0:00      1 (Resources)
    420       gpu     test username PD       0:00      1 (Priority)
    422       gpu     test username  R      17:45      1 euklid-n001
    431       gpu     test username  R      11:45      1 euklid-n004
    433       gpu     test username  R      12:45      1 euklid-n003
    434       gpu     test username  R       1:08      1 euklid-n002
    436       gpu     test username  R      16:45      1 euklid-n002

ST verweist auf den Status Ihres Jobs. JOBID wird vom System verwendet, um Ihren Job zu identifizieren. NODELIST zeigt die dem Job zugewiesenen Knoten, NODES die Anzahl der angeforderten Knoten und – für Jobs im Wartezustand (PD) – einen Grund (REASON) für den Zustand. TIME zeigt die vom Job verbrauchte Zeit. Typische Jobstati sind: wartet (PENDING(PD)), läuft (RUNNING(R)), beende/durchgelaufen (COMPLETING(CG)), abgebrochen (CANCELLED(CA)), gescheitert (FAILED(F)) und pausiert (SUSPENDED(S)). Eine vollständige Liste der Zustände finden Sie im Abschnitt “JOB STATE CODES” der squeue man page.

Sie können das Ausgabeformat und welche Inhalte angezeigt werden mit der Option –format bzw. -o beeinflussen. Wenn Sie z. B. zusätzlich die Anzahl der CPUs und die angeforderte WallTime anzeigen lassen wollen:

 $ squeue --format="%.7i %.9P %.5D %.5C %.2t %.19S %.8M %.10l %R"
  JOBID PARTITION NODES  CPUS TRES_PER_NODE ST MIN_MEMORY     TIME TIME_LIMIT NODELIST(REASON)
    489       gpu     1    32         gpu:2 PD         2G     0:00      20:00 (Resources)
    488       gpu     1     8         gpu:1 PD         2G     0:00      20:00 (Priority)
    484       gpu     1    40         gpu:2  R         1G    16:45      20:00 euklid-n001
    487       gpu     1    32         gpu:2  R         2G    11:09      20:00 euklid-n004
    486       gpu     1    32         gpu:2  R         2G    12:01      20:00 euklid-n003
    485       gpu     1    16         gpu:2  R         1G    16:06      20:00 euklid-n002

Sie können das Ausgabeformat von squeue standarmäßig ändern, indem Sie in Ihrer $HOME/.bashrc-Datei die Formatangabe der Umgebungsvariable SQUEUE_FORMAT zuweisen:

 $ echo 'export SQUEUE_FORMAT="%.7i %.9P %.5D %.5C %.13b %.2t %.19S %.8M %.10l %R"'>> ~/.bashrc

Die Option %.13b in der Variablenzuweisung an SQUEUE_FORMAT oben sorgt für eine Darstellung der Spalte TRES_PER_NODE in der Ausgabe von squeue. Darin steht die Anzahl der angeforderten GPUs eines jeden Jobs.

Das folgende Kommando zeigt alle Jobschritte (“job steps”) an für Prozesse, die mit srun gestartet wurden:

 squeue -s

Um die geschätzten Startzeiten anzuzeigen und welche Rechenknoten voraussichtlich Ihren wartenden Jobs zugewiesen werden, verwenden Sie

 $ squeue --start
  JOBID PARTITION NAME     USER ST          START_TIME  NODES SCHEDNODES   NODELIST(REASON)
    489       gpu test username PD 2020-03-20T11:50:09      1 euklid-n001  (Resources)
    488       gpu test username PD 2020-03-20T11:50:48      1 euklid-n002  (Priority)

Ein Job kann aus unterschiedlichen Gründen auf seine Ausführung warten. Falls es mehrere Gründe für diesen Wartezustand gibt, wird nur jeweils einer angezeigt.

  • Priority - Job hat noch keine ausreichend hohe Priorität in der Warteschlange
  • Resources - Job hat ausreichende Priorität, wartet aber darauf, dass Ressourcen verfügbar werden
  • JobHeldUser - durch Nutzerbefehl am Starten gehindert
  • Dependency - wartet auf Ende eines anderen Jobs
  • PartitionDown - Warteschlange nimmt derzeit keine neuen Jobs an

Die vollständige Liste finden Sie im Abschnitt “JOB REASON CODES” der squeue man page.

Benötigen Sie detailliertere Informationen über einen Job, verwenden Sie

 $ scontrol -d show job

Einen detaillierten Status eines bestimmten Jobs rufen Sie auf mit

 $ scontrol -d show job <job-id>

Ersetzen Sie <job-id> durch die ID ihres Jobs.

Beachten Sie, dass das Kommando scontrol show job den Status von Jobs bis zu 5 Minuten nach deren Abschluss anzeigt. Für Batchjobs, welche vor mehr als 5 Minuten beendet wurden, müssen Sie das sacct-Kommando verwenden, um die Statusinformationen aus der SLURM-Datenbank abzufragen (siehe Abschnitt ).

Das sstat-Kommando zeigt für laufende Jobs Statusinformationen in Echtzeit an, z.B. CPU-Zeit, Verwendung virtuellen Speichers (VM), physisch verwendeter Speicher (Resident Set Size, RSS), Ein-/Ausgabeoperationen (Disk I/O) usw.

 # show all status fields
 sstat -j <job-id>

 # show selected status fields
 sstat --format=AveCPU,AvePages,AveRSS,AveVMSize,JobID -j <job-id>

Hinweis: obige Kommandos zeigen nur Ihre eigenen Jobs in der SLURM-Warteschlange an.

Befehle zur Jobsteuerung

Der folgende Befehl bricht einen Job mit der ID <job-id> ab:

 $ scancel <job-id>

Alle Ihre Jobs entfernen Sie aus der Warteschlange durch

 $ scancel -u $USER

Um nur die Array ID <array_id> im Job-Array <job_id> abzubrechen:

 $ scancel <job_id>_<array_id>

Wenn im obigen Kommando nur die ID des Job-Arrays angegeben wird, werden alle Elemente dieses Job-Arrays abgebrochen.

Die Befehle oben senden den jobs zuerst das Signal SIGTERM, nach weiteren 30 Sekunden – sofern der Job weiterläuft – ein SIGKILL.

Die Option -s ermöglicht Ihnen, jedes beliebige Signal an einen laufenden Job zu senden, was bedeutet, dass SIe direkt von der Kommandozeile mit einem Job kommunizieren können, sofern dieser dafür vorbereitet wurde:

 $ scancel -s <signal> <job-id>

Ein wartender Job kann (zurück)gehalten, also von der Jobplanung ausgenommen werden durch

 $ scontrol hold <job-id>

Um einen zuvor (zurück)gehaltenen Job wieder freizugeben, verwenden Sie

 $ scontrol release <job-id>

Nach Übergabe eines Jobs an das System und während er noch auf die Ausführung wartet, können viele der Parameter noch verändert werden. Typische Daten, die modifiziert werden können sind z.B. Jobgröße (Speichermenge, Anzahl der Rechenknoten, Rechenkerne, Tasks, GPUs), Partition, Abhängigkeiten und Laufzeitgrenzen. Hier sind einige Beispiele:

 # modify time limit
 scontrol update JobId=279 TimeLimit=12:0:0

 # change number of tasks
 scontrol update jobid=279 NumTasks=80

 # change node number
 scontrol update JobId=279 NumNodes=2

 # change the number of GPUs per node
 scontrol update JobId=279 Gres=gpus:2

 # change memory per allocated CPU
 scontrol update Jobid=279 MinMemoryCPU=4G

 # change the number of simultaneously running jobs of array job 280
 scontrol update ArrayTaskThrottle=8 JobId=280

Eine vollständige Liste der änderbaren Auftragsparameter entnehmen Sie Abschnitt “SPECIFICATIONS FOR UPDATE COMMAND, JOBS” der scontrol man page.

Job Accounting-Befehle

Das sacct-Kommando zeigt an, welche “Abrechnungsdaten” für aktive und ausgeführte Aufträge in der SLURM-Datenbank gespeichert wurden. Hier sind einige Beispiele:

 #  list IDs of all your jobs since January 2019
 sacct -S 2019-01-01 -o jobid

 # show brief accounting data of the job with <job-id>
 sacct -j <job-id>

 # display all job accountig fields
 sacct -j <job-id> -o ALL

Die vollständige Liste der Abrechnungsdatenfelder finden Sie in Abschnitt “Job Accounting Fields” der sacct man page. Sie können ebenso das folgende Kommando verwenden: sacct –helpformat

Last modified: 2023/07/12 10:51

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki