Singularity ist eine Software zum Erstellen und Ausführen von Containern (ähnlich z.B. Docker), die insbesondere auf wissenschaftliches Rechnen und HPC ausgerichtet ist. Singularity ist auf dem OMNI-Cluster in der Version 3.7.1 installiert.

Um Singularity zu benutzen, müssen Sie das dazugehörige Modul laden (mehr zu Modulen hier):

module load singularity

Die Dokumentation von Singularity finden Sie hier. Mit dem Befehl singularity help können Sie sich außerdem einen Überblick über die wichtigsten Singularity-Befehle anzeigen lassen.

Auf dieser Seite finden Sie eine kurze Erklärung des Container-Konzepts sowie eine kurze Übersicht über die auf dem OMNI-Cluster vorhandenen Tools zum Erstellen und Ausführen von Singularity-Containern (inklusive der parallelen Ausführung mittels MPI).

Das Container-Konzept

Container sind ausführbare Dateien, die nicht nur ein Programm enthalten, sondern in der Regel auch die Software und Softwarebibliotheken, die das Programm zur Ausführung benötigt (seine sog. Dependencies). Im Gegensatz zu virtuellen Maschinen wird allerdings die Hardware des Computers, auf dem der Container läuft, nicht virtualisiert.

Singularity-Container haben mehrere Vorteile:

  • Da die Software und alle Dependencies in einer bekannten und unveränderlichen Version vorliegen, erhöht sich die Reproduzierbarkeit der wissenschaftlichen Ergebnisse.
  • Da der Container als einzelne Datei vorliegt, ist es einfacher, ihn mit anderen Personen zu teilen und auf anderen Computern zu starten.
  • Singularity unterstützt mehrere Containerformate, unter anderem das von Docker. Standardmäßig wird das Singularity-eigene Format .sif verwendet.
  • Im Gegensatz zu Docker benötigt man zur Ausführung und Erstellung von Singularity-Containern keinen Root-Zugriff.

Erstellen von Containern

Sie haben mehrere Möglichkeiten, an Singularity-Container zu kommen oder sie selbst zu erstellen. Alle Methoden benutzen den Befehl singularity build, der hier im Detail erklärt wird.

  • Die erste und einfachste Möglichkeit ist es, einen Container von der Container Library, dem Singularity Hub oder einem anderen Repositorium herunterzuladen. Singularity bietet auch eine Möglichkeit, Docker-Container in das Singularity-Format umzuwandeln.
  • Die zweite ist es, sich in einen Container mittels ssh einzuwählen und dort händisch Software zu installieren.
  • Die dritte Möglichkeit ist es, eine Definitionsdatei für den Container zu schreiben und den Container mittels dieser Definitionsdatei zu erstellen.

Sie können Dateien und Verzeichnisse auf mehrere Arten zwischen dem Container und dem Host-System (d.h. dem Computer, auf dem der Container läuft) teilen. Die wichtigsten beiden sind sogenannte Bind Paths und Mounts, die hier beschrieben werden.

Achtung: Auf dem Cluster mussten aus Sicherheitsgründen User Namespaces deaktiviert werden. Damit funktionieren die hier erwähnten Methoden nur mit Einschränkung, insbesondere wenn die Option --fakeroot benutzt wird. Es gibt zwei Workarounds hierfür:

  • Man kann den Container auf einem eigenen Linux-PC (oder virtueller Maschine mit Linux) erstellen, auf dem man Root-Rechte hat oder die --fakeroot-Option funktioniert.
  • Man kann den Online Build Service der Singularity-Herstellerfirma Sylabs verwenden.

In beiden Fällen muss man eine Definitionsdatei erstellen. Nach dem Erstellen des Containers kann dieser einfach wie jede andere Datei auf den Cluster kopiert und dann dort benutzt werden.

Ausführen von Containern

Sie können einen Singularity-Container, wie jede andere ausführbare Datei auch, einfach ausführen:

./<containername>.sif

Oder aber mit folgendem Befehl:

singularity run <containername>

Dies wird das sogenannte Runscript des Containers ausführen. Das Runscript legt fest, was genau passiert, wenn der Container ausgeführt wird. Wenn Sie einen Container selbst erstellen, müssen Sie dieses Runscript ebenfalls selbst erstellen, in der Regel als Teil des Definition Files. Details zu Runscripts in Definition Files finden Sie in der Singularity-Dokumentation hier.

Achtung: Wie jede andere Anwendung auch wird der Container in diesem Beispiel auf dem Login-Knoten laufen. Sie sollten niemals rechenintensive Programme auf den Login-Knoten laufen lassen, da Sie sich die Login-Knoten mit allen anderen Nutzern teilen. Im Normalfall sollten Sie ein Jobscript erstellen, in dem Sie den Befehl singularity run ... einfügen (vergessen Sie nicht, das Modul singularity zu laden).

Parallele Ausführung

Sie können MPI-Anwendungen in Singularity-Containern starten und können Container auch so einrichten, dass mehrere Container mittels MPI kommunizieren können. Die Dokumentation von Singularity erklärt hier zwei verschiedene Varianten, die beide mit dem auf dem OMNI installierten OpenMPI (standardmäßig bereits als Modul geladen) sowie mit SLURM kompatibel sind. Der Unterschied zwischen den beiden Varianten ist, dass in einem Fall nur das MPI des Host-Systems verwendet wird, während in der anderen Variante (in Singularity “Hybrid Model” genannt), sowohl innerhalb als auch außerhalb des Containers ein MPI installiert werden muss.

Aktualisiert um 15:15 am 8. Februar 2021 von Gerd Pokorra