Content from Warum einen Cluster verwenden?


Zuletzt aktualisiert am 2025-08-04 | Diese Seite bearbeiten

Übersicht

Fragen

  • Warum sollte ich mich für High Performance Computing (HPC) interessieren?
  • Was kann ich von diesem Kurs erwarten?

Ziele

  • Beschreiben Sie, was ein HPC-System ist
  • Ermitteln Sie, welchen Nutzen ein HPC-System für Sie haben könnte.

Häufig wachsen Forschungsprobleme, die mit Hilfe von Computern bearbeitet werden, über die Möglichkeiten des Desktop- oder Laptop-Computers hinaus, auf dem sie begonnen haben:

  • Ein Statistikstudent möchte ein Modell kreuzvalidieren. Dazu muss das Modell 1000 Mal ausgeführt werden, aber jeder Durchlauf dauert eine Stunde. Die Ausführung des Modells auf einem Laptop würde über einen Monat dauern! Bei diesem Forschungsproblem werden die Endergebnisse berechnet, nachdem alle 1000 Modelle gelaufen sind, aber normalerweise wird immer nur ein Modell (in Serie) auf dem Laptop ausgeführt. Da jeder der 1000 Durchläufe unabhängig von den anderen ist, ist es theoretisch möglich, sie alle gleichzeitig (parallel) laufen zu lassen, wenn genügend Computer vorhanden sind.
  • Ein Genomforscher hat bisher mit kleinen Datensätzen von Sequenzdaten gearbeitet, wird aber bald eine neue Art von Sequenzierungsdaten erhalten, die zehnmal so groß sind. Es ist bereits eine Herausforderung, die Datensätze auf einem Computer zu öffnen - die Analyse dieser größeren Datensätze wird ihn wahrscheinlich zum Absturz bringen. Bei diesem Forschungsproblem könnten die erforderlichen Berechnungen nicht parallelisiert werden, aber ein Computer mit mehr Speicher wäre erforderlich, um den viel größeren zukünftigen Datensatz zu analysieren.
  • Ein Ingenieur verwendet ein Strömungsdynamik-Paket, das über eine Option zur parallelen Ausführung verfügt. Bislang wurde diese Option auf einem Desktop nicht genutzt. Bei der Umstellung von 2D- auf 3D-Simulationen hat sich die Simulationszeit mehr als verdreifacht. Es könnte nützlich sein, diese Option oder Funktion zu nutzen. Bei diesem Forschungsproblem sind die Berechnungen in jeder Region der Simulation weitgehend unabhängig von den Berechnungen in anderen Regionen der Simulation. Es ist möglich, die Berechnungen in jeder Region gleichzeitig (parallel) auszuführen, ausgewählte Ergebnisse je nach Bedarf an benachbarte Regionen weiterzugeben und die Berechnungen zu wiederholen, um zu einem endgültigen Satz von Ergebnissen zu konvergieren. Beim Übergang von einem 2D- zu einem 3D-Modell nimmt sowohl die Datenmenge als auch die Menge der Berechnungen stark zu, und es ist theoretisch möglich, die Berechnungen auf mehrere Computer zu verteilen, die über ein gemeinsames Netzwerk kommunizieren.

In all diesen Fällen ist der Zugang zu mehr (und größeren) Computern erforderlich. Diese Rechner sollten gleichzeitig nutzbar sein, um parallel die Probleme vieler Forscher zu lösen.

Jargon Busting Präsentation


Öffnen Sie den HPC Jargon Buster in einer neuen Registerkarte. Um den Inhalt zu präsentieren, drücken Sie C, um eine clone in einem separaten Fenster zu öffnen, und drücken Sie dann P, um den pDarstellungsmodus umzuschalten.

Ich habe noch nie einen Server benutzt, oder?

Nehmen Sie sich eine Minute Zeit und überlegen Sie, für welche Ihrer täglichen Interaktionen mit einem Computer Sie möglicherweise einen entfernten Server oder sogar einen Cluster benötigen, um Ergebnisse zu erhalten.

  • Abrufen von E-Mails: Ihr Computer (möglicherweise in Ihrer Hosentasche) kontaktiert einen entfernten Rechner, authentifiziert sich und lädt eine Liste neuer Nachrichten herunter; außerdem werden Änderungen des Nachrichtenstatus hochgeladen, z. B. ob Sie die Nachricht gelesen, als Junk markiert oder gelöscht haben. Da Ihr Konto nicht das einzige ist, ist der Mailserver wahrscheinlich einer von vielen in einem Rechenzentrum.
  • Bei der Online-Suche nach einem Begriff wird der Suchbegriff mit einer umfangreichen Datenbank aller bekannten Websites verglichen und nach Übereinstimmungen gesucht. Diese “Abfrage” kann ganz einfach sein, aber der Aufbau dieser Datenbank ist eine monumentale Aufgabe! Bei jedem Schritt sind Server beteiligt.
  • Bei der Suche nach einer Wegbeschreibung auf einer Karten-Website werden (A) Start- und (B) Endpunkt durch Durchqueren eines Graphen verbunden, um den “kürzesten” Weg nach Entfernung, Zeit, Kosten oder einer anderen Metrik zu finden. Die Umwandlung einer Karte in die richtige Form ist relativ einfach, aber die Berechnung aller möglichen Routen zwischen A und B ist aufwendig.

Das Abrufen von E-Mails könnte seriell sein: Ihr Rechner verbindet sich mit einem Server und tauscht Daten aus. Eine Suche durch Abfrage der Datenbank nach Ihrem Suchbegriff (oder Endpunkten) könnte ebenfalls seriell sein, da ein Rechner Ihre Anfrage erhält und das Ergebnis zurückgibt. Das Zusammenstellen und Speichern der gesamten Datenbank übersteigt jedoch bei weitem die Möglichkeiten eines einzelnen Rechners. Daher werden diese Funktionen parallel von einer großen, “hyperscale” Sammlung von Servern ausgeführt, die zusammenarbeiten.

Hauptpunkte

  • Beim High Performance Computing (HPC) wird in der Regel eine Verbindung zu sehr großen Rechensystemen an anderen Orten der Welt hergestellt.
  • Diese anderen Systeme können für Arbeiten verwendet werden, die auf kleineren Systemen entweder unmöglich oder sehr viel langsamer wären.
  • HPC-Ressourcen werden von mehreren Benutzern gemeinsam genutzt.
  • Die Standardmethode zur Interaktion mit solchen Systemen erfolgt über eine Befehlszeilenschnittstelle.

Content from Verbinden mit einem entfernten HPC-System


Zuletzt aktualisiert am 2025-08-04 | Diese Seite bearbeiten

Übersicht

Fragen

  • Wie melde ich mich bei einem entfernten HPC-System an?

Ziele

  • Konfigurieren Sie den sicheren Zugriff auf ein entferntes HPC-System.
  • Verbinden Sie sich mit einem entfernten HPC-System.

Sichere Verbindungen


Der erste Schritt bei der Nutzung eines Clusters besteht darin, eine Verbindung von unserem Laptop zum Cluster herzustellen. Wenn wir an einem Computer sitzen (oder stehen oder ihn in der Hand oder am Handgelenk halten), erwarten wir eine visuelle Anzeige mit Symbolen, Widgets und vielleicht einigen Fenstern oder Anwendungen: eine grafische Benutzeroberfläche, oder GUI. Da es sich bei Computerclustern um entfernte Ressourcen handelt, mit denen wir uns über langsame oder unregelmäßige Schnittstellen (insbesondere WiFi und VPNs) verbinden, ist es praktischer, eine Befehlszeilenschnittstelle (CLI) zu verwenden, um Befehle im Klartext zu senden. Wenn ein Befehl eine Ausgabe zurückgibt, wird diese ebenfalls im Klartext ausgedruckt. Die Befehle, die wir heute ausführen, werden kein Fenster öffnen, um die Ergebnisse grafisch darzustellen.

Wenn Sie jemals die Windows-Eingabeaufforderung oder das macOS-Terminal geöffnet haben, haben Sie eine CLI gesehen. Wenn Sie bereits an den The Carpentries-Kursen über die UNIX-Shell oder Versionskontrolle teilgenommen haben, haben Sie die CLI auf Ihrem lokalen Rechner ausgiebig genutzt. Der einzige Sprung, den Sie hier machen müssen, ist das Öffnen einer CLI auf einem entfernten Rechner, wobei Sie einige Vorsichtsmaßnahmen treffen müssen, damit andere Leute im Netzwerk die Befehle, die Sie ausführen, oder die Ergebnisse, die der entfernte Rechner zurückschickt, nicht sehen (oder ändern) können. Wir werden das Secure SHell-Protokoll (oder SSH) verwenden, um eine verschlüsselte Netzwerkverbindung zwischen zwei Rechnern zu öffnen, die es Ihnen ermöglicht, Text und Daten zu senden und zu empfangen, ohne sich um neugierige Blicke sorgen zu müssen.

Connect to cluster

SSH-Clients sind in der Regel Kommandozeilenprogramme, bei denen Sie als einziges Argument die Adresse des entfernten Rechners angeben müssen. Wenn sich Ihr Benutzername auf dem entfernten System von dem unterscheidet, den Sie lokal verwenden, müssen Sie auch diesen angeben. Wenn Ihr SSH-Client über eine grafische Oberfläche verfügt, wie z. B. PuTTY oder MobaXterm, geben Sie diese Argumente an, bevor Sie auf “Verbinden” klicken Im Terminal schreiben Sie etwas wie ssh userName@hostname, wobei das Argument wie eine E-Mail-Adresse ist: das “@”-Symbol wird verwendet, um die persönliche ID von der Adresse des entfernten Rechners zu trennen.

Bei der Anmeldung an einem Laptop, Tablet oder einem anderen persönlichen Gerät sind normalerweise ein Benutzername, ein Kennwort oder ein Muster erforderlich, um unbefugten Zugriff zu verhindern. In diesen Situationen ist die Wahrscheinlichkeit, dass jemand anderes Ihr Passwort abfängt, gering, da die Aufzeichnung Ihrer Tastenanschläge einen böswilligen Exploit oder physischen Zugang erfordert. Bei Systemen wie login1, auf denen ein SSH-Server läuft, kann sich jeder im Netzwerk anmelden oder dies versuchen. Da Benutzernamen oft öffentlich oder leicht zu erraten sind, ist Ihr Passwort oft das schwächste Glied in der Sicherheitskette. Viele Cluster verbieten daher die passwortbasierte Anmeldung und verlangen stattdessen, dass Sie ein öffentlich-privates Schlüsselpaar mit einem viel stärkeren Passwort erzeugen und konfigurieren. Auch wenn Ihr Cluster dies nicht vorschreibt, wird der nächste Abschnitt Sie durch die Verwendung von SSH-Schlüsseln und eines SSH-Agenten führen, um sowohl Ihre Sicherheit zu erhöhen als auch die Anmeldung bei entfernten Systemen zu erleichtern.

Bessere Sicherheit mit SSH-Schlüsseln

Die Lesson Setup enthält Anweisungen für die Installation einer Shell-Anwendung mit SSH. Falls Sie dies noch nicht getan haben, öffnen Sie bitte diese Shell-Anwendung mit einer Unix-ähnlichen Kommandozeilenschnittstelle auf Ihrem System.

SSH-Schlüssel sind eine alternative Methode zur Authentifizierung, um Zugang zu entfernten Computersystemen zu erhalten. Sie können auch zur Authentifizierung bei der Übertragung von Dateien oder für den Zugriff auf entfernte Versionskontrollsysteme (wie GitHub) verwendet werden. In diesem Abschnitt werden Sie ein Paar SSH-Schlüssel erstellen:

  • ein privater Schlüssel, den Sie auf Ihrem eigenen Computer aufbewahren, und
  • ein öffentlicher Schlüssel, der auf jedem entfernten System platziert werden kann, auf das Sie zugreifen wollen.

Private Schlüssel sind Ihr sicherer digitaler Reisepass

Ein privater Schlüssel, der für jeden außer Ihnen sichtbar ist, sollte als kompromittiert betrachtet werden und muss vernichtet werden. Dazu gehören unzulässige Rechte für das Verzeichnis, in dem er (oder eine Kopie) gespeichert ist, das Durchqueren eines nicht sicheren (verschlüsselten) Netzwerks, der Anhang einer unverschlüsselten E-Mail und sogar die Anzeige des Schlüssels in Ihrem Terminalfenster.

Schützen Sie diesen Schlüssel, als ob er Ihre Haustür aufschließen würde. In vielerlei Hinsicht tut er das auch.

Unabhängig von der Software oder dem Betriebssystem, das Sie verwenden, bitte wählen Sie ein starkes Passwort oder eine Passphrase, um Ihren privaten SSH-Schlüssel zusätzlich zu schützen.

Überlegungen zu SSH-Schlüsselpasswörtern

Wenn Sie dazu aufgefordert werden, geben Sie ein sicheres Passwort ein, das Sie sich merken können. Hierfür gibt es zwei gängige Ansätze:

  1. Erstellen Sie eine einprägsame Passphrase mit einigen Interpunktionszeichen und Buchstaben-Zahlen-Ersetzungen, 32 Zeichen oder länger. Straßenadressen eignen sich gut; seien Sie jedoch vorsichtig mit Social-Engineering- oder Public-Records-Angriffen.
  2. Verwenden Sie einen Passwort-Manager und seinen eingebauten Passwort-Generator mit allen Zeichenklassen, 25 Zeichen oder länger. KeePass und BitWarden sind zwei gute Optionen.
  3. Nichts ist weniger sicher als ein privater Schlüssel ohne Passwort. Wenn Sie die Passworteingabe versehentlich übersprungen haben, gehen Sie zurück und erzeugen Sie ein neues Schlüsselpaar mit einem starken Passwort.

SSH-Schlüssel auf Linux, Mac, MobaXterm und Windows Subsystem für Linux

Sobald Sie ein Terminal geöffnet haben, prüfen Sie, ob bereits SSH-Schlüssel und Dateinamen vorhanden sind, da vorhandene SSH-Schlüssel überschrieben werden.

BASH

[you@laptop:~]$ ls ~/.ssh/

Wenn ~/.ssh/id_ed25519 bereits existiert, müssen Sie einen anderen Namen für das neue Schlüsselpaar angeben.

Erzeugen Sie ein neues Schlüsselpaar aus öffentlichem und privatem Schlüssel mit dem folgenden Befehl, der einen stärkeren Schlüssel als den Standardschlüssel ssh-keygen erzeugt, indem Sie diese Flags aufrufen:

  • -a (Standardwert ist 16): Anzahl der Runden der Passphrasenableitung; erhöhen Sie diese, um Brute-Force-Angriffe zu verlangsamen.
  • -t (Standard ist rsa): Geben Sie den “Typ” oder kryptographischen Algorithmus an.ed25519 spezifiziert EdDSA mit einem 256-Bit-Schlüssel; er ist schneller als RSA mit einer vergleichbaren Stärke.
  • -f (Standard ist /home/user/.ssh/id_algorithm): Dateiname zum Speichern Ihres privaten Schlüssels. Der Dateiname des öffentlichen Schlüssels ist identisch, mit der Erweiterung .pub.

BASH

[you@laptop:~]$ ssh-keygen -a 100 -f ~/.ssh/id_ed25519 -t ed25519

Wenn Sie dazu aufgefordert werden, geben Sie ein sicheres Passwort ein, das die obigen Überlegungen berücksichtigt. Beachten Sie, dass sich das Terminal nicht zu ändern scheint, während Sie das Passwort eingeben: Das ist zu Ihrer Sicherheit so gewollt. Sie werden aufgefordert, es noch einmal einzugeben, also machen Sie sich nicht zu viele Gedanken über Tippfehler.

Werfen Sie einen Blick in ~/.ssh (verwenden Sie ls ~/.ssh). Sie sollten zwei neue Dateien sehen:

  • Ihr privater Schlüssel (~/.ssh/id_ed25519): do not share with anyone!
  • den gemeinsam nutzbaren öffentlichen Schlüssel (~/.ssh/id_ed25519.pub): Wenn ein Systemadministrator nach einem Schlüssel fragt, ist dies der Schlüssel, den Sie senden müssen. Es ist auch sicher, ihn auf Websites wie GitHub hochzuladen: Er ist dafür gedacht, gesehen zu werden.

Verwenden Sie RSA für ältere Systeme

Wenn die Schlüsselerzeugung fehlgeschlagen ist, weil ed25519 nicht verfügbar ist, versuchen Sie es mit dem älteren (aber immer noch starken und vertrauenswürdigen) RSA Kryptosystem. Prüfen Sie auch hier zunächst, ob ein Schlüssel vorhanden ist:

BASH

[you@laptop:~]$ ls ~/.ssh/

Wenn ~/.ssh/id_rsa bereits existiert, müssen Sie einen anderen Namen für das neue Schlüsselpaar wählen. Erzeugen Sie es wie oben, mit den folgenden zusätzlichen Flags:

  • -b legt die Anzahl der Bits des Schlüssels fest. Die Vorgabe ist 2048. EdDSA verwendet eine feste Schlüssellänge, so dass dieses Flag keine Auswirkung haben würde.
  • -o (kein Standard): Verwenden Sie das OpenSSH-Schlüsselformat, anstatt PEM.

BASH

[you@laptop:~]$ ssh-keygen -a 100 -b 4096 -f ~/.ssh/id_rsa -o -t rsa

Wenn Sie dazu aufgefordert werden, geben Sie ein sicheres Passwort ein und beachten Sie dabei die oben genannten Überlegungen.

Werfen Sie einen Blick in ~/.ssh (verwenden Sie ls ~/.ssh). Sie sollten zwei neue Dateien sehen:

  • Ihr privater Schlüssel (~/.ssh/id_rsa): do not share with anyone!
  • den gemeinsam nutzbaren öffentlichen Schlüssel (~/.ssh/id_rsa.pub): Wenn ein Systemadministrator nach einem Schlüssel fragt, ist dies der Schlüssel, den Sie senden müssen. Es ist auch sicher, ihn auf Websites wie GitHub hochzuladen: Er ist dafür gedacht, gesehen zu werden.

SSH-Schlüssel auf PuTTY

Wenn Sie PuTTY unter Windows verwenden, laden Sie puttygen herunter und verwenden Sie es, um das Schlüsselpaar zu erzeugen. Siehe die PuTTY-Dokumentation für Details.

  • Wählen Sie EdDSA als Schlüsseltyp.
  • Wählen Sie 255 als Schlüsselgröße oder -stärke.
  • Klicken Sie auf die Schaltfläche “Generate”.
  • Sie müssen keinen Kommentar eingeben.
  • Wenn Sie dazu aufgefordert werden, geben Sie ein sicheres Passwort ein und beachten Sie dabei die oben genannten Überlegungen.
  • Speichern Sie die Schlüssel in einem Ordner, den kein anderer Benutzer des Systems lesen kann.

Werfen Sie einen Blick in den von Ihnen angegebenen Ordner. Sie sollten zwei neue Dateien sehen:

  • Ihr privater Schlüssel (id_ed25519): do not share with anyone!
  • den gemeinsam nutzbaren öffentlichen Schlüssel (id_ed25519.pub): Wenn ein Systemadministrator nach einem Schlüssel fragt, ist dies der Schlüssel, den Sie senden müssen. Es ist auch sicher, ihn auf Websites wie GitHub hochzuladen: Er ist dafür gedacht, gesehen zu werden.

SSH Agent für einfachere Schlüsselverwaltung

Ein SSH-Schlüssel ist nur so stark wie das Passwort, mit dem er entsperrt wird. Andererseits ist es mühsam, jedes Mal ein komplexes Passwort einzugeben, wenn man sich mit einem Rechner verbindet, und wird schnell langweilig. An dieser Stelle kommt der SSH-Agent ins Spiel.

Wenn Sie einen SSH-Agenten verwenden, können Sie Ihr Passwort für den privaten Schlüssel einmal eingeben und dann den Agenten veranlassen, es für eine bestimmte Anzahl von Stunden oder bis zu Ihrer Abmeldung zu speichern. Solange kein böswilliger Akteur physischen Zugang zu Ihrem Rechner hat, ist das Kennwort auf diese Weise sicher, und Sie müssen das Kennwort nicht mehrmals eingeben.

Merken Sie sich Ihr Passwort, denn sobald es im Agenten abläuft, müssen Sie es erneut eingeben.

SSH-Agenten auf Linux, macOS und Windows

Öffnen Sie Ihr Terminalprogramm und prüfen Sie, ob ein Agent läuft:

BASH

