Cluster: GPUs

Cluster Benutzung

In Kürze

Schwierigkeit

Mittel


Kosten

Kostenfrei


Erste SChritte

Graphical Processing Units (GPUs) sind spezialisierte Prozessoren, die mit ihren massiv parallele Architekturen bestimmte Operationen schneller ausführen können als CPUs. Man spricht deshalb auch von Beschleunigern (von denen GPUs nur eine Untergruppe sind). Der OMNI-Cluster verfügt über 10 Knoten mit insgesamt 24 GPUs vom Typ NVIDIA Tesla V100.

Damit ein Programm die GPUs nutzen kann, müssen geeignete Programmteile mithilfe entsprechender Bibliotheken (z.B. CUDA, OpenACC, OpenCL, OpenMP) erweitert werden.

Auf dieser Seite beschreiben wir, wie Sie für Ihre Jobs GPU-Knoten anfordern können. Außerdem ist beschrieben, welche Softwarebibliotheken zur Verfügung stehen, um Software für GPUs zu programmieren und wie Sie diese Bibliotheken einbinden.

Anfordern von GPU-Knoten auf OMNI

Um einen Knoten mit GPUs anzufordern, muss im Job-Skript die Queue (Partition) gpu angegeben werden. Zusätzlich muss auch die genaue Anzahl von benötigten GPUs über die Option --gres=gpu:<Anzahl> spezifiziert werden.

Die 24 GPUs auf dem OMNI-Cluster sind wie folgt auf die 10 GPU Knoten verteilt:

NodeAnzahl
GPUs
gpu-node[001-004]4
gpu-node[005-008]1
gpu-node[009-010]2

Beispiel Job-Skript-Header:

#!/bin/bash
#SBATCH --time=0:30:00
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=2
#SBATCH --partition=gpu
#SBATCH --gres=gpu:2
...

Damit fordern Sie einen GPU Knoten mit mindestens 2 GPUs aus der GPU-Queue an. Variieren Sie --gres=gpu:[1|2|4], je nachdem, wie viele GPUs sie für Ihren Anwendungsfall nutzen möchten. In der Slurm-Dokumentation finden Sie außerdem eine Reihe von weiteren Parametern, mit denen Sie die GPU-Nutzung steuern können.

GPU-Programmierung auf OMNI

Die meisten GPU-kompatiblen Module sind auf dem OMNI nicht sofort verfügbar (und z.B. nicht mit module avail sichtbar), weil sie in einem separaten Software-Stack, den GPU-Modulen, gruppiert sind. Dies ist aus Kompatibilitätsgründen notwendig. Um auf den GPU-Stack zu wechseln, müssen Sie den folgenden Befehl eingeben:

module load GpuModules

Wenn der GPU-Stack geladen ist, können Sie wie üblich mit module avail alle im GPU-Stack verfügbaren Module auflisten lassen.

Um auf den normalen Software-Stack zurück zu wechseln, geben Sie ein:

module unload GpuModules

Bitte denken Sie daran, dass Sie die Befehle zum Laden der Module auch in Ihren Jobskripten mit angeben müssen.

GPU Sharding

Um eine effizientere Nutzung der GPU Ressourcen auf dem OMNI-Cluster zu ermöglichen, ist es nun möglich GPU Sharding zu nutzen um auf einer GPU mehrere Slurm Jobs laufen zu lassen. Pro GPU Knoten stehen 64 Shards zur Verfügung, d.h. auf jedem GPU Knoten können bis zu 64 Jobs die GPUs gleichzeitig nutzen. Shards können über den Slurm Parameter --gres=shard:<anzhal> angefordert werden. Bitte verwenden Sie nur so viele Shards wie Sie auch tatsächlich für Ihre Rechnung benötigen.

Besipiel Job-Skript-Header für 2 Shards:

#SBATCH --time=0:30:00 
#SBATCH --nodes=1 
#SBATCH --ntasks-per-node=2 
#SBATCH --partition=gpu 
#SBATCH --gres=shard:2
...

Bitte beachten Sie das die Anzahl der verfügbaren Shards, unabhängig von der Anzahl der GPUs, pro GPU-Knoten 64 beträgt. Von daher wird die GPU eines Knoten mit nur einer GPU in 64 Shards unterteilt wird, auf Knoten mit 2 GPUs wird jede GPU aber nur in 32 Shards unterteilt. Das heißt 1 Shard auf einer GPU mit mehr Kernen hat entsprechend mehr Leistung. Wenn Sie sichergehen möchten, das Ihre Rechnungen auf einem Knoten mit einer bestimmten Anzahl an GPUs berechnet werden, können Sie die Knoten auf denen Sie nicht rechnen wollen mit --exclude ausschließen.

Beispiel Job-Skript-Header für Knoten mit einer GPU:

#SBATCH --time=0:30:00
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=2
#SBATCH --partition=gpu
#SBATCH --gres=shard:2
#SBATCH --exclude=gpu-node[001-004],gpu-node[009-010]
...
  • 1 GPU: --exclude=gpu-node[001-004],gpu-node[009-010]
  • 2 GPUs: --exclude=gpu-node[001-008]
  • 4 GPUs: --exclude=gpu-node[005-010]

Weiter Hinweise

  • Falls auf einem Knoten mit zwei GPUs eine ganze GPU mit gres=gpu:1 allokiert so werden anteilig 32 Shards aufgebraucht.
  • Bei 64 Shards und 256 GB Arbeitsspeicher stehen etwas weniger als 4 GB Arbeitsspeicher pro Shard zur Verfügung.