[you@laptop:~]$ ssh-add -l
  • Wenn Sie eine Fehlermeldung wie diese erhalten,

    FEHLER

    Error connecting to agent: No such file or directory

    … dann müssen Sie den Agenten wie folgt starten:

    BASH

    [you@laptop:~]$ eval $(ssh-agent)

    Was ist in einem $(...)?

    Die Syntax dieses SSH-Agent-Befehls ist ungewöhnlich, basierend auf dem, was wir in der UNIX-Shell-Lektion gesehen haben. Das liegt daran, dass der ssh-agent-Befehl eine Verbindung öffnet, auf die nur Sie Zugriff haben, und eine Reihe von Shell-Befehlen ausgibt, die verwendet werden können, um sie zu erreichen - aber sie werden nicht ausgeführt!

    BASH

    [you@laptop:~]$ ssh-agent

    AUSGABE

    SSH_AUTH_SOCK=/tmp/ssh-Zvvga2Y8kQZN/agent.131521;
    export SSH_AUTH_SOCK;
    SSH_AGENT_PID=131522;
    export SSH_AGENT_PID;
    echo Agent pid 131522;

    Der Befehl eval interpretiert diese Textausgabe als Befehle und ermöglicht Ihnen den Zugriff auf die gerade erstellte SSH-Agent-Verbindung.

    Sie könnten jede Zeile der ssh-agent-Ausgabe selbst ausführen und das gleiche Ergebnis erzielen. Die Verwendung von eval macht dies nur einfacher.

  • Andernfalls läuft Ihr Agent bereits: Lassen Sie ihn in Ruhe.

Fügen Sie Ihren Schlüssel zum Agenten hinzu, wobei die Sitzung nach 8 Stunden abläuft:

BASH

[you@laptop:~]$ ssh-add -t 8h ~/.ssh/id_ed25519

AUSGABE

Enter passphrase for .ssh/id_ed25519:
Identity added: .ssh/id_ed25519
Lifetime set to 86400 seconds

Während der Dauer (8 Stunden) wird der SSH-Agent bei jeder Verwendung dieses Schlüssels den Schlüssel für Sie bereitstellen, ohne dass Sie einen einzigen Tastendruck eingeben müssen.

SSH-Agent auf PuTTY

Wenn Sie PuTTY unter Windows verwenden, laden Sie pageant herunter und verwenden Sie es als SSH-Agent. Siehe die PuTTY-Dokumentation.

Übertragen Sie Ihren öffentlichen Schlüssel

BASH

[you@laptop:~]$ scp ~/.ssh/id_ed25519.pub yourUsername@cluster.hpc-carpentry.org:~/

Einloggen in den Cluster


Öffnen Sie Ihr Terminal oder Ihren grafischen SSH-Client und melden Sie sich beim Cluster an. Ersetzen Sie yourUsername durch Ihren Benutzernamen oder den von den Lehrkräften angegebenen.

BASH

[you@laptop:~]$ ssh yourUsername@cluster.hpc-carpentry.org

Sie werden möglicherweise nach Ihrem Passwort gefragt. Achtung: Die Zeichen, die Sie nach der Passwortabfrage eingeben, werden nicht auf dem Bildschirm angezeigt. Die normale Ausgabe wird fortgesetzt, sobald Sie Enter drücken.

Sie haben vielleicht bemerkt, dass sich die Eingabeaufforderung geändert hat, als Sie sich mit dem Terminal beim entfernten System angemeldet haben (wenn Sie sich mit PuTTY angemeldet haben, gilt dies nicht, da PuTTY kein lokales Terminal anbietet). Diese Änderung ist wichtig, weil sie Ihnen helfen kann, zu unterscheiden, auf welchem System die von Ihnen eingegebenen Befehle ausgeführt werden, wenn Sie sie an das Terminal übergeben. Diese Änderung ist auch eine kleine Komplikation, mit der wir uns im Laufe des Workshops auseinandersetzen müssen. Was genau als Eingabeaufforderung (die üblicherweise mit $ endet) im Terminal angezeigt wird, wenn es mit dem lokalen System und dem entfernten System verbunden ist, wird normalerweise für jeden Benutzer unterschiedlich sein. Wir müssen aber trotzdem angeben, auf welchem System wir Befehle eingeben, also werden wir die folgende Konvention anwenden:

  • [you@laptop:~]$, wenn der Befehl auf einem Terminal eingegeben werden soll, das mit Ihrem lokalen Computer verbunden ist
  • [yourUsername@login1 ~], wenn der Befehl auf einem Terminal eingegeben werden soll, das mit dem entfernten System verbunden ist
  • $, wenn es wirklich keine Rolle spielt, mit welchem System das Terminal verbunden ist.

Schauen Sie sich in Ihrem Remote Home um


Sehr oft sind viele Benutzer versucht, sich eine Hochleistungsrechner-Installation als eine riesige, magische Maschine vorzustellen. Manchmal nehmen sie an, dass der Computer, an dem sie sich angemeldet haben, der gesamte Computer-Cluster ist. Was passiert also wirklich? Bei welchem Computer haben wir uns angemeldet? Der Name des aktuellen Computers, auf dem wir angemeldet sind, kann mit dem Befehl hostname überprüft werden. (Vielleicht bemerken Sie auch, dass der aktuelle Hostname auch Teil unserer Eingabeaufforderung ist)

BASH

[yourUsername@login1 ~] hostname

AUSGABE

login1

Wir befinden uns also definitiv auf dem entfernten Rechner. Als Nächstes wollen wir herausfinden, wo wir uns befinden, indem wir pwd ausführen, um das wArbeitsverzeichnis dauszugeben.

BASH

[yourUsername@login1 ~] pwd

AUSGABE

/home/yourUsername

Großartig, wir wissen, wo wir sind! Schauen wir mal, was sich in unserem aktuellen Verzeichnis befindet:

BASH

[yourUsername@login1 ~] ls

AUSGABE

id_ed25519.pub

Die Systemadministratoren haben möglicherweise Ihr Home-Verzeichnis mit einigen hilfreichen Dateien, Ordnern und Verknüpfungen (Shortcuts) zu für Sie reserviertem Speicherplatz auf anderen Dateisystemen konfiguriert. Wenn dies nicht der Fall ist, kann Ihr Home-Verzeichnis leer erscheinen. Um dies zu überprüfen, nehmen Sie versteckte Dateien in Ihre Verzeichnisliste auf:

BASH

[yourUsername@login1 ~] ls -a

AUSGABE

  .            .bashrc           id_ed25519.pub
  ..           .ssh

In der ersten Spalte ist . ein Verweis auf das aktuelle Verzeichnis und .. ein Verweis auf dessen übergeordnetes Verzeichnis (/home). Sie können die anderen Dateien oder ähnliche Dateien sehen, müssen es aber nicht: .bashrc ist eine Shell-Konfigurationsdatei, die Sie mit Ihren Präferenzen bearbeiten können; und .ssh ist ein Verzeichnis, das SSH-Schlüssel und eine Aufzeichnung der autorisierten Verbindungen speichert.

Installieren Sie Ihren SSH-Schlüssel

There May Be a Better Way

Die Richtlinien und Praktiken für den Umgang mit SSH-Schlüsseln variieren von HPC-Cluster zu HPC-Cluster: Befolgen Sie die von den Cluster-Administratoren oder der Dokumentation bereitgestellten Hinweise. Insbesondere wenn es ein Online-Portal für die Verwaltung von SSH-Schlüsseln gibt, verwenden Sie dieses anstelle der hier beschriebenen Anweisungen.

Wenn Sie Ihren öffentlichen SSH-Schlüssel mit scp übertragen haben, sollten Sie id_ed25519.pub in Ihrem Home-Verzeichnis sehen. Um diesen Schlüssel zu “installieren”, muss er in einer Datei namens authorized_keys unter dem Ordner .ssh aufgeführt sein.

Wenn der Ordner .ssh oben nicht aufgeführt wurde, dann existiert er noch nicht: Erstellen Sie ihn.

BASH

[yourUsername@login1 ~] mkdir ~/.ssh

Verwenden Sie nun cat, um Ihren öffentlichen Schlüssel zu drucken, aber leiten Sie die Ausgabe um, indem Sie sie an die Datei authorized_keys anhängen:

BASH

[yourUsername@login1 ~] cat ~/id_ed25519.pub >> ~/.ssh/authorized_keys

Das war’s! Trennen Sie die Verbindung und versuchen Sie dann, sich wieder bei der Gegenstelle anzumelden: Wenn Ihr Schlüssel und Ihr Agent korrekt konfiguriert wurden, sollten Sie nicht nach dem Passwort für Ihren SSH-Schlüssel gefragt werden.

BASH

[yourUsername@login1 ~] logout

BASH

[you@laptop:~]$ ssh yourUsername@cluster.hpc-carpentry.org

Hauptpunkte

  • Ein HPC-System ist eine Gruppe von vernetzten Maschinen.
  • HPC-Systeme bieten typischerweise Login-Knoten und eine Reihe von Worker-Knoten.
  • Die Ressourcen auf den unabhängigen (Arbeits-)Knoten können in Umfang und Art variieren (Menge des Arbeitsspeichers, Prozessorarchitektur, Verfügbarkeit von über das Netzwerk eingebundenen Dateisystemen usw.).
  • Dateien, die auf einem Knoten gespeichert sind, sind auf allen Knoten verfügbar.

Content from Arbeiten auf einem entfernten HPC-System


Zuletzt aktualisiert am 2025-08-04 | Diese Seite bearbeiten

Übersicht

Fragen

  • “Was ist ein HPC-System?”
  • “Wie funktioniert ein HPC-System?”
  • “Wie melde ich mich bei einem entfernten HPC-System an?”

Ziele

  • “Verbinden Sie sich mit einem entfernten HPC-System.”
  • “Verstehen Sie die allgemeine HPC-Systemarchitektur.”

Was ist ein HPC-System?


Die Begriffe “Cloud”, “Cluster” und “High-Performance Computing” oder “HPC” werden in verschiedenen Zusammenhängen und mit unterschiedlichen Bedeutungen verwendet. Was bedeuten sie also? Und was noch wichtiger ist: Wie verwenden wir sie bei unserer Arbeit?

Die Wolke ist ein allgemeiner Begriff, der sich auf Computerressourcen bezieht, die a) den Benutzern auf Anfrage oder nach Bedarf zur Verfügung gestellt werden und b) reale oder virtuelle Ressourcen darstellen, die sich überall auf der Erde befinden können. So kann beispielsweise ein großes Unternehmen mit Rechenressourcen in Brasilien, Simbabwe und Japan diese Ressourcen als seine eigene interne Cloud verwalten, und dasselbe Unternehmen kann auch kommerzielle Cloud-Ressourcen von Amazon oder Google nutzen. Cloud-Ressourcen können sich auf Maschinen beziehen, die relativ einfache Aufgaben ausführen, wie z. B. die Bereitstellung von Websites, die Bereitstellung von gemeinsamem Speicherplatz, die Bereitstellung von Webdiensten (z. B. E-Mail oder Social-Media-Plattformen) sowie traditionellere rechenintensive Aufgaben wie die Ausführung einer Simulation.

Der Begriff HPC-System beschreibt dagegen eine eigenständige Ressource für rechenintensive Arbeitslasten. Sie bestehen in der Regel aus einer Vielzahl integrierter Verarbeitungs- und Speicherelemente, die darauf ausgelegt sind, große Datenmengen und/oder eine große Anzahl von Gleitkommaoperationen (FLOPS) mit der höchstmöglichen Leistung zu verarbeiten. So sind zum Beispiel alle Maschinen auf der Top-500 Liste HPC-Systeme. Um diesen Anforderungen gerecht zu werden, muss eine HPC-Ressource an einem bestimmten, festen Standort vorhanden sein: Netzwerkkabel können nur bis zu einem bestimmten Punkt verlegt werden, und elektrische und optische Signale können nur mit einer bestimmten Geschwindigkeit übertragen werden.

Der Begriff “Cluster” wird häufig für kleine bis mittelgroße HPC-Ressourcen verwendet, die weniger beeindruckend sind als die [Top-500] (https://www.top500.org). Cluster werden oft in Rechenzentren unterhalten, die mehrere solcher Systeme unterstützen, die alle ein gemeinsames Netzwerk und einen gemeinsamen Speicher nutzen, um gemeinsame rechenintensive Aufgaben zu unterstützen.

Angemeldet


Der erste Schritt bei der Nutzung eines Clusters besteht darin, eine Verbindung zwischen unserem Laptop und dem Cluster herzustellen. Wenn wir an einem Computer sitzen (oder stehen, oder ihn in der Hand oder am Handgelenk halten), erwarten wir eine visuelle Anzeige mit Symbolen, Widgets und vielleicht einigen Fenstern oder Anwendungen: eine grafische Benutzeroberfläche (GUI). Da es sich bei Computerclustern um entfernte Ressourcen handelt, mit denen wir uns über oft langsame oder verzögerte Schnittstellen (insbesondere WiFi und VPNs) verbinden, ist es praktischer, eine Befehlszeilenschnittstelle (CLI) zu verwenden, bei der Befehle und Ergebnisse nur über Text übertragen werden. Alles, was nicht Text ist (z. B. Bilder), muss auf die Festplatte geschrieben und mit einem separaten Programm geöffnet werden.

Wenn Sie jemals die Windows-Eingabeaufforderung oder das macOS-Terminal geöffnet haben, haben Sie ein CLI gesehen. Wenn Sie bereits an den The Carpentries-Kursen über die UNIX-Shell oder Versionskontrolle teilgenommen haben, haben Sie die CLI auf Ihrem lokalen Rechner ziemlich ausgiebig genutzt. Der einzige Schritt, der hier gemacht werden muss, ist das Öffnen einer CLI auf einem entfernten Rechner, wobei einige Vorsichtsmaßnahmen getroffen werden müssen, damit andere Leute im Netzwerk die Befehle, die Sie ausführen, oder die Ergebnisse, die der entfernte Rechner zurücksendet, nicht sehen (oder ändern) können. Wir werden das Secure SHell-Protokoll (oder SSH) verwenden, um eine verschlüsselte Netzwerkverbindung zwischen zwei Rechnern herzustellen, die es Ihnen ermöglicht, Text und Daten zu senden und zu empfangen, ohne sich um neugierige Blicke sorgen zu müssen.

Connect to cluster
Connect to cluster

Stellen Sie sicher, dass Sie einen SSH-Client auf Ihrem Laptop installiert haben. Lesen Sie den Abschnitt setup für weitere Details. SSH-Clients sind in der Regel Befehlszeilen-Tools, bei denen Sie als einziges Argument die Adresse des entfernten Rechners angeben müssen. Wenn sich Ihr Benutzername auf dem entfernten System von dem unterscheidet, den Sie lokal verwenden, müssen Sie auch diesen angeben. Wenn Ihr SSH-Client über eine grafische Oberfläche verfügt, wie z. B. PuTTY oder MobaXterm, geben Sie diese Argumente an, bevor Sie auf “Verbinden” klicken Im Terminal schreiben Sie etwa ssh userName@hostname, wobei das “@”-Symbol verwendet wird, um die beiden Teile eines einzelnen Arguments zu trennen.

Öffnen Sie Ihr Terminal oder Ihren grafischen SSH-Client und melden Sie sich mit Ihrem Benutzernamen und dem entfernten Computer, den Sie von der Außenwelt aus erreichen können, cluster.hpc-carpentry.org, am Cluster an.

BASH

[you@laptop:~]$ ssh yourUsername@cluster.hpc-carpentry.org

Denken Sie daran, yourUsername durch Ihren Benutzernamen oder den von den Dozenten angegebenen zu ersetzen. Möglicherweise werden Sie nach Ihrem Passwort gefragt. Achtung: Die Zeichen, die Sie nach der Passwortabfrage eingeben, werden nicht auf dem Bildschirm angezeigt. Die normale Ausgabe wird fortgesetzt, sobald Sie Enter drücken.

Wo sind wir?


Sehr oft sind viele Benutzer versucht, sich eine Hochleistungsrechner-Installation als eine riesige, magische Maschine vorzustellen. Manchmal gehen sie davon aus, dass der Computer, an dem sie sich angemeldet haben, der gesamte Computer-Cluster ist. Was passiert also wirklich? Bei welchem Computer haben wir uns angemeldet? Der Name des aktuellen Computers, auf dem wir angemeldet sind, kann mit dem Befehl hostname überprüft werden. (Vielleicht bemerken Sie auch, dass der aktuelle Hostname auch Teil unserer Eingabeaufforderung ist)

BASH

[yourUsername@login1 ~] hostname

AUSGABE

login1

Was befindet sich in Ihrem Heimatverzeichnis?

Die Systemadministratoren haben Ihr Home-Verzeichnis möglicherweise mit einigen hilfreichen Dateien, Ordnern und Verknüpfungen (Shortcuts) zu für Sie reserviertem Speicherplatz auf anderen Dateisystemen konfiguriert. Schauen Sie sich um und sehen Sie, was Sie finden können. Tipp: Die Shell-Befehle pwd und ls können dabei hilfreich sein. Der Inhalt des Heimatverzeichnisses variiert von Benutzer zu Benutzer. Bitte besprechen Sie alle Unterschiede, die Sie feststellen, mit Ihren Nachbarn.

Die tiefste Ebene sollte sich unterscheiden: yourUsername ist eindeutig. Gibt es Unterschiede im Pfad auf höheren Ebenen?

Wenn Sie beide leere Verzeichnisse haben, werden sie identisch aussehen. Wenn Sie oder Ihr Nachbar das System vorher benutzt haben, kann es Unterschiede geben. Woran arbeiten Sie?

Verwenden Sie pwd, um pden warbeitenden dVerzeichnispfad zu drucken:

BASH

[yourUsername@login1 ~] pwd

Sie können ls ausführen, um den Inhalt des Verzeichnisses zu list, obwohl es möglich ist, dass nichts angezeigt wird (wenn keine Dateien bereitgestellt wurden). Um sicher zu gehen, benutzen Sie das -a Flag, um auch versteckte Dateien anzuzeigen.

BASH

[yourUsername@login1 ~] ls -a

Dies zeigt zumindest das aktuelle Verzeichnis als . und das übergeordnete Verzeichnis als .. an.

Knoten


Die einzelnen Computer, aus denen ein Cluster besteht, werden in der Regel Knoten genannt (obwohl man sie auch Server, Rechner und Maschinen nennen kann). In einem Cluster gibt es verschiedene Arten von Knoten für verschiedene Arten von Aufgaben. Der Knoten, an dem Sie sich gerade befinden, wird Kopfknoten, Anmeldeknoten, Landeplatz oder Übermittlungsknoten genannt. Ein Anmeldeknoten dient als Zugangspunkt zum Cluster.

Als Gateway ist er gut geeignet, um Dateien hoch- und herunterzuladen, Software einzurichten und schnelle Tests durchzuführen. Im Allgemeinen sollte der Login-Knoten nicht für zeit- oder ressourcenintensive Aufgaben verwendet werden. Sie sollten darauf achten und sich bei den Betreibern Ihrer Website oder in der Dokumentation darüber informieren, was erlaubt ist und was nicht. In diesen Lektionen werden wir es vermeiden, Aufträge auf dem Hauptknoten auszuführen.

Dedizierte Transferknoten

Wenn Sie größere Datenmengen in oder aus dem Cluster übertragen wollen, bieten einige Systeme dedizierte Knoten nur für Datentransfers an. Die Motivation dafür liegt darin, dass größere Datentransfers den Betrieb des Login-Knotens für alle anderen nicht behindern sollen. Erkundigen Sie sich in der Dokumentation Ihres Clusters oder bei dessen Support-Team, ob ein solcher Transferknoten verfügbar ist. Als Faustregel gilt, dass alle Übertragungen eines Volumens größer als 500 MB bis 1 GB als groß zu betrachten sind. Diese Zahlen können sich jedoch ändern, z.B. abhängig von der Netzwerkverbindung von Ihnen und Ihrem Cluster oder anderen Faktoren.

Die eigentliche Arbeit in einem Cluster wird von den Arbeiterknoten (oder Rechenknoten) erledigt. Arbeiterknoten gibt es in vielen Formen und Größen, aber im Allgemeinen sind sie für lange oder schwierige Aufgaben bestimmt, die viele Rechenressourcen erfordern.

Die gesamte Interaktion mit den Arbeiterknoten wird von einer speziellen Software namens Scheduler abgewickelt (der Scheduler, der in dieser Lektion verwendet wird, heißt Slurm). Wir werden in der nächsten Lektion mehr darüber lernen, wie man den Scheduler benutzt, um Jobs zu übermitteln, aber für den Moment kann er uns auch mehr Informationen über die Arbeiterknoten liefern.

Zum Beispiel können wir alle Arbeiterknoten anzeigen, indem wir den Befehl sinfo ausführen.

BASH

[yourUsername@login1 ~] sinfo

AUSGABE

PARTITION          AVAIL  TIMELIMIT  NODES  STATE NODELIST
cpubase_bycore_b1*    up   infinite      4   idle node[1-2],smnode[1-2]
node                  up   infinite      2   idle node[1-2]
smnode                up   infinite      2   idle smnode[1-2]

Es gibt auch spezialisierte Maschinen, die für die Verwaltung von Plattenspeicher, Benutzerauthentifizierung und andere infrastrukturbezogene Aufgaben verwendet werden. Obwohl wir uns normalerweise nicht direkt an diesen Maschinen anmelden oder mit ihnen interagieren, ermöglichen sie eine Reihe von Schlüsselfunktionen, wie z.B. die Sicherstellung, dass unser Benutzerkonto und unsere Dateien im gesamten HPC-System verfügbar sind.

Was befindet sich in einem Knoten?


Alle Knoten in einem HPC-System haben die gleichen Komponenten wie Ihr eigener Laptop oder Desktop: CPUs (manchmal auch Prozessoren oder Cores genannt), Speicher (oder RAM) und Festplattenspeicher. CPUs sind das Werkzeug eines Computers, um Programme und Berechnungen auszuführen. Informationen über eine aktuelle Aufgabe werden im Arbeitsspeicher des Computers gespeichert. Der Begriff “Festplatte” bezieht sich auf den gesamten Speicher, auf den wie auf ein Dateisystem zugegriffen werden kann. In der Regel handelt es sich dabei um Speicher, der Daten dauerhaft speichern kann, d. h. die Daten sind auch dann noch vorhanden, wenn der Computer neu gestartet wurde. Während dieser Speicher lokal sein kann (eine Festplatte ist darin installiert), ist es üblicher, dass Knoten mit einem gemeinsam genutzten, entfernten Dateiserver oder einem Cluster von Servern verbunden sind.

Knoten Anatomie
Knoten Anatomie

Erforsche deinen Computer

Versuchen Sie herauszufinden, wie viele CPUs und wie viel Arbeitsspeicher auf Ihrem persönlichen Computer verfügbar sind. Beachten Sie, dass Sie sich zuerst abmelden müssen, wenn Sie bei dem entfernten Computer-Cluster angemeldet sind. Geben Sie dazu Ctrl+d oder exit ein:

BASH

[yourUsername@login1 ~] exit
[you@laptop:~]$

Es gibt mehrere Möglichkeiten, dies zu tun. Die meisten Betriebssysteme haben einen grafischen Systemmonitor, wie den Windows Task Manager. Ausführlichere Informationen können manchmal über die Befehlszeile abgerufen werden. Einige der Befehle, die auf einem Linux-System verwendet werden, sind zum Beispiel:

Systemdienstprogramme ausführen

BASH

[you@laptop:~]$ nproc --all
[you@laptop:~]$ free -m

Lesen von /proc

BASH

[you@laptop:~]$ cat /proc/cpuinfo
[you@laptop:~]$ cat /proc/meminfo

Verwenden Sie einen Systemmonitor

BASH

[you@laptop:~]$ htop

Erkundung des Anmeldeknotens

Vergleichen Sie nun die Ressourcen Ihres Computers mit denen des Hauptknotens.

BASH

[you@laptop:~]$ ssh yourUsername@cluster.hpc-carpentry.org
[yourUsername@login1 ~] nproc --all
[yourUsername@login1 ~] free -m

Sie können mehr Informationen über die Prozessoren erhalten, indem Sie lscpu benutzen, und eine Menge Details über den Speicher, indem Sie die Datei /proc/meminfo lesen:

BASH

[yourUsername@login1 ~] less /proc/meminfo

Sie können auch die verfügbaren Dateisysteme mit df untersuchen, um disk free space anzuzeigen. Das Flag -h zeigt die Größen in einem menschenfreundlichen Format an, d.h. GB statt B. Das type Flag -T zeigt, welche Art von Dateisystem jede Ressource ist.

BASH

[yourUsername@login1 ~] df -Th

Diskussion

Die lokalen Dateisysteme (ext, tmp, xfs, zfs) hängen davon ab, ob Sie sich auf demselben Anmeldeknoten (oder Rechenknoten, später) befinden. Netzwerk-Dateisysteme (beegfs, cifs, gpfs, nfs, pvfs) werden ähnlich sein — können aber yourUsername enthalten, abhängig davon, wie es [gemountet] wird (https://en.wikipedia.org/wiki/Mount_(computing)).

Gemeinsame Dateisysteme

Dies ist ein wichtiger Punkt: Dateien, die auf einem Knoten (Computer) gespeichert sind, sind oft überall im Cluster verfügbar!

Explore a Worker Node

Finally, let’s look at the resources available on the worker nodes where your jobs will actually run. Try running this command to see the name, CPUs and memory available on one of the worker nodes:

BASH

[yourUsername@login1 ~] sinfo -o "%n %c %m" | column -t

Vergleichen Sie Ihren Computer, den Anmeldeknoten und den Berechnungsknoten

Vergleichen Sie die Anzahl der Prozessoren und des Arbeitsspeichers Ihres Laptops mit den Zahlen, die Sie auf dem Hauptknoten und dem Arbeitsknoten des Clusters sehen. Diskutieren Sie die Unterschiede mit Ihrem Nachbarn.

Was denken Sie, welche Auswirkungen die Unterschiede auf die Durchführung Ihrer Forschungsarbeit auf den verschiedenen Systemen und Knotenpunkten haben könnten?

Unterschiede zwischen den Knoten

Viele HPC-Cluster haben eine Vielzahl von Knoten, die für bestimmte Arbeitslasten optimiert sind. Einige Knoten verfügen über eine größere Speichermenge oder spezialisierte Ressourcen wie grafische Verarbeitungseinheiten (GPUs).

Mit all dem im Hinterkopf werden wir nun besprechen, wie man mit dem Scheduler des Clusters kommuniziert und ihn benutzt, um unsere Skripte und Programme laufen zu lassen!

Hauptpunkte

  • “Ein HPC-System ist eine Gruppe von vernetzten Maschinen.”
  • “HPC-Systeme bieten normalerweise Anmeldeknoten und eine Reihe von Arbeitsknoten.”
  • “Die Ressourcen, die sich auf unabhängigen (Arbeits-)Knoten befinden, können in Umfang und Art variieren (Menge des Arbeitsspeichers, Prozessorarchitektur, Verfügbarkeit von im Netzwerk eingebundenen Dateisystemen usw.).”
  • “Dateien, die auf einem Knoten gespeichert sind, sind auf allen Knoten verfügbar.”

Content from Grundlagen des Schedulers


Zuletzt aktualisiert am 2025-08-04 | Diese Seite bearbeiten

Übersicht

Fragen

  • Was ist ein Scheduler und warum braucht ein Cluster einen?
  • Wie starte ich ein Programm zur Ausführung auf einem Rechenknoten im Cluster?
  • Wie kann ich die Ausgabe eines Programms erfassen, das auf einem Knoten im Cluster ausgeführt wird?

Ziele

  • Übermittelt ein einfaches Skript an den Cluster.
  • Überwachen Sie die Ausführung von Aufträgen mit Hilfe von Kommandozeilenwerkzeugen.
  • Überprüfen Sie die Ausgabe- und Fehlerdateien Ihrer Aufträge.
  • Finden Sie den richtigen Ort, um große Datensätze auf dem Cluster abzulegen.

Job Scheduler


Ein HPC-System kann Tausende von Knoten und Tausende von Benutzern haben. Wie wird entschieden, wer was und wann bekommt? Wie wird sichergestellt, dass eine Aufgabe mit den erforderlichen Ressourcen ausgeführt wird? Diese Aufgabe wird von einer speziellen Software, dem Scheduler, übernommen. Auf einem HPC-System verwaltet der Scheduler, welche Aufgaben wo und wann ausgeführt werden.

Die folgende Abbildung vergleicht diese Aufgaben eines Job Schedulers mit denen eines Kellners in einem Restaurant. Wenn Sie sich vorstellen können, dass Sie eine Weile in einer Schlange warten mussten, um in ein beliebtes Restaurant zu kommen, dann verstehen Sie jetzt vielleicht, warum Ihr Job manchmal nicht sofort startet, wie bei Ihrem Laptop.

Vergleiche einen Job Scheduler mit einem Kellner in einem Restaurant

Der in dieser Lektion verwendete Scheduler ist Slurm. Obwohl Slurm nicht überall verwendet wird, ist die Ausführung von Aufträgen ziemlich ähnlich, unabhängig davon, welche Software verwendet wird. Die genaue Syntax kann sich ändern, aber die Konzepte bleiben die gleichen.

Ausführen eines Batch-Jobs


Die einfachste Anwendung des Schedulers ist die nicht-interaktive Ausführung eines Befehls. Jeder Befehl (oder eine Reihe von Befehlen), den Sie auf dem Cluster ausführen möchten, wird als Job bezeichnet, und der Prozess der Verwendung eines Schedulers zur Ausführung des Jobs wird Batch Job Submission genannt.

In diesem Fall handelt es sich bei dem Auftrag, den wir ausführen wollen, um ein Shell-Skript - im Wesentlichen eine Textdatei mit einer Liste von UNIX-Befehlen, die nacheinander ausgeführt werden sollen. Unser Shell-Skript wird aus drei Teilen bestehen:

  • In der allerersten Zeile fügen Sie #!/bin/bash ein. Das #! (ausgesprochen “hash-bang” oder “shebang”) sagt dem Computer, welches Programm den Inhalt dieser Datei verarbeiten soll. In diesem Fall teilen wir ihm mit, dass die folgenden Befehle für die Kommandozeilen-Shell geschrieben sind (in der wir bisher alles gemacht haben).
  • Irgendwo unterhalb der ersten Zeile fügen wir einen echo-Befehl mit einer freundlichen Begrüßung ein. Wenn es ausgeführt wird, gibt das Shell-Skript im Terminal alles aus, was nach echo kommt.
    • echo -n druckt alles, was folgt, ohne die Zeile mit einem Zeilenumbruch zu beenden.
  • In der letzten Zeile rufen wir den Befehl hostname auf, der den Namen des Rechners ausgibt, auf dem das Skript ausgeführt wird.

BASH

[yourUsername@login1 ~] nano example-job.sh

BASH

#!/bin/bash

echo -n "This script is running on "
hostname

Erstellen unseres Testjobs

Führen Sie das Skript aus. Wird es auf dem Cluster oder nur auf unserem Anmeldeknoten ausgeführt?

BASH

[yourUsername@login1 ~] bash example-job.sh

AUSGABE

This script is running on login1

Dieses Skript lief auf dem Anmeldeknoten, aber wir wollen die Vorteile der Rechenknoten nutzen: Wir brauchen den Scheduler, um example-job.sh in die Warteschlange zu stellen, damit er auf einem Rechenknoten läuft.

Um diese Aufgabe an den Scheduler zu senden, benutzen wir den Befehl sbatch. Dies erzeugt einen Job, der das Skript ausführt, wenn er an einen Rechenknoten gesendet wird, den das Warteschlangensystem als verfügbar für die Ausführung der Arbeit identifiziert hat.

BASH

[yourUsername@login1 ~] sbatch  example-job.sh

AUSGABE

Submitted batch job 7

Und das ist alles, was wir tun müssen, um einen Auftrag abzuschicken. Unsere Arbeit ist getan - jetzt übernimmt der Scheduler und versucht, den Auftrag für uns auszuführen. Während der Auftrag darauf wartet, ausgeführt zu werden, wird er in eine Liste von Aufträgen aufgenommen, die Warteschlange. Um den Status unseres Jobs zu überprüfen, können wir die Warteschlange mit dem Befehl squeue -u yourUsername überprüfen.

BASH

[yourUsername@login1 ~] squeue -u yourUsername

AUSGABE

JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
    9 cpubase_b example-   user01  R       0:05      1 node1

Wir können alle Details zu unserem Auftrag sehen, vor allem, dass er sich im Status R oder RUNNING befindet. Manchmal müssen unsere Aufträge in einer Warteschlange warten (PENDING) oder haben einen Fehler (E).

Wo ist die Ausgabe?

Auf dem Login-Knoten gab dieses Skript eine Ausgabe auf dem Terminal aus – aber jetzt, wenn squeue anzeigt, dass der Job beendet ist, wurde nichts auf dem Terminal ausgegeben.

Die Ausgabe eines Cluster-Jobs wird normalerweise in eine Datei in dem Verzeichnis umgeleitet, aus dem Sie ihn gestartet haben. Verwenden Sie ls zum Suchen und cat zum Lesen der Datei.

Anpassen eines Jobs


Der Auftrag, den wir gerade ausgeführt haben, verwendete alle Standardoptionen des Schedulers. In einem realen Szenario ist das wahrscheinlich nicht das, was wir wollen. Die Standardoptionen stellen ein vernünftiges Minimum dar. Wahrscheinlich benötigen wir mehr Kerne, mehr Arbeitsspeicher, mehr Zeit und andere spezielle Überlegungen. Um Zugang zu diesen Ressourcen zu erhalten, müssen wir unser Jobskript anpassen.

Kommentare in UNIX-Shell-Skripten (gekennzeichnet durch #) werden normalerweise ignoriert, aber es gibt Ausnahmen. Zum Beispiel gibt der spezielle Kommentar #! am Anfang von Skripten an, welches Programm benutzt werden soll, um es auszuführen (typischerweise steht hier #!/usr/bin/env bash). Scheduler wie Slurm haben auch einen speziellen Kommentar, um spezielle Scheduler-spezifische Optionen zu kennzeichnen. Obwohl diese Kommentare von Scheduler zu Scheduler unterschiedlich sind, ist der spezielle Kommentar von Slurm #SBATCH. Alles, was dem Kommentar #SBATCH folgt, wird als Anweisung an den Scheduler interpretiert.

Lassen Sie uns dies an einem Beispiel verdeutlichen. Standardmäßig ist der Name eines Jobs der Name des Skripts, aber mit der Option -J kann man den Namen eines Jobs ändern. Fügen Sie eine Option in das Skript ein:

BASH

[yourUsername@login1 ~] cat example-job.sh

BASH

#!/bin/bash
#SBATCH -J hello-world

echo -n "This script is running on "
hostname

Übermitteln Sie den Auftrag und überwachen Sie seinen Status:

BASH

[yourUsername@login1 ~] sbatch  example-job.sh
[yourUsername@login1 ~] squeue -u yourUsername

AUSGABE

JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
   10 cpubase_b hello-wo   user01  R       0:02      1 node1

Fantastisch, wir haben den Namen unseres Jobs erfolgreich geändert!

Ressourcenanfragen

Was ist mit wichtigeren Änderungen, wie der Anzahl der Kerne und des Speichers für unsere Jobs? Eine Sache, die bei der Arbeit an einem HPC-System absolut entscheidend ist, ist die Angabe der für die Ausführung eines Auftrags erforderlichen Ressourcen. So kann der Scheduler die richtige Zeit und den richtigen Ort für die Ausführung unseres Auftrags finden. Wenn Sie die Anforderungen (z. B. die benötigte Zeit) nicht angeben, werden Sie wahrscheinlich mit den Standardressourcen Ihrer Website arbeiten, was wahrscheinlich nicht das ist, was Sie wollen.

Es folgen mehrere wichtige Ressourcenanfragen:

  • --ntasks=<ntasks> oder -n <ntasks>: Wie viele CPU-Kerne benötigt Ihr Job insgesamt?

  • --time <days-hours:minutes:seconds> oder -t <days-hours:minutes:seconds>: Wie viel reale Zeit (Walltime) wird Ihr Job für die Ausführung benötigen? Der Teil <days> kann weggelassen werden.

  • --mem=<megabytes>: Wie viel Speicher auf einem Knoten benötigt Ihr Auftrag in Megabyte? Sie können auch Gigabytes angeben, indem Sie ein kleines “g” anhängen (Beispiel: --mem=5g)

  • --nodes=<nnodes> oder -N <nnodes>: Auf wie vielen separaten Rechnern muss Ihr Auftrag laufen? Beachten Sie, dass, wenn Sie ntasks auf eine Zahl setzen, die größer ist als die, die eine Maschine bieten kann, Slurm diesen Wert automatisch einstellt.

Beachten Sie, dass das bloße Anfordern dieser Ressourcen Ihren Auftrag nicht schneller laufen lässt und auch nicht unbedingt bedeutet, dass Sie alle diese Ressourcen verbrauchen werden. Es bedeutet nur, dass sie Ihnen zur Verfügung gestellt werden. Es kann sein, dass Ihr Auftrag am Ende weniger Speicher, weniger Zeit oder weniger Knoten benötigt, als Sie angefordert haben, und er wird trotzdem ausgeführt.

Es ist am besten, wenn Ihre Anfragen die Anforderungen Ihres Auftrags genau widerspiegeln. In einer späteren Folge dieser Lektion werden wir mehr darüber sprechen, wie Sie sicherstellen können, dass Sie die Ressourcen effektiv nutzen.

Übermittlung von Ressourcenanfragen

Ändern Sie unser hostname-Skript so, dass es eine Minute lang läuft, und senden Sie dann einen Job dafür an den Cluster.

BASH

[yourUsername@login1 ~] cat example-job.sh

BASH

#!/bin/bash
#SBATCH -t 00:01 # timeout in HH:MM

echo -n "This script is running on "
sleep 20 # time in seconds
hostname

BASH

[yourUsername@login1 ~] sbatch  example-job.sh

Warum sind die Slurm Laufzeit und die sleep Zeit nicht identisch?

Ressourcenanforderungen sind normalerweise verbindlich. Wenn Sie diese überschreiten, wird Ihr Auftrag abgebrochen. Nehmen wir die Wandzeit als Beispiel. Wir fordern 1 Minute Wandzeit an und versuchen, einen Auftrag zwei Minuten lang laufen zu lassen.

BASH

[yourUsername@login1 ~] cat example-job.sh

BASH

#!/bin/bash
#SBATCH -J long_job
#SBATCH -t 00:01 # timeout in HH:MM

echo "This script is running on ... "
sleep 240 # time in seconds
hostname

Senden Sie den Auftrag ab und warten Sie, bis er beendet ist. Sobald er beendet ist, überprüfen Sie die Protokolldatei.

BASH

[yourUsername@login1 ~] sbatch  example-job.sh
[yourUsername@login1 ~] squeue -u yourUsername

BASH

[yourUsername@login1 ~] cat slurm-12.out

AUSGABE

This script is running on ...
slurmstepd: error: *** JOB 12 ON node1 CANCELLED AT 2021-02-19T13:55:57
DUE TO TIME LIMIT ***

Unser Auftrag wurde abgebrochen, weil er die angeforderte Menge an Ressourcen überschritten hat. Obwohl dies hart erscheint, handelt es sich dabei um eine Funktion. Die strikte Einhaltung der Ressourcenanforderungen ermöglicht es dem Scheduler, den bestmöglichen Platz für Ihre Jobs zu finden. Noch wichtiger ist jedoch, dass dadurch sichergestellt wird, dass ein anderer Benutzer nicht mehr Ressourcen verwenden kann, als ihm zugewiesen wurden. Wenn ein anderer Benutzer einen Fehler macht und versehentlich versucht, alle Kerne oder den gesamten Speicher eines Knotens zu nutzen, wird Slurm entweder seinen Job auf die angeforderten Ressourcen beschränken oder den Job ganz beenden. Andere Jobs auf dem Knoten sind davon nicht betroffen. Das bedeutet, dass ein Benutzer nicht die Erfahrungen anderer Benutzer durcheinander bringen kann, die einzigen Jobs, die von einem Fehler in der Planung betroffen sind, sind die eigenen.

Abbrechen eines Jobs


Manchmal machen wir einen Fehler und müssen einen Auftrag abbrechen. Das kann man mit dem Befehl scancel machen. Lassen Sie uns einen Job abschicken und ihn dann mit seiner Jobnummer abbrechen (denken Sie daran, die Walltime so zu ändern, dass er lange genug läuft, damit Sie ihn abbrechen können, bevor er beendet wird).

BASH

[yourUsername@login1 ~] sbatch  example-job.sh
[yourUsername@login1 ~] squeue -u yourUsername

AUSGABE

Submitted batch job 13

JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
   13 cpubase_b long_job   user01  R       0:02      1 node1

Stornieren Sie nun den Auftrag mit seiner Auftragsnummer (die in Ihrem Terminal ausgedruckt wird). Eine saubere Rückkehr Ihrer Eingabeaufforderung zeigt an, dass die Anfrage zum Abbrechen des Auftrags erfolgreich war.

BASH

[yourUsername@login1 ~] scancel 38759
# It might take a minute for the job to disappear from the queue...
[yourUsername@login1 ~] squeue -u yourUsername

AUSGABE

JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)

Abbrechen mehrerer Jobs

Wir können auch alle unsere Aufträge auf einmal mit der Option -u löschen. Damit werden alle Aufträge für einen bestimmten Benutzer (in diesem Fall für Sie selbst) gelöscht. Beachten Sie, dass Sie nur Ihre eigenen Aufträge löschen können.

Versuchen Sie, mehrere Aufträge einzureichen und sie dann alle abzubrechen.

Übermitteln Sie zunächst ein Trio von Jobs:

BASH

[yourUsername@login1 ~] sbatch  example-job.sh
[yourUsername@login1 ~] sbatch  example-job.sh
[yourUsername@login1 ~] sbatch  example-job.sh

Dann brechen Sie sie alle ab:

BASH

[yourUsername@login1 ~] scancel -u yourUsername

Andere Arten von Jobs


Bis zu diesem Punkt haben wir uns auf die Ausführung von Jobs im Batch-Modus konzentriert. Slurm bietet auch die Möglichkeit, eine interaktive Sitzung zu starten.

Es gibt sehr häufig Aufgaben, die interaktiv erledigt werden müssen. Ein ganzes Job-Skript zu erstellen, wäre vielleicht übertrieben, aber die Menge der benötigten Ressourcen ist zu groß für einen Login-Knoten. Ein gutes Beispiel hierfür ist die Erstellung eines Genomindexes für das Alignment mit einem Tool wie HISAT2. Glücklicherweise können wir diese Art von Aufgaben einmalig mit srun ausführen.

srun führt einen einzelnen Befehl auf dem Cluster aus und beendet sich dann. Lassen Sie uns dies demonstrieren, indem wir den Befehl hostname mit srun ausführen. (Wir können einen srun-Job mit Ctrl-c abbrechen.)

BASH

[yourUsername@login1 ~] srun hostname

AUSGABE

smnode1

srun akzeptiert die gleichen Optionen wie sbatch. Allerdings werden diese Optionen nicht in einem Skript angegeben, sondern auf der Kommandozeile, wenn ein Job gestartet wird. Um einen Job zu starten, der 2 CPUs benutzt, könnte man z.B. den folgenden Befehl verwenden:

BASH

[yourUsername@login1 ~] srun -n 2 echo "This job will use 2 CPUs."

AUSGABE

This job will use 2 CPUs.
This job will use 2 CPUs.

Typischerweise wird die resultierende Shell-Umgebung die gleiche sein wie die für sbatch.

Interaktive Jobs

Manchmal braucht man viele Ressourcen für die interaktive Nutzung. Vielleicht führen wir zum ersten Mal eine Analyse durch oder versuchen, einen Fehler zu beheben, der bei einem früheren Auftrag aufgetreten ist. Glücklicherweise macht es Slurm einfach, einen interaktiven Job mit srun zu starten:

BASH

[yourUsername@login1 ~] srun --pty bash

Sie sollten nun eine Bash-Eingabeaufforderung erhalten. Beachten Sie, dass sich die Eingabeaufforderung wahrscheinlich ändert, um Ihren neuen Standort wiederzugeben, in diesem Fall den Rechenknoten, an dem wir angemeldet sind. Sie können dies auch mit hostname überprüfen.

Erstellen von Remote-Grafiken

Um die grafische Ausgabe innerhalb Ihrer Aufträge zu sehen, müssen Sie die X11-Weiterleitung verwenden. Um diese Funktion zu aktivieren, verwenden Sie die Option -Y, wenn Sie sich mit dem Befehl ssh anmelden, z.B. ssh -Y yourUsername@cluster.hpc-carpentry.org.

Um zu demonstrieren, was passiert, wenn Sie ein Grafikfenster auf dem entfernten Knoten erstellen, verwenden Sie den Befehl xeyes. Ein relativ hübsches Augenpaar sollte auftauchen (drücken Sie Ctrl-C, um zu stoppen). Wenn Sie einen Mac verwenden, müssen Sie XQuartz installiert (und Ihren Computer neu gestartet) haben, damit dies funktioniert.

Wenn Ihr Cluster das slurm-spank-x11 Plugin installiert hat, können Sie die X11-Weiterleitung innerhalb interaktiver Jobs sicherstellen, indem Sie die Option --x11 für srun mit dem Befehl srun --x11 --pty bash verwenden.

Wenn Sie mit dem interaktiven Job fertig sind, geben Sie exit ein, um Ihre Sitzung zu beenden.

Hauptpunkte

  • Der Scheduler verwaltet die Aufteilung der Rechenressourcen zwischen den Benutzern.
  • Ein Job ist einfach ein Shell-Skript.
  • Fordern Sie geringfügig mehr Ressourcen an, als Sie brauchen werden.

Content from Umgebungsvariablen


Zuletzt aktualisiert am 2025-08-04 | Diese Seite bearbeiten

Übersicht

Fragen

  • Wie werden Variablen in der Unix-Shell gesetzt und angesprochen?
  • Wie kann ich Variablen verwenden, um den Ablauf eines Programms zu verändern?

Ziele

  • Verstehen, wie Variablen in der Shell implementiert werden
  • Liest den Wert einer bestehenden Variable
  • Erstellen Sie neue Variablen und ändern Sie deren Werte
  • Ändern Sie das Verhalten eines Programms mit Hilfe einer Umgebungsvariablen
  • Erkläre, wie die Shell die Variable PATH benutzt, um nach ausführbaren Dateien zu suchen

Episode provenance

Diese Folge wurde aus der [Shell-Extras-Folge über Shell-Variablen] (https://github.com/carpentries-incubator/shell-extras/blob/gh-pages/_episodes/08-environment-variables.md) und der [HPC-Shell-Folge über Skripte] (https://github.com/hpc-carpentry/hpc-shell/blob/gh-pages/_episodes/05-scripts.md) neu zusammengestellt.

Die Shell ist nur ein Programm, und wie andere Programme auch, hat sie Variablen. Diese Variablen steuern ihre Ausführung, so dass Sie durch Ändern ihrer Werte das Verhalten der Shell (und mit etwas mehr Aufwand auch das Verhalten anderer Programme) beeinflussen können.

Variablen sind eine gute Möglichkeit, Informationen unter einem Namen zu speichern, auf den man später zugreifen kann. In Programmiersprachen wie Python und R können Variablen so ziemlich alles speichern, was man sich vorstellen kann. In der Shell speichern sie normalerweise nur Text. Der beste Weg, um zu verstehen, wie sie funktionieren, ist, sie in Aktion zu sehen.

Beginnen wir damit, den Befehl set auszuführen und einige der Variablen in einer typischen Shell-Sitzung zu betrachten:

BASH

set

AUSGABE

COMPUTERNAME=TURING
HOME=/home/vlad
HOSTNAME=TURING
HOSTTYPE=i686
NUMBER_OF_PROCESSORS=4
PATH=/Users/vlad/bin:/usr/local/git/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin
PWD=/home/vlad
UID=1000
USERNAME=vlad
...

Wie Sie sehen können, gibt es ziemlich viele - tatsächlich vier- oder fünfmal so viele, wie hier gezeigt werden. Und ja, set zu benutzen, um Dinge anzuzeigen, mag ein wenig seltsam erscheinen, selbst für Unix, aber wenn Sie ihr keine Argumente geben, kann sie Ihnen auch Dinge zeigen, die Sie einstellen könnten.

Jede Variable hat einen Namen. Alle Werte von Shell-Variablen sind Zeichenketten, auch solche (wie UID), die wie Zahlen aussehen. Es liegt an den Programmen, diese Zeichenketten bei Bedarf in andere Typen zu konvertieren. Wenn ein Programm zum Beispiel herausfinden wollte, wie viele Prozessoren der Computer hat, würde es den Wert der Variablen NUMBER_OF_PROCESSORS von einer Zeichenkette in eine ganze Zahl umwandeln.

Den Wert einer Variablen anzeigen


Zeigen wir den Wert der Variable HOME:

BASH

echo HOME

AUSGABE

HOME

Das gibt nur “HOME” aus, was nicht das ist, was wir wollten (obwohl es das ist, wonach wir eigentlich gefragt haben). Versuchen wir stattdessen dies:

BASH

echo $HOME

AUSGABE

/home/vlad

Das Dollarzeichen sagt der Shell, dass wir den Wert der Variable wollen und nicht ihren Namen. Das funktioniert genau wie bei Wildcards: die Shell ersetzt die Variable vor der Ausführung des gewünschten Programms. Dank dieser Erweiterung ist das, was wir tatsächlich ausführen, echo /home/vlad, was das Richtige anzeigt.

Erstellen und Ändern von Variablen


Eine Variable zu erstellen ist einfach - wir weisen einem Namen mit “=” einen Wert zu (wir müssen nur daran denken, dass die Syntax verlangt, dass keine Leerzeichen um das = herum sind!)

BASH

SECRET_IDENTITY=Dracula
echo $SECRET_IDENTITY

AUSGABE

Dracula

Um den Wert zu ändern, weisen Sie einfach einen neuen Wert zu:

BASH

SECRET_IDENTITY=Camilla
echo $SECRET_IDENTITY

AUSGABE

Camilla

Umgebungsvariablen


Als wir den set-Befehl ausführten, sahen wir, dass es eine Menge Variablen gab, deren Namen in Großbuchstaben geschrieben waren. Das liegt daran, dass Variablen, die auch von anderen Programmen verwendet werden können, in Großbuchstaben benannt werden. Solche Variablen werden Umgebungsvariablen genannt, da es sich um Shell-Variablen handelt, die für die aktuelle Shell definiert sind und an alle untergeordneten Shells oder Prozesse vererbt werden.

Um eine Umgebungsvariable zu erstellen, müssen Sie eine Shell-Variable export angeben. Um zum Beispiel unser SECRET_IDENTITY für andere Programme, die wir von unserer Shell aus aufrufen, verfügbar zu machen, können wir folgendes tun:

BASH

SECRET_IDENTITY=Camilla
export SECRET_IDENTITY

Sie können die Variable auch in einem einzigen Schritt erstellen und exportieren:

BASH

export SECRET_IDENTITY=Camilla

Verwendung von Umgebungsvariablen zur Änderung des Programmverhaltens

Setze eine Shell-Variable TIME_STYLE auf den Wert iso und prüfe diesen Wert mit dem Befehl echo.

Führen Sie nun den Befehl ls mit der Option -l aus (was ein langes Format ergibt).

export die Variable und führen Sie den Befehl ls -l erneut aus. Bemerkst du einen Unterschied?

Die Variable TIME_STYLE wird von ls nicht gesehen, bis sie exportiert wird. Zu diesem Zeitpunkt wird sie von ls benutzt, um zu entscheiden, welches Datumsformat bei der Darstellung des Zeitstempels von Dateien zu verwenden ist.

Sie können den kompletten Satz von Umgebungsvariablen in Ihrer aktuellen Shell-Sitzung mit dem Befehl env sehen (der eine Teilmenge dessen zurückgibt, was der Befehl set uns gegeben hat). Der komplette Satz von Umgebungsvariablen wird als Laufzeitumgebung bezeichnet und kann das Verhalten der von Ihnen ausgeführten Programme beeinflussen.

Job-Umgebungsvariablen

Wenn Slurm einen Job ausführt, setzt es eine Reihe von Umgebungsvariablen für den Job. Mit einer dieser Variablen können wir überprüfen, von welchem Verzeichnis aus unser Job-Skript eingereicht wurde. Die Variable SLURM_SUBMIT_DIR wird auf das Verzeichnis gesetzt, von dem aus unser Job eingereicht wurde. Ändern Sie Ihren Job mit Hilfe der Variable SLURM_SUBMIT_DIR so, dass er das Verzeichnis ausgibt, von dem aus der Job übermittelt wurde.

BASH

[yourUsername@login1 ~] nano example-job.sh
[yourUsername@login1 ~] cat example-job.sh

AUSGABE

#!/bin/bash
#SBATCH -t 00:00:30

echo -n "This script is running on "
hostname

echo "This job was launched in the following directory:"
echo ${SLURM_SUBMIT_DIR}

Um eine Variable oder Umgebungsvariable zu entfernen, können Sie zum Beispiel den Befehl unset verwenden:

BASH

unset SECRET_IDENTITY

Die PATH Umgebungsvariable


In ähnlicher Weise speichern einige Umgebungsvariablen (wie PATH) Listen von Werten. In diesem Fall ist die Konvention, einen Doppelpunkt ‘:’ als Trennzeichen zu verwenden. Wenn ein Programm die einzelnen Elemente einer solchen Liste benötigt, muss es den String-Wert der Variablen in Stücke aufteilen.

Schauen wir uns die Variable PATH genauer an. Ihr Wert definiert den Suchpfad der Shell für ausführbare Programme, d.h. die Liste der Verzeichnisse, in denen die Shell nach ausführbaren Programmen sucht, wenn Sie einen Programmnamen eintippen, ohne anzugeben, in welchem Verzeichnis er sich befindet.

Wenn wir zum Beispiel einen Befehl wie analyze eingeben, muss die Shell entscheiden, ob sie ./analyze oder /bin/analyze ausführen soll. Die Regel, die sie dabei anwendet, ist einfach: Die Shell prüft jedes Verzeichnis in der Variablen PATH der Reihe nach und sucht nach einem Programm mit dem gewünschten Namen in diesem Verzeichnis. Sobald sie eine Übereinstimmung findet, hört sie auf zu suchen und führt das Programm aus.

Um zu zeigen, wie das funktioniert, sind hier die Komponenten von PATH aufgelistet, eine pro Zeile:

AUSGABE

/Users/vlad/bin
/usr/local/git/bin
/usr/bin
/bin
/usr/sbin
/sbin
/usr/local/bin

Auf unserem Computer gibt es eigentlich drei Programme namens analyze in drei verschiedenen Verzeichnissen: /bin/analyze, /usr/local/bin/analyze, und /users/vlad/analyze. Da die Shell die Verzeichnisse in der Reihenfolge durchsucht, in der sie in PATH aufgelistet sind, findet sie /bin/analyze zuerst und führt es aus. Beachten Sie, dass sie das Programm /users/vlad/analyze nie finden wird, es sei denn, wir geben den vollständigen Pfad zum Programm ein, da das Verzeichnis /users/vlad nicht in PATH enthalten ist.

Das bedeutet, dass ich ausführbare Dateien an vielen verschiedenen Orten haben kann, solange ich daran denke, dass ich mein PATH aktualisieren muss, damit meine Shell sie finden kann.

Was ist, wenn ich zwei verschiedene Versionen desselben Programms ausführen möchte? Da sie den gleichen Namen haben, wird, wenn ich sie beide zu meinem PATH hinzufüge, immer die erste gefundene Version gewinnen. In der nächsten Folge werden wir lernen, wie wir Hilfsmittel verwenden können, die uns bei der Verwaltung unserer Laufzeitumgebung helfen, damit dies möglich ist, ohne dass wir eine Menge Buchhaltung darüber führen müssen, welchen Wert PATH (und andere wichtige Umgebungsvariablen) haben oder haben sollten.

Hauptpunkte

  • Shell-Variablen werden standardmäßig als Zeichenketten behandelt
  • Variablen werden mit “=” zugewiesen und mit dem Variablennamen, dem “$” vorangestellt ist, abgerufen
  • Verwenden Sie “export”, um eine Variable für andere Programme verfügbar zu machen
  • Die Variable PATH definiert den Suchpfad der Shell

Content from Zugriff auf Software über Module


Zuletzt aktualisiert am 2025-08-04 | Diese Seite bearbeiten

Übersicht

Fragen

  • Wie laden und entladen wir Softwarepakete?

Ziele

  • Ein Softwarepaket laden und verwenden.
  • Erklären Sie, wie sich die Shell-Umgebung verändert, wenn der Modulmechanismus Pakete lädt oder entlädt.

Auf einem Hochleistungsrechnersystem ist die Software, die wir benutzen wollen, selten verfügbar, wenn wir uns anmelden. Sie ist zwar installiert, aber wir müssen sie erst “laden”, bevor sie ausgeführt werden kann.

Bevor wir jedoch anfangen, einzelne Softwarepakete zu verwenden, sollten wir die Gründe für diesen Ansatz verstehen. Die drei wichtigsten Faktoren sind:

  • Software-Inkompatibilitäten
  • Versionierung
  • Abhängigkeiten

Software-Inkompatibilität ist ein großes Problem für Programmierer. Manchmal führt das Vorhandensein (oder Fehlen) eines Softwarepakets dazu, dass andere Pakete, die davon abhängen, nicht mehr funktionieren. Zwei bekannte Beispiele sind Python und C-Compiler-Versionen. Python 3 bietet bekanntlich einen python-Befehl, der im Widerspruch zu dem von Python 2 steht. Software, die mit einer neueren Version der C-Bibliotheken kompiliert und dann auf einem Rechner ausgeführt wird, auf dem ältere C-Bibliotheken installiert sind, führt zu einem unangenehmen 'GLIBCXX_3.4.20' not found-Fehler.

Software Versionierung ist ein weiteres häufiges Problem. Ein Team könnte für sein Forschungsprojekt auf eine bestimmte Paketversion angewiesen sein - wenn sich die Softwareversion ändert (z.B. wenn ein Paket aktualisiert wird), könnte dies die Ergebnisse beeinflussen. Durch den Zugriff auf mehrere Softwareversionen kann eine Gruppe von Forschern verhindern, dass Softwareversionsprobleme ihre Ergebnisse beeinträchtigen.

Von Abhängigkeiten spricht man, wenn ein bestimmtes Softwarepaket (oder sogar eine bestimmte Version) vom Zugriff auf ein anderes Softwarepaket (oder sogar eine bestimmte Version eines anderen Softwarepakets) abhängig ist. Zum Beispiel kann die VASP-Materialwissenschaftssoftware davon abhängen, dass eine bestimmte Version der FFTW-Softwarebibliothek (Fastest Fourier Transform in the West) verfügbar ist, damit sie funktioniert.

Umgebungsmodule


Umgebungsmodule sind die Lösung für diese Probleme. Ein Modul ist eine in sich geschlossene Beschreibung eines Softwarepakets - es enthält die Einstellungen, die zum Ausführen eines Softwarepakets erforderlich sind, und kodiert in der Regel auch die erforderlichen Abhängigkeiten von anderen Softwarepaketen.

Es gibt eine Reihe von verschiedenen Implementierungen von Umgebungsmodulen, die häufig auf HPC-Systemen verwendet werden: die beiden häufigsten sind TCL-Module und Lmod. Beide verwenden eine ähnliche Syntax und die Konzepte sind die gleichen, so dass Sie, wenn Sie lernen, eines davon zu verwenden, dasjenige verwenden können, das auf dem von Ihnen verwendeten System installiert ist. In beiden Implementierungen wird der Befehl module verwendet, um mit Umgebungsmodulen zu interagieren. Normalerweise wird dem Befehl ein zusätzlicher Unterbefehl hinzugefügt, um anzugeben, was Sie tun wollen. Für eine Liste von Unterbefehlen können Sie module -h oder module help verwenden. Wie für alle Befehle können Sie die vollständige Hilfe auf den man-Seiten mit man module aufrufen.

Bei der Anmeldung können Sie mit einem Standardsatz von geladenen Modulen oder mit einer leeren Umgebung starten; dies hängt von der Einrichtung des von Ihnen verwendeten Systems ab.

Auflistung der verfügbaren Module

Um verfügbare Softwaremodule zu sehen, verwenden Sie module avail:

BASH

[yourUsername@login1 ~] module avail

AUSGABE

~~~ /cvmfs/pilot.eessi-hpc.org/2020.12/software/x86_64/amd/zen2/modules/all ~~~
  Bazel/3.6.0-GCCcore-x.y.z              NSS/3.51-GCCcore-x.y.z
  Bison/3.5.3-GCCcore-x.y.z              Ninja/1.10.0-GCCcore-x.y.z
  Boost/1.72.0-gompi-2020a               OSU-Micro-Benchmarks/5.6.3-gompi-2020a
  CGAL/4.14.3-gompi-2020a-Python-3.x.y   OpenBLAS/0.3.9-GCC-x.y.z
  CMake/3.16.4-GCCcore-x.y.z             OpenFOAM/v2006-foss-2020a

[removed most of the output here for clarity]

  Where:
   L:        Module is loaded
   Aliases:  Aliases exist: foo/1.2.3 (1.2) means that "module load foo/1.2"
             will load foo/1.2.3
   D:        Default Module

Use "module spider" to find all possible modules and extensions.
Use "module keyword key1 key2 ..." to search for all possible modules matching
any of the "keys".

Auflistung der aktuell geladenen Module

Sie können den Befehl module list verwenden, um zu sehen, welche Module Sie derzeit in Ihrer Umgebung geladen haben. Wenn Sie keine Module geladen haben, werden Sie eine Meldung sehen, die Ihnen dies mitteilt

BASH

[yourUsername@login1 ~] module list

AUSGABE

No Modulefiles Currently Loaded.

Laden und Entladen von Software


Um ein Softwaremodul zu laden, verwenden Sie module load. In diesem Beispiel werden wir Python 3 verwenden.

Anfangs ist Python 3 nicht geladen. Wir können dies mit dem Befehl which testen. der Befehl which sucht auf die gleiche Weise wie die Bash nach Programmen, so dass wir ihn verwenden können, um uns zu sagen, wo ein bestimmtes Stück Software gespeichert ist.

BASH

[yourUsername@login1 ~] which python3

Wenn der Befehl python3 nicht verfügbar wäre, würden wir folgende Ausgabe sehen

AUSGABE

/usr/bin/which: no python3 in (/cvmfs/pilot.eessi-hpc.org/2020.12/compat/linux/x86_64/usr/bin:/opt/software/slurm/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/opt/puppetlabs/bin:/home/yourUsername/.local/bin:/home/yourUsername/bin)

Beachten Sie, dass dieser Text in Wirklichkeit eine Liste ist, mit Werten, die durch das Zeichen : getrennt sind. Die Ausgabe sagt uns, dass der Befehl which die folgenden Verzeichnisse nach python3 durchsucht hat, ohne Erfolg:

AUSGABE

/cvmfs/pilot.eessi-hpc.org/2020.12/compat/linux/x86_64/usr/bin
/opt/software/slurm/bin
/usr/local/bin
/usr/bin
/usr/local/sbin
/usr/sbin
/opt/puppetlabs/bin
/home/yourUsername/.local/bin
/home/yourUsername/bin

In unserem Fall haben wir jedoch ein vorhandenes python3 zur Verfügung, so dass wir sehen

AUSGABE

/cvmfs/pilot.eessi-hpc.org/2020.12/compat/linux/x86_64/usr/bin/python3

Wir benötigen jedoch ein anderes Python als das vom System bereitgestellte, also laden wir ein Modul, um darauf zuzugreifen.

Wir können den Befehl python3 mit module load laden:

BASH

[yourUsername@login1 ~] module load Python
[yourUsername@login1 ~] which python3

AUSGABE

/cvmfs/pilot.eessi-hpc.org/2020.12/software/x86_64/amd/zen2/software/Python/3.x.y-GCCcore-x.y.z/bin/python3

Was ist gerade passiert?

Um die Ausgabe zu verstehen, müssen wir zuerst die Natur der Umgebungsvariablen $PATH verstehen. $PATH ist eine spezielle Umgebungsvariable, die steuert, wo ein UNIX-System nach Software sucht. Genauer gesagt ist $PATH eine Liste von Verzeichnissen (getrennt durch :), die das Betriebssystem nach einem Befehl durchsucht, bevor es aufgibt und uns mitteilt, dass es ihn nicht finden kann. Wie bei allen Umgebungsvariablen können wir sie mit echo ausgeben.

BASH

[yourUsername@login1 ~] echo $PATH

AUSGABE

/cvmfs/pilot.eessi-hpc.org/2020.12/software/x86_64/amd/zen2/software/Python/3.x.y-GCCcore-x.y.z/bin:/cvmfs/pilot.eessi-hpc.org/2020.12/software/x86_64/amd/zen2/software/SQLite/3.31.1-GCCcore-x.y.z/bin:/cvmfs/pilot.eessi-hpc.org/2020.12/software/x86_64/amd/zen2/software/Tcl/8.6.10-GCCcore-x.y.z/bin:/cvmfs/pilot.eessi-hpc.org/2020.12/software/x86_64/amd/zen2/software/GCCcore/x.y.z/bin:/cvmfs/pilot.eessi-hpc.org/2020.12/compat/linux/x86_64/usr/bin:/opt/software/slurm/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/opt/puppetlabs/bin:/home/user01/.local/bin:/home/user01/bin

Sie werden eine Ähnlichkeit mit der Ausgabe des Befehls which feststellen. In diesem Fall gibt es nur einen Unterschied: das andere Verzeichnis am Anfang. Als wir den Befehl module load ausführten, fügte er ein Verzeichnis am Anfang unserer $PATH hinzu. Schauen wir uns an, was dort steht:

BASH

[yourUsername@login1 ~] ls /cvmfs/pilot.eessi-hpc.org/2020.12/software/x86_64/amd/zen2/software/Python/3.x.y-GCCcore-x.y.z/bin

AUSGABE

2to3              nosetests-3.8  python                 rst2s5.py
2to3-3.8          pasteurize     python3                rst2xetex.py
chardetect        pbr            python3.8              rst2xml.py
cygdb             pip            python3.8-config       rstpep2html.py
cython            pip3           python3-config         runxlrd.py
cythonize         pip3.8         rst2html4.py           sphinx-apidoc
easy_install      pybabel        rst2html5.py           sphinx-autogen
easy_install-3.8  __pycache__    rst2html.py            sphinx-build
futurize          pydoc3         rst2latex.py           sphinx-quickstart
idle3             pydoc3.8       rst2man.py             tabulate
idle3.8           pygmentize     rst2odt_prepstyles.py  virtualenv
netaddr           pytest         rst2odt.py             wheel
nosetests         py.test        rst2pseudoxml.py

Um es auf den Punkt zu bringen: module load fügt Software zu Ihrem $PATH hinzu. Es “lädt” Software. Ein spezieller Hinweis dazu - je nachdem, welche Version des Programms module bei Ihnen installiert ist, wird module load auch erforderliche Software-Abhängigkeiten laden.

Zur Veranschaulichung wollen wir module list verwenden. module list zeigt alle geladenen Softwaremodule an.

BASH

[yourUsername@login1 ~] module list

AUSGABE

Currently Loaded Modules:
  1) GCCcore/x.y.z                 4) GMP/6.2.0-GCCcore-x.y.z
  2) Tcl/8.6.10-GCCcore-x.y.z      5) libffi/3.3-GCCcore-x.y.z
  3) SQLite/3.31.1-GCCcore-x.y.z   6) Python/3.x.y-GCCcore-x.y.z

BASH

[yourUsername@login1 ~] module load GROMACS
[yourUsername@login1 ~] module list

AUSGABE

Currently Loaded Modules:
  1) GCCcore/x.y.z                    14) libfabric/1.11.0-GCCcore-x.y.z
  2) Tcl/8.6.10-GCCcore-x.y.z         15) PMIx/3.1.5-GCCcore-x.y.z
  3) SQLite/3.31.1-GCCcore-x.y.z      16) OpenMPI/4.0.3-GCC-x.y.z
  4) GMP/6.2.0-GCCcore-x.y.z          17) OpenBLAS/0.3.9-GCC-x.y.z
  5) libffi/3.3-GCCcore-x.y.z         18) gompi/2020a
  6) Python/3.x.y-GCCcore-x.y.z       19) FFTW/3.3.8-gompi-2020a
  7) GCC/x.y.z                        20) ScaLAPACK/2.1.0-gompi-2020a
  8) numactl/2.0.13-GCCcore-x.y.z     21) foss/2020a
  9) libxml2/2.9.10-GCCcore-x.y.z     22) pybind11/2.4.3-GCCcore-x.y.z-Pytho...
 10) libpciaccess/0.16-GCCcore-x.y.z  23) SciPy-bundle/2020.03-foss-2020a-Py...
 11) hwloc/2.2.0-GCCcore-x.y.z        24) networkx/2.4-foss-2020a-Python-3.8...
 12) libevent/2.1.11-GCCcore-x.y.z    25) GROMACS/2020.1-foss-2020a-Python-3...
 13) UCX/1.8.0-GCCcore-x.y.z

In diesem Fall hat das Laden des Moduls GROMACS (ein Bioinformatik-Softwarepaket) auch GMP/6.2.0-GCCcore-x.y.z und SciPy-bundle/2020.03-foss-2020a-Python-3.x.y geladen. Lassen Sie uns versuchen, das Paket GROMACS zu entladen.

BASH

[yourUsername@login1 ~] module unload GROMACS
[yourUsername@login1 ~] module list

AUSGABE

Currently Loaded Modules:
  1) GCCcore/x.y.z                    13) UCX/1.8.0-GCCcore-x.y.z
  2) Tcl/8.6.10-GCCcore-x.y.z         14) libfabric/1.11.0-GCCcore-x.y.z
  3) SQLite/3.31.1-GCCcore-x.y.z      15) PMIx/3.1.5-GCCcore-x.y.z
  4) GMP/6.2.0-GCCcore-x.y.z          16) OpenMPI/4.0.3-GCC-x.y.z
  5) libffi/3.3-GCCcore-x.y.z         17) OpenBLAS/0.3.9-GCC-x.y.z
  6) Python/3.x.y-GCCcore-x.y.z       18) gompi/2020a
  7) GCC/x.y.z                        19) FFTW/3.3.8-gompi-2020a
  8) numactl/2.0.13-GCCcore-x.y.z     20) ScaLAPACK/2.1.0-gompi-2020a
  9) libxml2/2.9.10-GCCcore-x.y.z     21) foss/2020a
 10) libpciaccess/0.16-GCCcore-x.y.z  22) pybind11/2.4.3-GCCcore-x.y.z-Pytho...
 11) hwloc/2.2.0-GCCcore-x.y.z        23) SciPy-bundle/2020.03-foss-2020a-Py...
 12) libevent/2.1.11-GCCcore-x.y.z    24) networkx/2.4-foss-2020a-Python-3.x.y

Die Verwendung von module unload “entlädt” also ein Modul, und je nachdem, wie eine Site konfiguriert ist, kann es auch alle Abhängigkeiten entladen (in unserem Fall nicht). Wenn wir alles auf einmal entladen wollten, könnten wir module purge ausführen (entlädt alles).

BASH

[yourUsername@login1 ~] module purge
[yourUsername@login1 ~] module list

AUSGABE

No modules loaded

Beachten Sie, dass module purge informativ ist. Es teilt uns auch mit, ob ein Standardsatz von “klebrigen” Paketen nicht entladen werden kann (und wie man diese tatsächlich entlädt, wenn man das wirklich möchte).

Beachten Sie, dass dieser Modulladeprozess hauptsächlich durch die Manipulation von Umgebungsvariablen wie $PATH erfolgt. Normalerweise ist nur ein geringer oder gar kein Datentransfer beteiligt.

Der Modulladeprozess manipuliert auch andere spezielle Umgebungsvariablen, einschließlich Variablen, die beeinflussen, wo das System nach Softwarebibliotheken sucht, und manchmal Variablen, die kommerziellen Softwarepaketen mitteilen, wo sie Lizenzserver finden.

Der Modulbefehl setzt auch diese Shell-Umgebungsvariablen in ihren vorherigen Zustand zurück, wenn ein Modul entladen wird.

Software-Versionierung


Bis jetzt haben wir gelernt, wie man Softwarepakete lädt und entlädt. Das ist sehr nützlich. Wir haben uns jedoch noch nicht mit dem Thema der Softwareversionierung befasst. Irgendwann werden Sie auf Probleme stoßen, für die nur eine bestimmte Version einer Software geeignet ist. Vielleicht wurde ein wichtiger Fehler nur in einer bestimmten Version behoben, oder Version X ist nicht mehr mit einem von Ihnen verwendeten Dateiformat kompatibel. In jedem dieser Fälle ist es hilfreich, sehr genau zu wissen, welche Software geladen wird.

Schauen wir uns die Ausgabe von module avail näher an.

BASH

[yourUsername@login1 ~] module avail

AUSGABE

~~~ /cvmfs/pilot.eessi-hpc.org/2020.12/software/x86_64/amd/zen2/modules/all ~~~
  Bazel/3.6.0-GCCcore-x.y.z              NSS/3.51-GCCcore-x.y.z
  Bison/3.5.3-GCCcore-x.y.z              Ninja/1.10.0-GCCcore-x.y.z
  Boost/1.72.0-gompi-2020a               OSU-Micro-Benchmarks/5.6.3-gompi-2020a
  CGAL/4.14.3-gompi-2020a-Python-3.x.y   OpenBLAS/0.3.9-GCC-x.y.z
  CMake/3.16.4-GCCcore-x.y.z             OpenFOAM/v2006-foss-2020a

[removed most of the output here for clarity]

  Where:
   L:        Module is loaded
   Aliases:  Aliases exist: foo/1.2.3 (1.2) means that "module load foo/1.2"
             will load foo/1.2.3
   D:        Default Module

Use "module spider" to find all possible modules and extensions.
Use "module keyword key1 key2 ..." to search for all possible modules matching
any of the "keys".

Verwendung von Software-Modulen in Skripten

Erstellen Sie einen Job, der in der Lage ist, python3 --version auszuführen. Denken Sie daran, dass standardmäßig keine Software geladen ist! Das Ausführen eines Jobs ist genau wie das Anmelden am System (Sie sollten nicht davon ausgehen, dass ein auf dem Anmeldeknoten geladenes Modul auch auf einem Rechenknoten geladen ist).

BASH

[yourUsername@login1 ~] nano python-module.sh
[yourUsername@login1 ~] cat python-module.sh

AUSGABE

#!/bin/bash
#SBATCH
r config$sched$comment` -t 00:00:30

module load Python

python3 --version

BASH

[yourUsername@login1 ~] sbatch  python-module.sh

Hauptpunkte

  • Software mit module load softwareName laden.
  • Entladen von Software mit module unload
  • Das Modulsystem kümmert sich automatisch um Softwareversionen und Paketkonflikte.

Content from Übertragen von Dateien mit entfernten Computern


Zuletzt aktualisiert am 2025-08-04 | Diese Seite bearbeiten

Übersicht

Fragen

  • Wie übertrage ich Dateien zum (und vom) Cluster?

Ziele

  • Übertragen Sie Dateien zu und von einem Computer-Cluster.

Die Arbeit auf einem entfernten Computer ist nicht sehr nützlich, wenn wir keine Dateien zum oder vom Cluster bekommen können. Es gibt mehrere Optionen für die Übertragung von Daten zwischen Computerressourcen mit Hilfe von CLI- und GUI-Dienstprogrammen, von denen wir einige vorstellen werden.

Herunterladen von Lektionsdateien aus dem Internet


Einer der einfachsten Wege, Dateien herunterzuladen, ist die Verwendung von curl oder wget. Eines von beiden ist normalerweise in den meisten Linux-Shells, auf Mac OS Terminal und in GitBash installiert. Jede Datei, die über einen direkten Link in Ihrem Webbrowser heruntergeladen werden kann, kann mit curl oder wget heruntergeladen werden. Dies ist ein schneller Weg, um Datensätze oder Quellcode herunterzuladen. Die Syntax für diese Befehle lautet

  • wget [-O new_name] https://some/link/to/a/file
  • curl [-o new_name] https://some/link/to/a/file

Probieren Sie es aus, indem Sie etwas Material, das wir später benutzen werden, von einem Terminal auf Ihrem lokalen Rechner herunterladen, indem Sie die URL der aktuellen Codebase benutzen:

https://github.com/hpc-carpentry/amdahl/tarball/main

Download des “Tarballs”

Das Wort “tarball” in der obigen URL bezieht sich auf ein komprimiertes Archivformat, das häufig unter Linux verwendet wird, dem Betriebssystem, mit dem die meisten HPC-Cluster-Maschinen arbeiten. Ein Tarball ist vergleichbar mit einer .zip-Datei. Die eigentliche Dateierweiterung lautet .tar.gz, was den zweistufigen Prozess zur Erstellung der Datei widerspiegelt: Die Dateien oder Ordner werden mit tar zu einer einzigen Datei zusammengeführt, die dann mit gzip komprimiert wird, so dass die Dateierweiterung “tar-dot-g-z” lautet Das ist etwas langatmig, deshalb sagen die Leute stattdessen oft “der xyz Tarball”.

Sie können auch die Erweiterung .tgz sehen, was nur eine Abkürzung für .tar.gz ist.

Standardmäßig laden curl und wget Dateien unter demselben Namen wie die URL herunter: in diesem Fall main. Verwenden Sie einen der oben genannten Befehle, um den Tarball unter amdahl.tar.gz zu speichern.

BASH

[you@laptop:~]$ wget -O amdahl.tar.gz https://github.com/hpc-carpentry/amdahl/tarball/main
# or
[you@laptop:~]$ curl -o amdahl.tar.gz -L https://github.com/hpc-carpentry/amdahl/tarball/main

Die Option -L für curl weist es an, URL-Umleitungen zu folgen (was wget standardmäßig tut).

Nachdem Sie die Datei heruntergeladen haben, benutzen Sie ls, um sie in Ihrem Arbeitsverzeichnis zu sehen:

BASH

[you@laptop:~]$ ls

Dateien archivieren


Eine der größten Herausforderungen bei der Übertragung von Daten zwischen entfernten HPC-Systemen ist die große Anzahl von Dateien. Die Übertragung jeder einzelnen Datei ist mit einem Overhead verbunden, und wenn wir eine große Anzahl von Dateien übertragen, verlangsamen diese Overheads unsere Übertragungen in hohem Maße.

Die Lösung für dieses Problem ist die Archivierung mehrerer Dateien in eine kleinere Anzahl größerer Dateien, bevor wir die Daten übertragen, um unsere Übertragungseffizienz zu verbessern. Manchmal wird die Archivierung mit einer Komprimierung kombiniert, um die zu übertragende Datenmenge zu verringern und so die Übertragung zu beschleunigen. Der gebräuchlichste Archivierungsbefehl, den Sie auf einem (Linux-)HPC-Cluster verwenden werden, ist tar.

tar kann verwendet werden, um Dateien und Ordner zu einer einzigen Archivdatei zusammenzufassen und das Ergebnis optional zu komprimieren. Schauen wir uns die Datei an, die wir von der Lektionsseite heruntergeladen haben, amdahl.tar.gz.

Der Teil .gz steht für gzip, eine Kompressionsbibliothek. Es ist üblich (aber nicht notwendig!), dass diese Art von Datei durch das Lesen ihres Namens interpretiert werden kann: Es scheint, dass jemand Dateien und Ordner, die sich auf etwas namens “amdahl” beziehen, in eine einzige Datei mit tar verpackt hat und dann dieses Archiv mit gzip komprimiert hat, um Platz zu sparen.

Schauen wir mal, ob das der Fall ist, ohne die Datei zu entpacken. tar gibt das “table of contents” mit dem -t Flag aus, für die mit dem -f Flag angegebene Datei, gefolgt vom Dateinamen. Beachten Sie, dass Sie die beiden Flags verketten können: das Schreiben von -t -f ist austauschbar mit dem Schreiben von -tf zusammen. Allerdings muss das Argument nach -f ein Dateiname sein, also funktioniert -ft nicht.

BASH

[you@laptop:~]$ tar -tf amdahl.tar.gz
hpc-carpentry-amdahl-46c9b4b/
hpc-carpentry-amdahl-46c9b4b/.github/
hpc-carpentry-amdahl-46c9b4b/.github/workflows/
hpc-carpentry-amdahl-46c9b4b/.github/workflows/python-publish.yml
hpc-carpentry-amdahl-46c9b4b/.gitignore
hpc-carpentry-amdahl-46c9b4b/LICENSE
hpc-carpentry-amdahl-46c9b4b/README.md
hpc-carpentry-amdahl-46c9b4b/amdahl/
hpc-carpentry-amdahl-46c9b4b/amdahl/__init__.py
hpc-carpentry-amdahl-46c9b4b/amdahl/__main__.py
hpc-carpentry-amdahl-46c9b4b/amdahl/amdahl.py
hpc-carpentry-amdahl-46c9b4b/requirements.txt
hpc-carpentry-amdahl-46c9b4b/setup.py

Diese Beispielausgabe zeigt einen Ordner, der einige Dateien enthält, wobei 46c9b4b ein 8-stelliger git Commit-Hash ist, der sich ändert, wenn das Quellmaterial aktualisiert wird.

Nun wollen wir das Archiv entpacken. Wir werden tar mit ein paar üblichen Flags ausführen:

  • -x um das Archiv zu extrahieren
  • -v für eine verböse Ausgabe
  • -z für gzip Kompression
  • -f «tarball» für die zu entpackende Datei

Entpacken Sie das Archiv

Entpacken Sie den Quellcode-Tarball mit den obigen Flags in ein neues Verzeichnis mit dem Namen “amdahl” unter Verwendung von tar.

BASH

[you@laptop:~]$ tar -xvzf amdahl.tar.gz

AUSGABE

hpc-carpentry-amdahl-46c9b4b/
hpc-carpentry-amdahl-46c9b4b/.github/
hpc-carpentry-amdahl-46c9b4b/.github/workflows/
hpc-carpentry-amdahl-46c9b4b/.github/workflows/python-publish.yml
hpc-carpentry-amdahl-46c9b4b/.gitignore
hpc-carpentry-amdahl-46c9b4b/LICENSE
hpc-carpentry-amdahl-46c9b4b/README.md
hpc-carpentry-amdahl-46c9b4b/amdahl/
hpc-carpentry-amdahl-46c9b4b/amdahl/__init__.py
hpc-carpentry-amdahl-46c9b4b/amdahl/__main__.py
hpc-carpentry-amdahl-46c9b4b/amdahl/amdahl.py
hpc-carpentry-amdahl-46c9b4b/requirements.txt
hpc-carpentry-amdahl-46c9b4b/setup.py

Beachten Sie, dass wir dank der Flaggenkonkatenation -x -v -z -f nicht eingeben mussten, obwohl der Befehl in beiden Fällen identisch funktioniert – solange die konkatenierte Liste mit f endet, denn die nächste Zeichenkette muss den Namen der zu extrahierenden Datei angeben.

Der Ordner hat einen unglücklichen Namen, also ändern wir ihn in etwas Passenderes.

BASH

[you@laptop:~]$ mv hpc-carpentry-amdahl-46c9b4b amdahl

Überprüfen Sie die Größe des extrahierten Verzeichnisses und vergleichen Sie sie mit der Größe der komprimierten Datei, indem Sie du für “disk usage” verwenden.

BASH

[you@laptop:~]$ du -sh amdahl.tar.gz
8.0K     amdahl.tar.gz
[you@laptop:~]$ du -sh amdahl
48K    amdahl

Textdateien (einschließlich Python-Quellcode) lassen sich gut komprimieren: der “Tarball” ist nur ein Sechstel so groß wie die Rohdaten!

Wenn Sie den Prozess umkehren wollen - Rohdaten komprimieren statt extrahieren - setzen Sie ein c-Flag anstelle von x, setzen Sie den Dateinamen des Archivs und geben Sie dann ein Verzeichnis zum Komprimieren an:

BASH

[you@laptop:~]$ tar -cvzf compressed_code.tar.gz amdahl

AUSGABE

amdahl/
amdahl/.github/
amdahl/.github/workflows/
amdahl/.github/workflows/python-publish.yml
amdahl/.gitignore
amdahl/LICENSE
amdahl/README.md
amdahl/amdahl/
amdahl/amdahl/__init__.py
amdahl/amdahl/__main__.py
amdahl/amdahl/amdahl.py
amdahl/requirements.txt
amdahl/setup.py

Wenn Sie im obigen Befehl amdahl.tar.gz als Dateinamen angeben, wird tar den bestehenden Tarball mit allen Änderungen, die Sie an den Dateien vorgenommen haben, aktualisieren. Das würde bedeuten, dass der neue Ordner amdahl zu dem vorhandenen Ordner (hpc-carpentry-amdahl-46c9b4b) innerhalb des Tarballs hinzugefügt wird, was die Größe des Archivs verdoppelt!

Arbeiten mit Windows

Wenn Sie Textdateien von einem Windows-System auf ein Unix-System (Mac, Linux, BSD, Solaris, etc.) übertragen, kann dies zu Problemen führen. Windows kodiert seine Dateien etwas anders als Unix und fügt in jeder Zeile ein zusätzliches Zeichen ein.

Auf einem Unix-System endet jede Zeile in einer Datei mit einem \n (Zeilenumbruch). Unter Windows endet jede Zeile in einer Datei mit einem \r\n (Wagenrücklauf + Zeilenumbruch). Dies verursacht manchmal Probleme.

Obwohl die meisten modernen Programmiersprachen und Software dies korrekt handhaben, kann es in einigen seltenen Fällen zu Problemen kommen. Die Lösung besteht darin, eine Datei mit dem Befehl dos2unix von der Windows- in die Unix-Kodierung zu konvertieren.

Sie können mit cat -A filename erkennen, ob eine Datei Windows-Zeilenenden hat. Eine Datei mit Windows-Zeilenendungen hat ^M$ am Ende jeder Zeile. Eine Datei mit Unix-Zeilenendungen hat $ am Ende einer Zeile.

Um die Datei zu konvertieren, führen Sie einfach dos2unix filename aus. (Umgekehrt können Sie unix2dos filename ausführen, um die Datei wieder in das Windows-Format zu konvertieren)

Übertragen von einzelnen Dateien und Ordnern mit scp


Um eine einzelne Datei in oder aus dem Cluster zu kopieren, können wir scp (“secure copy”) verwenden. Die Syntax kann für neue Benutzer ein wenig kompliziert sein, aber wir werden sie aufschlüsseln. Der scp-Befehl ist ein Verwandter des ssh-Befehls, den wir für den Zugriff auf das System verwendet haben, und kann denselben Public-Key-Authentifizierungsmechanismus verwenden.

Um eine Datei auf einen anderen Computer hochzuladen, lautet der Vorlagenbefehl

BASH

[you@laptop:~]$ scp local_file yourUsername@cluster.hpc-carpentry.org:remote_destination

an, wobei @ und : Feldtrennzeichen sind und remote_destination ein Pfad relativ zu Ihrem entfernten Heimatverzeichnis oder ein neuer Dateiname ist, wenn Sie ihn ändern möchten, oder sowohl ein relativer Pfad als auch ein neuer Dateiname. Wenn Sie keinen bestimmten Ordner im Sinn haben, können Sie das remote_destination weglassen und die Datei wird in Ihr Heimatverzeichnis auf dem entfernten Computer kopiert (mit ihrem ursprünglichen Namen). Wenn Sie ein remote_destination einschließen, beachten Sie, dass scp dies genauso interpretiert wie cp beim Erstellen von lokalen Kopien: wenn es existiert und ein Ordner ist, wird die Datei in den Ordner kopiert; wenn es existiert und eine Datei ist, wird die Datei mit dem Inhalt von local_file überschrieben; wenn es nicht existiert, wird angenommen, dass es ein Zieldateiname für local_file ist.

So laden Sie das Unterrichtsmaterial in Ihr entferntes Heimatverzeichnis hoch:

BASH

[you@laptop:~]$ scp amdahl.tar.gz yourUsername@cluster.hpc-carpentry.org:

Warum nicht direkt auf HPC Carpentry’s Cloud Cluster herunterladen?

Die meisten Computer-Cluster sind durch eine Firewall vor dem offenen Internet geschützt. Um die Sicherheit zu erhöhen, sind einige so konfiguriert, dass sie Datenverkehr eingehend, aber nicht ausgehend zulassen. Das bedeutet, dass ein authentifizierter Benutzer eine Datei an einen Cluster-Rechner senden kann, aber ein Cluster-Rechner kann keine Dateien vom Rechner eines Benutzers oder dem offenen Internet abrufen.

Versuchen Sie, die Datei direkt herunterzuladen. Beachten Sie, dass dies fehlschlagen kann, und das ist OK!

BASH

[you@laptop:~]$ ssh yourUsername@cluster.hpc-carpentry.org
[yourUsername@login1 ~] wget -O amdahl.tar.gz https://github.com/hpc-carpentry/amdahl/tarball/main
# or
[yourUsername@login1 ~] curl -o amdahl.tar.gz https://github.com/hpc-carpentry/amdahl/tarball/main

Warum nicht direkt auf HPC Carpentry’s Cloud Cluster herunterladen? (continued)

Hat es funktioniert? Wenn nicht, was sagt die Terminalausgabe über den Vorgang aus?

Übertragen eines Verzeichnisses


Um ein ganzes Verzeichnis zu übertragen, fügen wir das Flag -r für “recursive” hinzu: Kopieren Sie das angegebene Element, und jedes Element darunter, und jedes Element darunter… bis Sie das untere Ende des Verzeichnisbaums erreichen, dessen Wurzel der von Ihnen angegebene Ordnername ist.

BASH

[you@laptop:~]$ scp -r amdahl yourUsername@cluster.hpc-carpentry.org:

Vorsicht

Bei einem großen Verzeichnis – entweder in der Größe oder in der Anzahl der Dateien – kann das Kopieren mit -r sehr lange dauern, bis es abgeschlossen ist.

Bei der Verwendung von scp ist Ihnen vielleicht aufgefallen, dass ein : immer dem Namen des entfernten Computers folgt. Eine Zeichenkette nach dem : gibt das entfernte Verzeichnis an, in das Sie die Datei oder den Ordner übertragen wollen, einschließlich eines neuen Namens, wenn Sie das entfernte Material umbenennen wollen. Wenn Sie dieses Feld leer lassen, ist scp standardmäßig Ihr Heimatverzeichnis und der Name des zu übertragenden lokalen Materials.

Auf Linux-Computern ist / das Trennzeichen in Datei- oder Verzeichnispfaden. Ein Pfad, der mit / beginnt, wird absolut genannt, da es nichts oberhalb der Wurzel / geben kann. Ein Pfad, der nicht mit / beginnt, wird relativ genannt, da er nicht an der Wurzel verankert ist.

Wenn Sie eine Datei an einen Ort innerhalb Ihres Heimatverzeichnisses hochladen wollen - was oft der Fall ist -, dann brauchen Sie kein führendes /. Nach dem : können Sie den Zielpfad relativ zu Ihrem Heimatverzeichnis angeben. Wenn Ihr Heimatverzeichnis das Ziel ist, können Sie das Zielfeld leer lassen oder der Vollständigkeit halber ~ - die Abkürzung für Ihr Heimatverzeichnis - eingeben.

Mit scp ist ein abschließender Schrägstrich im Zielverzeichnis optional und hat keine Auswirkungen. Ein nachgestellter Schrägstrich im Quellverzeichnis ist wichtig für andere Befehle, wie rsync.

Eine Anmerkung zu rsync

Wenn Sie Erfahrung mit der Übertragung von Dateien haben, werden Sie den Befehl scp vielleicht als einschränkend empfinden. Das rsync Dienstprogramm bietet erweiterte Funktionen für die Dateiübertragung und ist in der Regel schneller als scp und sftp (siehe unten). Es ist besonders nützlich für die Übertragung von großen und/oder vielen Dateien und für die Synchronisierung von Ordnerinhalten zwischen Computern.

Die Syntax ist ähnlich wie bei scp. Zum Übertragen auf einen anderen Computer mit häufig verwendeten Optionen:

BASH

[you@laptop:~]$ rsync -avP amdahl.tar.gz yourUsername@cluster.hpc-carpentry.org:

Die Optionen sind:

  • -a (einArchiv), um u.a. Datei-Zeitstempel, Berechtigungen und Ordner zu erhalten; impliziert Rekursion
  • -v (verbose), um eine ausführliche Ausgabe zu erhalten, die Ihnen hilft, die Übertragung zu überwachen
  • -P (partial/progress), um teilweise übertragene Dateien im Falle einer Unterbrechung aufzubewahren und auch den Fortschritt der Übertragung anzuzeigen.

Um ein Verzeichnis rekursiv zu kopieren, können wir die gleichen Optionen verwenden:

BASH

[you@laptop:~]$ rsync -avP amdahl yourUsername@cluster.hpc-carpentry.org:~/

Wie geschrieben, wird das lokale Verzeichnis und sein Inhalt unter Ihrem Heimatverzeichnis auf dem entfernten System abgelegt. Wenn ein abschließender Schrägstrich an die Quelle angehängt wird, wird kein neues Verzeichnis erstellt, das dem übertragenen Verzeichnis entspricht, und der Inhalt des Quellverzeichnisses wird direkt in das Zielverzeichnis kopiert.

Um eine Datei herunterzuladen, ändern wir einfach die Quelle und das Ziel:

BASH

[you@laptop:~]$ rsync -avP yourUsername@cluster.hpc-carpentry.org:amdahl ./

Dateiübertragungen, die sowohl scp als auch rsync benutzen, verwenden SSH, um die über das Netzwerk gesendeten Daten zu verschlüsseln. Wenn Sie also eine Verbindung über SSH herstellen können, werden Sie in der Lage sein, Dateien zu übertragen. SSH verwendet standardmäßig den Netzwerkanschluss 22. Wenn ein benutzerdefinierter SSH-Port verwendet wird, müssen Sie ihn mit dem entsprechenden Flag angeben, oft -p, -P oder --port. Prüfen Sie --help oder die man Seite, wenn Sie sich unsicher sind.

Ändern Sie den Rsync-Port

Angenommen, wir müssen rsync über Port 768 statt 22 verbinden. Wie würden wir diesen Befehl ändern?

BASH

[you@laptop:~]$ rsync amdahl.tar.gz yourUsername@cluster.hpc-carpentry.org:

Hinweis: Sehen Sie auf der man Seite oder in der “Hilfe” nach rsync.

BASH

[you@laptop:~]$ man rsync
[you@laptop:~]$ rsync --help | grep port
     --port=PORT             specify double-colon alternate port number
See http://rsync.samba.org/ for updates, bug reports, and answers
[you@laptop:~]$ rsync --port=768 amdahl.tar.gz yourUsername@cluster.hpc-carpentry.org:

(Beachten Sie, dass dieser Befehl fehlschlägt, da der korrekte Port in diesem Fall der Standardwert ist: 22.)

Interaktives Übertragen von Dateien mit FileZilla


FileZilla ist ein plattformübergreifender Client für das Herunterladen und Hochladen von Dateien auf und von einem entfernten Computer. Er ist absolut narrensicher und funktioniert immer gut. Er verwendet das sftp-Protokoll. Sie können mehr über die Verwendung des sftp-Protokolls in der Kommandozeile in der Lektionsdiskussion lesen.

Laden Sie den FileZilla-Client von https://filezilla-project.org herunter und installieren Sie ihn. Nach der Installation und dem Öffnen des Programms sollten Sie auf der linken Seite des Bildschirms ein Fenster mit einem Dateibrowser Ihres lokalen Systems sehen. Wenn Sie sich mit dem Cluster verbinden, werden Ihre Clusterdateien auf der rechten Seite angezeigt.

Um sich mit dem Cluster zu verbinden, müssen wir nur unsere Anmeldedaten oben auf dem Bildschirm eingeben:

  • Host: sftp://cluster.hpc-carpentry.org
  • Benutzer: Ihr Clusternutzername
  • Passwort: Ihr Clusterkennwort
  • Port: (leer lassen, um den Standardport zu verwenden)

Drücken Sie “Quickconnect”, um eine Verbindung herzustellen. Ihre entfernten Dateien sollten auf der rechten Seite des Bildschirms angezeigt werden. Sie können Dateien per Drag-and-Drop zwischen der linken (lokalen) und der rechten (entfernten) Seite des Bildschirms verschieben, um Dateien zu übertragen.

Wenn Sie große Dateien (in der Regel größer als ein Gigabyte) von einem entfernten Computer auf einen anderen übertragen müssen, melden Sie sich per SSH auf dem Computer an, auf dem sich die Dateien befinden, und verwenden Sie scp oder rsync, um die Dateien auf den anderen Computer zu übertragen. Dies ist effizienter als die Verwendung von FileZilla (oder ähnlichen Anwendungen), die von der Quelle auf Ihren lokalen Rechner und dann auf den Zielrechner kopieren würden.

Hauptpunkte

  • wget und curl -O laden eine Datei aus dem Internet herunter.
  • scp und rsync übertragen Dateien zu und von Ihrem Computer.
  • Sie können einen SFTP-Client wie FileZilla verwenden, um Dateien über eine grafische Benutzeroberfläche zu übertragen.

Content from Ausführen eines parallelen Auftrags


Zuletzt aktualisiert am 2025-08-04 | Diese Seite bearbeiten

Übersicht

Fragen

  • Wie kann man eine Aufgabe parallel ausführen?
  • Welche Vorteile ergeben sich aus der parallelen Ausführung?
  • Wo liegen die Grenzen des Gewinns bei paralleler Ausführung?

Ziele

  • Installieren Sie ein Python-Paket mit pip
  • Bereiten Sie ein Auftragsskript für das parallele Programm vor.
  • Starten Sie Aufträge mit paralleler Ausführung.
  • Aufzeichnung und Zusammenfassung des Zeitplans und der Genauigkeit von Aufträgen.
  • Beschreiben Sie die Beziehung zwischen Job-Parallelität und Leistung.

Wir haben jetzt die Werkzeuge, die wir brauchen, um einen Multiprozessor-Job auszuführen. Dies ist ein sehr wichtiger Aspekt von HPC-Systemen, da die Parallelität eines der wichtigsten Werkzeuge ist, um die Leistung von Berechnungsaufgaben zu verbessern.

Wenn Sie die Verbindung getrennt haben, melden Sie sich wieder am Cluster an.

BASH

[you@laptop:~]$ ssh yourUsername@cluster.hpc-carpentry.org

Installieren Sie das Amdahl-Programm


Nachdem wir den Amdahl-Quellcode auf dem Cluster haben, können wir ihn installieren, was den Zugriff auf die ausführbare Datei amdahl ermöglicht. Wechseln Sie in das extrahierte Verzeichnis und verwenden Sie dann den Package Installer für Python oder pip, um es in Ihrem (“user”) Home-Verzeichnis zu installieren:

BASH

[yourUsername@login1 ~] cd amdahl
[yourUsername@login1 ~] python3 -m pip install --user .

Amdahl ist Python Code

Das Amdahl-Programm ist in Python geschrieben, und um es zu installieren oder zu benutzen, muss die ausführbare Datei python3 auf dem Anmeldeknoten gefunden werden. Wenn es nicht gefunden werden kann, versuchen Sie, die verfügbaren Module mit module avail aufzulisten, laden Sie das entsprechende Modul und versuchen Sie den Befehl erneut.

MPI für Python

Der Amdahl-Code ist von einem Prozess abhängig: mpi4py. Wenn es nicht bereits auf dem Cluster installiert ist, wird pip versuchen, mpi4py aus dem Internet zu holen und für Sie zu installieren. Wenn dies aufgrund einer Einweg-Firewall fehlschlägt, müssen Sie mpi4py auf Ihrem lokalen Rechner abrufen und hochladen, so wie wir es für Amdahl getan haben.

Abrufen und Hochladen von mpi4py

Wenn die Installation von Amdahl fehlgeschlagen ist, weil mpi4py nicht installiert werden konnte, rufen Sie das Tarball von https://github.com/mpi4py/mpi4py/tarball/master ab, synchronisieren Sie es anschließend per rsync mit dem Cluster, extrahieren Sie es und installieren Sie es:

BASH

[you@laptop:~]$ wget -O mpi4py.tar.gz https://github.com/mpi4py/mpi4py/releases/download/3.1.4/mpi4py-3.1.4.tar.gz
[you@laptop:~]$ scp mpi4py.tar.gz yourUsername@cluster.hpc-carpentry.org:
# or
[you@laptop:~]$ rsync -avP mpi4py.tar.gz yourUsername@cluster.hpc-carpentry.org:

BASH

[you@laptop:~]$ ssh yourUsername@cluster.hpc-carpentry.org
[yourUsername@login1 ~] tar -xvzf mpi4py.tar.gz  # extract the archive
[yourUsername@login1 ~] mv mpi4py* mpi4py        # rename the directory
[yourUsername@login1 ~] cd mpi4py
[yourUsername@login1 ~] python3 -m pip install --user .
[yourUsername@login1 ~] cd ../amdahl
[yourUsername@login1 ~] python3 -m pip install --user .

Wenn pip eine Warnung auslöst…

pip kann eine Warnung ausgeben, dass die Binärdateien Ihres Benutzerpakets nicht in Ihrem PATH sind.

WARNUNG

WARNING: The script amdahl is installed in "${HOME}/.local/bin" which is
not on PATH. Consider adding this directory to PATH or, if you prefer to
suppress this warning, use --no-warn-script-location.

Um zu überprüfen, ob diese Warnung ein Problem darstellt, verwenden Sie which, um nach dem Programm amdahl zu suchen:

BASH

[yourUsername@login1 ~] which amdahl

Wenn der Befehl keine Ausgabe liefert und eine neue Eingabeaufforderung anzeigt, bedeutet dies, dass die Datei amdahl nicht gefunden wurde. Sie müssen die Umgebungsvariable mit dem Namen PATH aktualisieren, um den fehlenden Ordner aufzunehmen. Bearbeiten Sie Ihre Shell-Konfigurationsdatei wie folgt, melden Sie sich dann vom Cluster ab und wieder an, damit die Änderung wirksam wird.

BASH

[yourUsername@login1 ~] nano ~/.bashrc
[yourUsername@login1 ~] tail ~/.bashrc

AUSGABE

export PATH=${PATH}:${HOME}/.local/bin

Nachdem Sie sich wieder bei cluster.hpc-carpentry.org angemeldet haben, sollte which in der Lage sein, amdahl ohne Schwierigkeiten zu finden. Wenn Sie ein Python-Modul laden mussten, laden Sie es erneut.

Hilfe!


Viele Befehlszeilenprogramme enthalten eine “Hilfe”-Meldung. Probieren Sie es mit amdahl:

BASH

[yourUsername@login1 ~] amdahl --help

AUSGABE

usage: amdahl [-h] [-p [PARALLEL_PROPORTION]] [-w [WORK_SECONDS]] [-t] [-e] [-j [JITTER_PROPORTION]]

optional arguments:
  -h, --help            show this help message and exit
  -p [PARALLEL_PROPORTION], --parallel-proportion [PARALLEL_PROPORTION]
                        Parallel proportion: a float between 0 and 1
  -w [WORK_SECONDS], --work-seconds [WORK_SECONDS]
                        Total seconds of workload: an integer greater than 0
  -t, --terse           Format output as a machine-readable object for easier analysis
  -e, --exact           Exactly match requested timing by disabling random jitter
  -j [JITTER_PROPORTION], --jitter-proportion [JITTER_PROPORTION]
                        Random jitter: a float between -1 and +1

Diese Nachricht sagt nicht viel darüber aus, was das Programm tut, aber sie teilt uns die wichtigen Flags mit, die wir beim Start des Programms verwenden sollten.

Ausführen des Jobs auf einem Rechenknoten


Erstellen Sie eine Einreichungsdatei, die eine Aufgabe auf einem einzigen Knoten anfordert, und starten Sie sie.

BASH

[yourUsername@login1 ~] nano serial-job.sh
[yourUsername@login1 ~] cat serial-job.sh

BASH

#!/bin/bash
#SBATCH -J solo-job
#SBATCH -p cpubase_bycore_b1
#SBATCH -N 1
#SBATCH -n 1

# Load the computing environment we need
module load Python

# Execute the task
amdahl

BASH

[yourUsername@login1 ~] sbatch serial-job.sh

Verwenden Sie wie bisher die Statusbefehle Slurm, um zu überprüfen, ob Ihr Auftrag läuft und wann er endet:

BASH

[yourUsername@login1 ~] squeue -u yourUsername

Verwenden Sie ls, um die Ausgabedatei zu finden. Das Flag -t sortiert in umgekehrter chronologischer Reihenfolge: das Neueste zuerst. Wie lautete die Ausgabe?

Die Cluster-Ausgabe sollte in eine Datei in dem Ordner geschrieben werden, aus dem Sie den Job gestartet haben. Zum Beispiel,

BASH

[yourUsername@login1 ~] ls -t

AUSGABE

slurm-347087.out  serial-job.sh  amdahl  README.md  LICENSE.txt

BASH

[yourUsername@login1 ~] cat slurm-347087.out

AUSGABE

Doing 30.000 seconds of 'work' on 1 processor,
which should take 30.000 seconds with 0.850 parallel proportion of the workload.

  Hello, World! I am process 0 of 1 on smnode1. I will do all the serial 'work' for 4.500 seconds.
  Hello, World! I am process 0 of 1 on smnode1. I will do parallel 'work' for 25.500 seconds.

Total execution time (according to rank 0): 30.033 seconds

Wie wir bereits gesehen haben, legen zwei der amdahl-Programmflags die Menge der Arbeit und den Anteil der parallelen Arbeit fest. Anhand der Ausgabe können wir sehen, dass der Code eine Vorgabe von 30 Sekunden Arbeit verwendet, die zu 85 % parallel ist. Das Programm lief insgesamt etwas über 30 Sekunden, und wenn wir die Zahlen durchgehen, stimmt es, dass 15 % davon als “seriell” und 85 % als “parallel” gekennzeichnet waren.

Da wir dem Job nur eine CPU zugewiesen haben, war dieser Job nicht wirklich parallel: derselbe Prozessor führte die “serielle” Arbeit 4,5 Sekunden lang aus, dann den “parallelen” Teil 25,5 Sekunden lang, und es wurde keine Zeit gespart. Der Cluster kann es besser, wenn wir ihn fragen.

Ausführen des parallelen Jobs


Das Programm amdahl verwendet das Message Passing Interface (MPI) für die Parallelität - ein gängiges Werkzeug auf HPC-Systemen.

Was ist MPI?

Das Message Passing Interface ist eine Reihe von Werkzeugen, die es mehreren gleichzeitig laufenden Aufgaben ermöglichen, miteinander zu kommunizieren. Typischerweise wird eine einzelne ausführbare Datei mehrfach ausgeführt, möglicherweise auf verschiedenen Rechnern, und die MPI-Werkzeuge werden verwendet, um jede Instanz der ausführbaren Datei über ihre Geschwisterprozesse und die jeweilige Instanz zu informieren. MPI bietet auch Werkzeuge für die Kommunikation zwischen Instanzen, um die Arbeit zu koordinieren, Informationen über Elemente der Aufgabe auszutauschen oder Daten zu übertragen. Eine MPI-Instanz hat normalerweise ihre eigene Kopie aller lokalen Variablen.

Während MPI-fähige ausführbare Programme im Allgemeinen als eigenständige Programme ausgeführt werden können, müssen sie, um parallel ausgeführt werden zu können, eine MPI Laufzeitumgebung verwenden, bei der es sich um eine spezielle Implementierung des MPI Standards handelt. Um die MPI-Umgebung zu aktivieren, sollte das Programm mit einem Befehl wie mpiexec (oder mpirun, oder srun, usw., je nach der zu verwendenden MPI-Laufzeitumgebung) gestartet werden, wodurch sichergestellt wird, dass die entsprechende Laufzeitunterstützung für Parallelität enthalten ist.

MPI Laufzeitargumente

Befehle wie mpiexec können viele Argumente annehmen, die angeben, wie viele Maschinen an der Ausführung teilnehmen sollen, und Sie benötigen diese Argumente, wenn Sie ein MPI-Programm alleine ausführen möchten (z. B. auf Ihrem Laptop). Im Zusammenhang mit einem Warteschlangensystem ist es jedoch häufig der Fall, dass die MPI-Laufzeit die notwendigen Parameter vom Warteschlangensystem erhält, indem sie die Umgebungsvariablen untersucht, die beim Start des Auftrags gesetzt wurden.

Ändern wir das Jobskript, um mehr Kerne anzufordern und die MPI-Laufzeit zu nutzen.

BASH

[yourUsername@login1 ~] cp serial-job.sh parallel-job.sh
[yourUsername@login1 ~] nano parallel-job.sh
[yourUsername@login1 ~] cat parallel-job.sh

BASH

#!/bin/bash
#SBATCH -J parallel-job
#SBATCH -p cpubase_bycore_b1
#SBATCH -N 1
#SBATCH -n 4

# Load the computing environment we need
# (mpi4py and numpy are in SciPy-bundle)
module load Python
module load SciPy-bundle

# Execute the task
mpiexec amdahl

Senden Sie dann Ihren Auftrag ab. Beachten Sie, dass sich der Übermittlungsbefehl im Vergleich zur Übermittlung des seriellen Auftrags nicht wirklich geändert hat: Alle parallelen Einstellungen befinden sich in der Batch-Datei und nicht in der Befehlszeile.

BASH

[yourUsername@login1 ~] sbatch parallel-job.sh

Verwenden Sie wie bisher die Statusbefehle, um zu überprüfen, wann Ihr Auftrag läuft.

BASH

[yourUsername@login1 ~] ls -t

AUSGABE

slurm-347178.out  parallel-job.sh  slurm-347087.out  serial-job.sh  amdahl  README.md  LICENSE.txt

BASH

[yourUsername@login1 ~] cat slurm-347178.out

AUSGABE

Doing 30.000 seconds of 'work' on 4 processors,
which should take 10.875 seconds with 0.850 parallel proportion of the workload.

  Hello, World! I am process 0 of 4 on smnode1. I will do all the serial 'work' for 4.500 seconds.
  Hello, World! I am process 2 of 4 on smnode1. I will do parallel 'work' for 6.375 seconds.
  Hello, World! I am process 1 of 4 on smnode1. I will do parallel 'work' for 6.375 seconds.
  Hello, World! I am process 3 of 4 on smnode1. I will do parallel 'work' for 6.375 seconds.
  Hello, World! I am process 0 of 4 on smnode1. I will do parallel 'work' for 6.375 seconds.

Total execution time (according to rank 0): 10.888 seconds

Ist es 4× schneller?

Der parallele Auftrag erhielt 4× mehr Prozessoren als der serielle Auftrag: Bedeutet das, dass er in ¼ der Zeit fertig wurde?

Der parallele Auftrag hat weniger Zeit benötigt: 11 Sekunden sind besser als 30! Aber es ist nur eine 2,7-fache Verbesserung, nicht eine 4-fache.

Sehen Sie sich die Ausgabe des Jobs an:

  • Während “Prozess 0” serielle Arbeit verrichtete, erledigten die Prozesse 1 bis 3 ihre parallele Arbeit.
  • Während Prozess 0 seine parallele Arbeit nachholte, tat der Rest gar nichts.

Prozess 0 muss immer erst seine serielle Aufgabe beenden, bevor er mit der parallelen Arbeit beginnen kann. Damit wird eine untere Grenze für die Zeit gesetzt, die diese Aufgabe benötigt, egal wie viele Kerne man ihr zuordnet.

Dies ist das Grundprinzip des Amdahl’schen Gesetzes, das eine Möglichkeit ist, Verbesserungen der Ausführungszeit für eine feste Arbeitslast vorherzusagen, die bis zu einem gewissen Grad unterteilt und parallel ausgeführt werden kann.

Wie stark verbessert die parallele Ausführung die Leistung?


Theoretisch sollte die Aufteilung einer perfekt parallelen Berechnung auf n MPI-Prozesse zu einer Verringerung der Gesamtlaufzeit um den Faktor n führen. Wie wir soeben gesehen haben, benötigen reale Programme eine gewisse Zeit, damit die MPI-Prozesse kommunizieren und sich koordinieren können, und einige Arten von Berechnungen können nicht aufgeteilt werden: Sie laufen effektiv nur auf einer einzigen CPU.

Wenn die MPI-Prozesse auf verschiedenen physischen CPUs im Computer oder auf mehreren Rechenknoten arbeiten, wird sogar mehr Zeit für die Kommunikation benötigt, als wenn alle Prozesse auf einer einzigen CPU arbeiten.

In der Praxis ist es üblich, die Parallelität eines MPI-Programms wie folgt zu bewerten

  • das Programm über einen Bereich von CPU-Zahlen laufen,
  • Aufzeichnung der Ausführungszeit bei jedem Durchlauf,
  • Vergleich der jeweiligen Ausführungszeit mit der Zeit bei Verwendung einer einzigen CPU.

Da “mehr besser ist” - eine Verbesserung ist leichter zu interpretieren, wenn eine bestimmte Größe zunimmt, als wenn sie abnimmt - werden Vergleiche mit dem Beschleunigungsfaktor S durchgeführt, der als die Ausführungszeit auf einer CPU geteilt durch die Ausführungszeit auf mehreren CPUs berechnet wird. Für ein perfekt paralleles Programm würde ein Diagramm des Beschleunigungsfaktors S gegen die Anzahl der CPUs n eine gerade Linie ergeben, S = n.

Lassen wir einen weiteren Job laufen, damit wir sehen können, wie nahe unser amdahl-Code einer geraden Linie kommt.

BASH

[yourUsername@login1 ~] nano parallel-job.sh
[yourUsername@login1 ~] cat parallel-job.sh

BASH

#!/bin/bash
#SBATCH -J parallel-job
#SBATCH -p cpubase_bycore_b1
#SBATCH -N 1
#SBATCH -n 8

# Load the computing environment we need
# (mpi4py and numpy are in SciPy-bundle)
module load Python
module load SciPy-bundle

# Execute the task
mpiexec amdahl

Senden Sie dann Ihren Auftrag ab. Beachten Sie, dass sich der Übermittlungsbefehl im Vergleich zur Übermittlung des seriellen Auftrags nicht wirklich geändert hat: Alle parallelen Einstellungen befinden sich in der Batch-Datei und nicht in der Befehlszeile.

BASH

[yourUsername@login1 ~] sbatch parallel-job.sh

Verwenden Sie wie bisher die Statusbefehle, um zu überprüfen, wann Ihr Auftrag läuft.

BASH

[yourUsername@login1 ~] ls -t

AUSGABE

slurm-347271.out  parallel-job.sh  slurm-347178.out  slurm-347087.out  serial-job.sh  amdahl  README.md  LICENSE.txt

BASH

[yourUsername@login1 ~] cat slurm-347178.out

AUSGABE

which should take 7.688 seconds with 0.850 parallel proportion of the workload.

  Hello, World! I am process 4 of 8 on smnode1. I will do parallel 'work' for 3.188 seconds.
  Hello, World! I am process 0 of 8 on smnode1. I will do all the serial 'work' for 4.500 seconds.
  Hello, World! I am process 2 of 8 on smnode1. I will do parallel 'work' for 3.188 seconds.
  Hello, World! I am process 1 of 8 on smnode1. I will do parallel 'work' for 3.188 seconds.
  Hello, World! I am process 3 of 8 on smnode1. I will do parallel 'work' for 3.188 seconds.
  Hello, World! I am process 5 of 8 on smnode1. I will do parallel 'work' for 3.188 seconds.
  Hello, World! I am process 6 of 8 on smnode1. I will do parallel 'work' for 3.188 seconds.
  Hello, World! I am process 7 of 8 on smnode1. I will do parallel 'work' for 3.188 seconds.
  Hello, World! I am process 0 of 8 on smnode1. I will do parallel 'work' for 3.188 seconds.

Total execution time (according to rank 0): 7.697 seconds

Nicht-lineare Ausgabe

Wenn wir den Job mit 4 parallelen Arbeitern ausgeführt haben, hat der serielle Job zuerst seine Ausgabe geschrieben, dann haben die parallelen Prozesse ihre Ausgabe geschrieben, wobei Prozess 0 zuerst und zuletzt kam.

Bei 8 Workern ist dies nicht der Fall: Da die parallelen Worker weniger Zeit benötigen als die seriellen, ist es schwer zu sagen, welcher Prozess seine Ausgabe zuerst schreiben wird, außer dass es nicht Prozess 0 sein wird!

Fassen wir nun die Zeit zusammen, die jeder Job für seine Ausführung benötigt hat:

Number of CPUs Runtime (sec)
1 30.033
4 10.888
8 7.697

Dann verwenden Sie die erste Zeile, um die Geschwindigkeitssteigerung \(S\) zu berechnen, indem Sie Python als Befehlszeilenrechner und die Formel

\[ S(t_{n}) = \frac{t_{1}}{t_{n}} \]

BASH

[yourUsername@login1 ~] for n in 30.033 10.888 7.697; do python3 -c "print(30.033 / $n)"; done
Number of CPUs Speedup Ideal
1 1.0 1
4 2.75 4
8 3.90 8

Aus den Job-Ausgabedateien geht hervor, dass dieses Programm 85 % seiner Arbeit parallel ausführt und 15 % seriell abläuft. Dies scheint recht hoch zu sein, aber unsere schnelle Untersuchung der Beschleunigung zeigt, dass wir 8 oder 9 Prozessoren parallel verwenden müssen, um eine 4fache Beschleunigung zu erreichen. In realen Programmen wird der Beschleunigungsfaktor beeinflusst durch

  • CPU-Design
  • Kommunikationsnetz zwischen Rechenknoten
  • Implementierungen der MPI-Bibliothek
  • Einzelheiten zum MPI-Programm selbst

Mit Hilfe des Amdahlschen Gesetzes können Sie beweisen, dass es unmöglich ist, mit diesem Programm eine 8-fache Beschleunigung zu erreichen, egal wie viele Prozessoren Sie zur Verfügung haben. Die Einzelheiten dieser Analyse mit den entsprechenden Ergebnissen werden in der nächsten Klasse des HPC Carpentry Workshops HPC Workflows behandelt.

In einer HPC-Umgebung versuchen wir, die Ausführungszeit für alle Arten von Aufträgen zu reduzieren, und MPI ist eine sehr gängige Methode, um Dutzende, Hunderte oder Tausende von CPUs zur Lösung eines einzigen Problems zu kombinieren. Um mehr über Parallelisierung zu erfahren, lesen Sie die Lektion parallel-novice.

Hauptpunkte

  • Parallele Programmierung ermöglicht es Anwendungen, die Vorteile paralleler Hardware zu nutzen.
  • Das Warteschlangensystem erleichtert die Ausführung von parallelen Aufgaben.
  • Leistungssteigerungen durch parallele Ausführung skalieren nicht linear.

Content from Effektive Nutzung von Ressourcen


Zuletzt aktualisiert am 2025-08-04 | Diese Seite bearbeiten

Übersicht

Fragen

  • Wie kann ich vergangene Aufträge überprüfen?
  • Wie kann ich dieses Wissen nutzen, um ein genaueres Einreichungsskript zu erstellen?

Ziele

  • Job-Statistiken nachschlagen.
  • Stellen Sie genauere Ressourcenanforderungen in Jobskripten auf der Grundlage von Daten, die die vergangene Leistung beschreiben.

Wir haben alle Fertigkeiten behandelt, die Sie für die Interaktion mit einem HPC-Cluster benötigen: Anmeldung über SSH, Laden von Softwaremodulen, Übermittlung paralleler Aufträge und Auffinden der Ausgabe. Jetzt geht es darum, die Ressourcennutzung abzuschätzen und zu verstehen, warum das wichtig sein kann.

Schätzung der benötigten Ressourcen durch den Scheduler


Auch wenn wir die Anforderung von Ressourcen beim Scheduler bereits mit dem π-Code behandelt haben, woher wissen wir, welche Art von Ressourcen die Software überhaupt benötigt und welchen Bedarf sie jeweils hat? Im Allgemeinen wissen wir nicht, wie viel Arbeitsspeicher oder Rechenzeit ein Programm benötigen wird, es sei denn, die Software-Dokumentation oder Benutzerberichte geben uns eine Vorstellung davon.

Lesen Sie die Dokumentation

Die meisten HPC-Einrichtungen verfügen über eine Dokumentation in Form eines Wikis, einer Website oder eines Dokuments, das Ihnen bei der Registrierung für ein Konto zugeschickt wird. Werfen Sie einen Blick auf diese Ressourcen und suchen Sie nach der Software, die Sie verwenden möchten: Vielleicht hat jemand eine Anleitung geschrieben, wie Sie das Beste daraus machen können.

Eine bequeme Methode, um herauszufinden, welche Ressourcen für die erfolgreiche Ausführung eines Jobs benötigt werden, besteht darin, einen Testjob abzuschicken und dann den Scheduler mit sacct -u yourUsername nach dessen Auswirkungen zu fragen. Sie können dieses Wissen nutzen, um den nächsten Job mit einer genaueren Abschätzung seiner Belastung des Systems einzurichten. Eine gute allgemeine Regel ist es, den Scheduler um 20 bis 30 % mehr Zeit und Speicher zu bitten, als Sie erwarten, daß der Job benötigt. Dadurch wird sichergestellt, dass geringfügige Schwankungen in der Laufzeit oder im Speicherbedarf nicht dazu führen, dass Ihr Auftrag vom Scheduler abgebrochen wird. Wenn Sie zu viel verlangen, kann es sein, dass Ihr Auftrag nicht ausgeführt werden kann, obwohl genügend Ressourcen zur Verfügung stehen, weil der Scheduler darauf wartet, dass andere Aufträge beendet werden und die Ressourcen freigeben, die für die von Ihnen verlangte Menge benötigt werden.

Statistiken


Da wir amdahl bereits zur Ausführung im Cluster eingereicht haben, können wir den Scheduler abfragen, um zu sehen, wie lange unser Job gedauert hat und welche Ressourcen verwendet wurden. Wir werden sacct -u yourUsername verwenden, um Statistiken über parallel-job.sh zu erhalten.

BASH

[yourUsername@login1 ~] sacct -u yourUsername

AUSGABE

       JobID    JobName  Partition    Account  AllocCPUS      State ExitCode
------------ ---------- ---------- ---------- ---------- ---------- --------
7               file.sh cpubase_b+ def-spons+          1  COMPLETED      0:0
7.batch           batch            def-spons+          1  COMPLETED      0:0
7.extern         extern            def-spons+          1  COMPLETED      0:0
8               file.sh cpubase_b+ def-spons+          1  COMPLETED      0:0
8.batch           batch            def-spons+          1  COMPLETED      0:0
8.extern         extern            def-spons+          1  COMPLETED      0:0
9            example-j+ cpubase_b+ def-spons+          1  COMPLETED      0:0
9.batch           batch            def-spons+          1  COMPLETED      0:0
9.extern         extern            def-spons+          1  COMPLETED      0:0

Hier werden alle Aufträge angezeigt, die heute ausgeführt wurden (beachten Sie, dass es mehrere Einträge pro Auftrag gibt). Um Informationen über einen bestimmten Auftrag zu erhalten (z. B. 347087), ändern wir den Befehl leicht ab.

BASH

[yourUsername@login1 ~] sacct -u yourUsername -l -j 347087

Hier werden viele Informationen angezeigt, und zwar jede einzelne Information, die der Scheduler über Ihren Job sammelt. Es kann sinnvoll sein, diese Informationen nach less umzuleiten, um sie leichter einsehen zu können (verwenden Sie die Pfeiltasten links und rechts, um durch die Felder zu blättern).

BASH

[yourUsername@login1 ~] sacct -u yourUsername -l -j 347087 | less -S

Diskussion

Diese Ansicht hilft beim Vergleich der angeforderten und tatsächlich genutzten Zeit, der Verweildauer in der Warteschlange vor dem Start und des Speicherbedarfs auf dem/den Rechenknoten.

Wie genau waren unsere Schätzungen?

Verbesserung der Ressourcenanfragen


Aus der Job-Historie geht hervor, dass die Ausführung von amdahl Jobs in höchstens ein paar Minuten abgeschlossen war, sobald sie versandt wurden. Die von uns im Auftragsskript angegebene Zeit war viel zu lang! Dadurch wird es für das Warteschlangensystem schwieriger, genau abzuschätzen, wann Ressourcen für andere Aufträge frei werden. In der Praxis bedeutet dies, dass das Warteschlangensystem mit der Abfertigung unseres Auftrags amdahl wartet, bis das gesamte angeforderte Zeitfenster geöffnet wird, anstatt ihn in ein viel kürzeres Zeitfenster zu “schieben”, in dem der Auftrag tatsächlich beendet werden könnte. Wenn Sie die erwartete Laufzeit im Einreichungsskript genauer angeben, können Sie die Überlastung des Clusters verringern und Ihren Auftrag möglicherweise früher abfertigen lassen.

Eingrenzung der Zeitabschätzung

Bearbeiten Sie parallel_job.sh, um eine bessere Zeitschätzung zu erhalten. Wie nah können Sie herankommen?

Hinweis: Verwenden Sie -t.

Die folgende Zeile teilt Slurm mit, dass unser Auftrag innerhalb von 2 Minuten beendet sein soll:

BASH

#SBATCH -t 00:02:00

Hauptpunkte

  • Präzise Jobskripte helfen dem Warteschlangensystem bei der effizienten Zuweisung gemeinsamer Ressourcen.

Content from Gemeinsame Ressourcen verantwortungsvoll nutzen


Zuletzt aktualisiert am 2025-08-04 | Diese Seite bearbeiten

Übersicht

Fragen

  • Wie kann ich ein verantwortlicher Benutzer sein?
  • Wie kann ich meine Daten schützen?
  • Wie kann ich am besten große Datenmengen von einem HPC-System abrufen?

Ziele

  • Beschreiben Sie, wie sich die Aktionen eines einzelnen Benutzers auf die Erfahrungen anderer Benutzer in einem gemeinsam genutzten System auswirken können.
  • Diskutieren Sie das Verhalten eines rücksichtsvollen gemeinsamen Systembürgers.
  • Erklären Sie, wie wichtig es ist, kritische Daten zu sichern.
  • Beschreiben Sie die Herausforderungen bei der Übertragung großer Datenmengen von HPC-Systemen.
  • Konvertiert viele Dateien in eine einzige Archivdatei mit tar.

Einer der Hauptunterschiede zwischen der Nutzung entfernter HPC-Ressourcen und Ihrem eigenen System (z.B. Ihrem Laptop) ist, dass entfernte Ressourcen gemeinsam genutzt werden. Wie viele Benutzer sich die Ressourcen gleichzeitig teilen, ist von System zu System unterschiedlich, aber es ist unwahrscheinlich, dass Sie jemals der einzige Benutzer sind, der an einem solchen System angemeldet ist oder es benutzt.

Der weit verbreitete Einsatz von Scheduling-Systemen, bei denen Benutzer Jobs auf HPC-Ressourcen einreichen, ist ein natürliches Ergebnis der gemeinsamen Nutzung dieser Ressourcen. Es gibt noch andere Dinge, die Sie als aufrechtes Mitglied der Gemeinschaft beachten müssen.

Sei nett zu den Login-Knoten


Der Login-Knoten ist oft damit beschäftigt, alle angemeldeten Benutzer zu verwalten, Dateien zu erstellen und zu bearbeiten und Software zu kompilieren. Wenn dem Rechner der Speicher oder die Verarbeitungskapazität ausgeht, wird er sehr langsam und für alle unbrauchbar. Der Rechner soll zwar genutzt werden, aber bitte nur so, dass die anderen Benutzer nicht beeinträchtigt werden.

Anmeldeknoten sind immer der richtige Ort, um Aufträge zu starten. Cluster-Richtlinien variieren, aber sie können auch zum Testen von Arbeitsabläufen verwendet werden, und in einigen Fällen können sie erweiterte clusterspezifische Debugging- oder Entwicklungstools hosten. Im Cluster gibt es möglicherweise Module, die geladen werden müssen, möglicherweise in einer bestimmten Reihenfolge, und Pfade oder Bibliotheksversionen, die sich von Ihrem Laptop unterscheiden. Ein interaktiver Testlauf auf dem Hauptknoten ist eine schnelle und zuverlässige Methode, um diese Probleme zu entdecken und zu beheben.

Anmeldeknoten sind eine gemeinsam genutzte Ressource

Denken Sie daran, dass der Login-Knoten mit allen anderen Benutzern geteilt wird und dass Ihre Aktionen Probleme für andere Personen verursachen könnten. Denken Sie daher sorgfältig über die möglichen Auswirkungen von Befehlen nach, die große Mengen an Ressourcen verbrauchen können.

Unsicher? Fragen Sie Ihren freundlichen Systemadministrator (“sysadmin”), ob das, was Sie vorhaben, für den Login-Knoten geeignet ist, oder ob es einen anderen Mechanismus gibt, um es sicher zu erledigen.

Sie können immer die Befehle top und ps ux verwenden, um die Prozesse aufzulisten, die auf dem Login-Knoten laufen, zusammen mit der Menge an CPU und Speicher, die sie verwenden. Wenn diese Überprüfung ergibt, dass der Login-Knoten einigermaßen untätig ist, können Sie ihn gefahrlos für Ihre nicht-routinemäßige Verarbeitungsaufgabe verwenden. Wenn etwas schief geht - der Prozess braucht zu lange oder antwortet nicht - können Sie den Befehl kill zusammen mit der PID verwenden, um den Prozess zu beenden.

Login-Knoten-Knigge

Welcher dieser Befehle wäre eine Routineaufgabe, die auf dem Anmeldeknoten ausgeführt werden sollte?

  1. python physics_sim.py
  2. make
  3. create_directories.sh
  4. molecular_dynamics_2
  5. tar -xzf R-3.3.0.tar.gz

Das Erstellen von Software, das Anlegen von Verzeichnissen und das Entpacken von Software sind übliche und akzeptable > Aufgaben für den Login-Knoten: Die Optionen #2 (make), #3 (mkdir) und #5 (tar) sind wahrscheinlich OK. Beachten Sie, dass Skriptnamen nicht immer ihren Inhalt widerspiegeln: bevor Sie #3 starten, prüfen Sie bitte less create_directories.sh und stellen Sie sicher, dass es sich nicht um ein trojanisches Pferd handelt.

Das Ausführen ressourcenintensiver Anwendungen ist verpönt. Wenn Sie nicht sicher sind, dass andere Benutzer nicht beeinträchtigt werden, sollten Sie Aufträge wie #1 (python) oder #4 (benutzerdefinierter MD-Code) nicht ausführen. Wenn Sie unsicher sind, fragen Sie Ihren freundlichen Systemadministrator um Rat.

Wenn Sie Leistungsprobleme mit einem Anmeldeknoten haben, sollten Sie dies dem Systempersonal melden (normalerweise über den Helpdesk), damit sie es untersuchen können.

Test vor der Skalierung


Denken Sie daran, dass die Nutzung von gemeinsam genutzten Systemen in der Regel kostenpflichtig ist. Ein einfacher Fehler in einem Jobskript kann am Ende einen großen Teil des Ressourcenbudgets verschlingen. Stellen Sie sich vor, ein Jobskript mit einem Fehler, der dazu führt, dass es 24 Stunden lang auf 1000 Kernen nichts tut, oder eines, bei dem Sie versehentlich 2000 Kerne angefordert haben und nur 100 davon nutzen! Dieses Problem kann sich noch verschärfen, wenn Skripte geschrieben werden, die die Auftragsübermittlung automatisieren (z. B. wenn dieselbe Berechnung oder Analyse mit vielen verschiedenen Parametern oder Dateien ausgeführt wird). Dies schadet sowohl Ihnen (da Sie viele gebührenpflichtige Ressourcen verschwenden) als auch anderen Benutzern (denen der Zugriff auf die ungenutzten Rechenknoten verwehrt wird). Bei stark ausgelasteten Ressourcen kann es vorkommen, dass Sie tagelang in einer Warteschlange warten, bis Ihr Auftrag innerhalb von 10 Sekunden nach dem Start wegen eines trivialen Tippfehlers im Auftragsskript fehlschlägt. Das ist extrem frustrierend!

Die meisten Systeme bieten spezielle Ressourcen zum Testen an, die kurze Wartezeiten haben, damit Sie dieses Problem vermeiden können.

Testen Sie Skripte für die Übermittlung von Aufträgen, die große Mengen an Ressourcen verwenden

Bevor Sie eine große Anzahl von Aufträgen übermitteln, sollten Sie zunächst einen Testlauf durchführen, um sicherzustellen, dass alles wie erwartet funktioniert.

Bevor Sie einen sehr großen oder sehr langen Auftrag übermitteln, führen Sie einen kurzen, verkürzten Test durch, um sicherzustellen, dass der Auftrag wie erwartet startet.

Have a Backup Plan


Obwohl viele HPC-Systeme Backups aufbewahren, decken diese nicht immer alle verfügbaren Dateisysteme ab und sind möglicherweise nur für Disaster Recovery-Zwecke gedacht (d.h. für die Wiederherstellung des gesamten Dateisystems im Falle eines Verlustes und nicht für eine einzelne Datei oder ein Verzeichnis, das Sie versehentlich gelöscht haben). Der Schutz kritischer Daten vor Beschädigung oder Löschung liegt in erster Linie in Ihrer Verantwortung: Erstellen Sie eigene Sicherungskopien.

Versionskontrollsysteme (wie Git) haben oft kostenlose, Cloud-basierte Angebote (z. B. GitHub und GitLab), die im Allgemeinen zum Speichern von Quellcode verwendet werden. Auch wenn Sie keine eigenen Programme schreiben, können diese sehr nützlich sein, um Jobskripte, Analyseskripte und kleine Eingabedateien zu speichern.

Wenn Sie Software erstellen, haben Sie möglicherweise eine große Menge an Quellcode, den Sie kompilieren, um Ihre ausführbare Datei zu erstellen. Da diese Daten im Allgemeinen durch erneutes Herunterladen des Codes oder durch erneutes Auschecken aus dem Quellcode-Repository wiederhergestellt werden können, sind diese Daten auch weniger kritisch zu schützen.

Bei größeren Datenmengen, insbesondere bei wichtigen Ergebnissen Ihrer Läufe, die möglicherweise unersetzlich sind, sollten Sie sicherstellen, dass Sie über ein robustes System verfügen, mit dem Sie Kopien der Daten vom HPC-System nach Möglichkeit auf einen gesicherten Speicherplatz übertragen. Werkzeuge wie rsync können dabei sehr nützlich sein.

Ihr Zugriff auf das gemeinsam genutzte HPC-System ist in der Regel zeitlich begrenzt, daher sollten Sie sicherstellen, dass Sie einen Plan für die Übertragung Ihrer Daten vom System haben, bevor Ihr Zugriff endet. Die Zeit, die für die Übertragung großer Datenmengen benötigt wird, sollte nicht unterschätzt werden, und Sie sollten sicherstellen, dass Sie dies früh genug geplant haben (idealerweise, bevor Sie das System überhaupt für Ihre Forschung nutzen).

In all diesen Fällen sollte der Helpdesk des von Ihnen verwendeten Systems in der Lage sein, Ihnen nützliche Hinweise zu den Möglichkeiten der Datenübertragung für die von Ihnen verwendeten Datenmengen zu geben.

Ihre Daten sind Ihre Verantwortung

Vergewissern Sie sich, dass Sie die Sicherungsrichtlinien für die Dateisysteme auf dem von Ihnen verwendeten System kennen und wissen, welche Auswirkungen dies auf Ihre Arbeit hat, wenn Sie Ihre Daten auf dem System verlieren. Planen Sie die Sicherung kritischer Daten und die Art und Weise, wie Sie die Daten während des Projekts aus dem System transferieren werden.

Übertragen von Daten


Wie bereits erwähnt, stehen viele Benutzer irgendwann vor der Herausforderung, große Datenmengen von HPC-Systemen zu übertragen (dies geschieht häufiger bei der Übertragung von Daten von als auf Systeme, aber die folgenden Ratschläge gelten in beiden Fällen). Die Geschwindigkeit der Datenübertragung kann durch viele verschiedene Faktoren begrenzt werden, so dass der am besten geeignete Datenübertragungsmechanismus von der Art der zu übertragenden Daten und dem Zielort der Daten abhängt.

Die Komponenten zwischen der Quelle und dem Ziel Ihrer Daten haben unterschiedliche Leistungsniveaus und können insbesondere unterschiedliche Fähigkeiten in Bezug auf Bandbreite und Latenz haben.

Bandbreite ist im Allgemeinen die Rohdatenmenge pro Zeiteinheit, die ein Gerät senden oder empfangen kann. Es ist eine übliche und allgemein gut verstandene Metrik.

Latenz ist ein wenig subtiler. Bei Datenübertragungen kann man sie sich als die Zeit vorstellen, die benötigt wird, um Daten aus dem Speicher in eine übertragbare Form zu bringen. Latenzprobleme sind der Grund dafür, dass es ratsam ist, Datenübertragungen durch das Verschieben einer kleinen Anzahl großer Dateien durchzuführen und nicht umgekehrt.

Einige der Schlüsselkomponenten und die damit verbundenen Probleme sind:

  • Festplattengeschwindigkeit: Dateisysteme auf HPC-Systemen sind oft hochgradig parallel und bestehen aus einer sehr großen Anzahl von Hochleistungslaufwerken. Dadurch können sie eine sehr hohe Datenbandbreite unterstützen. Wenn das entfernte System nicht über ein ähnlich paralleles Dateisystem verfügt, kann die Übertragungsgeschwindigkeit durch die dortige Festplattenleistung begrenzt sein.
  • Metadaten-Leistung: Metadaten-Operationen wie das Öffnen und Schließen von Dateien oder das Auflisten des Besitzers oder der Größe einer Datei sind viel weniger parallel als Lese-/Schreiboperationen. Wenn Ihre Daten aus einer sehr großen Anzahl kleiner Dateien bestehen, kann es sein, dass Ihre Übertragungsgeschwindigkeit durch Metadatenoperationen begrenzt wird. Metadaten-Operationen, die von anderen Benutzern des Systems durchgeführt werden, können auch stark mit den von Ihnen durchgeführten Operationen interagieren, so dass eine Verringerung der Anzahl solcher Operationen (durch Zusammenfassen mehrerer Dateien zu einer einzigen Datei) die Variabilität Ihrer Übertragungsraten verringern und die Übertragungsgeschwindigkeit erhöhen kann.
  • Netzwerkgeschwindigkeit: Die Leistung der Datenübertragung kann durch die Netzwerkgeschwindigkeit begrenzt werden. Noch wichtiger ist, dass sie durch den langsamsten Abschnitt des Netzwerks zwischen Quelle und Ziel begrenzt wird. Wenn Sie die Daten auf Ihren Laptop/Arbeitsplatz übertragen, ist dies wahrscheinlich seine Verbindung (entweder über LAN oder WiFi).
  • Firewall-Geschwindigkeit: Die meisten modernen Netzwerke sind durch eine Art Firewall geschützt, die bösartigen Datenverkehr herausfiltert. Diese Filterung ist mit einem gewissen Overhead verbunden und kann zu einer Verringerung der Datenübertragungsleistung führen. Die Anforderungen eines Allzwecknetzes, das E-Mail-/Web-Server und Desktop-Rechner beherbergt, unterscheiden sich deutlich von denen eines Forschungsnetzes, das große Datenmengen übertragen muss. Wenn Sie versuchen, Daten zu oder von einem Host in einem Netzwerk für allgemeine Zwecke zu übertragen, werden Sie feststellen, dass die Firewall dieses Netzwerks die erreichbare Übertragungsrate begrenzt.

Wie bereits erwähnt, wird bei zusammenhängenden Daten, die aus einer großen Anzahl kleiner Dateien bestehen, dringend empfohlen, die Dateien zur langfristigen Speicherung und Übertragung in eine größere Archiv-Datei zu packen. Eine einzelne große Datei nutzt das Dateisystem effizienter und ist einfacher zu verschieben, zu kopieren und zu übertragen, da deutlich weniger Metadatenoperationen erforderlich sind. Archivdateien können mit Werkzeugen wie tar und zip erstellt werden. Wir haben tar bereits kennengelernt, als wir früher über die Datenübertragung gesprochen haben.

Schematische Darstellung der Netzwerkbandbreite
Schematische Darstellung der Bandbreite und Latenz für Festplatten- und Netzwerk-E/A. Jede der Komponenten in der Abbildung ist durch eine blaue Linie verbunden, deren Breite proportional zur Schnittstellenbandbreite ist. Die kleinen Labyrinthe an den Verbindungspunkten veranschaulichen die Latenz der Verbindung, wobei gewundenere Labyrinthe eine höhere Latenz anzeigen.

Überlegen Sie, wie Sie die Daten am besten übertragen

Wenn Sie große Datenmengen übertragen, müssen Sie sich Gedanken darüber machen, was Ihre Übertragungsleistung beeinträchtigen könnte. Es ist immer sinnvoll, einige Tests durchzuführen, anhand derer Sie hochrechnen können, wie lange die Übertragung Ihrer Daten dauern wird.

Angenommen, Sie haben einen Ordner “data”, der etwa 10.000 Dateien enthält, eine gesunde Mischung aus kleinen und großen ASCII- und Binärdaten. Welche der folgenden Möglichkeiten wäre die beste, um sie nach HPC Carpentry’s Cloud Cluster zu übertragen?

  1. scp -r data yourUsername@cluster.hpc-carpentry.org:~/

  2. rsync -ra data yourUsername@cluster.hpc-carpentry.org:~/

  3. rsync -raz data yourUsername@cluster.hpc-carpentry.org:~/

  4. tar -cvf data.tar data;

    rsync -raz data.tar yourUsername@cluster.hpc-carpentry.org:~/

  5. tar -cvzf data.tar.gz data;

    rsync -ra data.tar.gz yourUsername@cluster.hpc-carpentry.org:~/

  1. scp wird das Verzeichnis rekursiv kopieren. Dies funktioniert, aber ohne Kompression.
  2. rsync -ra funktioniert wie scp -r, behält aber Dateiinformationen wie Erstellungszeiten bei. Dies ist geringfügig besser.
  3. rsync -raz fügt eine Komprimierung hinzu, die etwas Bandbreite spart. Wenn Sie eine starke CPU an beiden Enden der Leitung haben und sich in einem langsamen Netzwerk befinden, ist dies eine gute Wahl.
  4. Dieser Befehl verwendet zunächst tar, um alles in einer einzigen Datei zusammenzufassen, und dann rsync -z, um es mit Kompression zu übertragen. Bei einer so großen Anzahl von Dateien kann der Overhead an Metadaten die Übertragung behindern, daher ist dies eine gute Idee.
  5. Dieser Befehl verwendet tar -z, um das Archiv zu komprimieren, und dann rsync, um es zu übertragen. Dies kann ähnlich funktionieren wie #4, aber in den meisten Fällen (bei großen Datenmengen) ist es die beste Kombination aus hohem Durchsatz und niedriger Latenz (um das Beste aus Ihrer Zeit und Ihrer Netzwerkverbindung zu machen).

Hauptpunkte

  • Seien Sie vorsichtig, wie Sie den Login-Knoten verwenden.
  • Für Ihre Daten auf dem System sind Sie selbst verantwortlich.
  • Planen und Testen großer Datenübertragungen.
  • Es ist oft am besten, viele Dateien vor der Übertragung in eine einzige Archivdatei zu konvertieren.