In diesem Kapitel zeigen wir dir, wie du dein Modell auf dem High Performance Cluster der WWU trainieren kannst.
Der Login-Prozess für das HPC wird in diesem Tutorial verkürzt (aber ausreichend) dargestellt. Für weitere Infos zur Funktionsweise des HPC gibt es ein ausführlichen Wiki unter High Performance Computing.
0. Registrierung auf PALMA
Um Zugriff auf das HPC zu bekommen, musst du (bzw. deine Uni-Kennung) der Nutzergruppe u0clstr zugeordnet sein.
Du kannst dich selbst in die Nutzergruppe eintragen, dies wird über das WWU-IT Portal erledigt.
Gehe hierzu im IT-Portal links auf den Punkt "WWU-Kennung und Gruppenmitgliedschaften" und anschließend links im Menü auf den Punkt "... neu beanragen".
Im nun erscheinenden Dropdown suchst du nach der Nutzergruppe "u0clstr" und beantragst die Mitgliedschaft.
Gegebenenfalls musst du nun bis zu 24 Stunden warten, bis alle Gruppenmitgliedschaften auf den HPC-Systemen aktualisiert sind. Warte also bitte einen Tag, bevor du fortfährst.
Anschließend kannst du deinen SSH-Key hinterlegen. Das bedeutet in einfacher Form, wir teilen dem HPC mit, dass dein Computer vertrauenswürdig ist. Diese Schritte musst du nur einmal für alle Projekte auf deinem Computer wiederholen, dafür jedoch für jeden Computer getrennt. Ohne eine weitere Passworteingabe kann das HPC dadurch sicherstellen, dass nur Personen bzw. Geräte auf das HPC zugreifen, die dazu berechtigt sind.
Hast du deine SSH-Schlüssel gefunden oder generiert, kannst du diesen im IT-Portal der WWU hochladen. Hierzu gehst du links im Menü auf den Punkt "HPC-Systeme" und anschließend in der erscheinenden SSH-Zugangsbox auf den Button "Einrichten".
Hier kannst du nun den Inhalt der Datei, die den Öffentlichen Schlüssel (endet mit *.pub) enthält entweder in das Eingabefeld kopieren oder die Datei selbst hochladen.
Achtung!
Achte darauf, dass du auf jeden Fall den öffentlichen Schlüssel hochlädst, gib niemals deinen privaten Schlüssel (ohne Dateiendung) heraus! Mit Hilfe dieses Schlüssels können im schlimmsten Fall andere deine Identität annehmen! Du solltest die privaten Schlüssel also gut hüten. Im Optimalfall hast du ebenfalls für jeden SSH-Zugang zu deinen Systemen ein eigenes Schlüsselpaar.
1. Login auf PALMA
Nach der Registrierung kannst du dich einfach per SSH mit PALMA verbinden. der Befehl lautet wie folgt:
ssh <nutzerkennung>@palma.uni-muenster.de
In diesem Fall wird der Standard SSH-Schlüssel von deinem System zur Anmeldung genutzt.
Nun solltest du sehen, dass du auf PALMA eingeloggt bist:
INFO
Du befindest dich nun auf dem Head-Node von PALMA. Bitte starte von hier auf keinen Fall Jobs oder Berechnungen (also nutze niemals z.B. den command python um eine Datei auszuführen, sondern nutze das Job-Sytem, siehe unten!). Dieser Node ist nur für die Anmeldung und für das Scheduling der Arbeiten ausgelegt. Es gibt ein Job-System (slurm), über das Berechnungen auf PALMA sozusagen angemeldet werden, slurm kümmert sich dann darum, dass die angefragten Ressourcen auch wirklich frei sind und führt die Aufgabe dann auf einem freien Knoten aus. Lies dafür bitte unbedingt die folgenden Abschnitte oder die Anleitung des HPC: Getting started
2. Meine Daten auf PALMA
Um auf PALMA rechnen zu können, musst du natürlich dafür sorgen, dass deine Software sowie eventuell zur Ausführung benötigte Daten (zum Beispiel Trainingsdaten) im System verfügbar sind. Hierfür gibt es grundsätzlich zahlreiche Möglichkeiten, wir stellen hier die gängigsten einmal kurz vor.
Pfad | Purpose | Verfügbar auf | Hinweise |
---|---|---|---|
/home/[a-z]/<username> Beispiel: | Speicher für Skripte, Binaries, Applications etc. | Login und Compute Nodes | Kein Massenspeicher für Daten! Stark begrenzte Kapazität. Hier solltest du deine Software ablegen. Dieses Verzeichnis ist automatisch als $HOME gesetzt. |
/scratch/tmp/<username> | Temporärer Speicher für In- und Output deiner Software | Login und Compute Nodes | Persistenter Speicher, bitte kümmere dich darum, deine Ergebnisse regelmäßig herunterzuladen und den Ordner aufzuräumen, um keinen Speicherplatz zu verschwenden. Von diesem System werden keine Backups gemacht! Dieses Verzeichnis ist automatisch als $WORK Variable gesetzt. |
/mnt/beeond | Temporärer lokaler Speicher | Compute Node | Geeignet für temporäre Daten, die während der Berechnung anfallen. |
/cloud/wwu1/<projektname>/<sharename> | Cloud-Speicher/Shares | Login (r/w) und Compute Nodes (r) | Optimal z.B. für Trainingsdaten. Um eine Freigabe zu erstellen, schaue dir die Cloud Storage Solutions der WWU an und erstelle sie über den OpenStack (siehe Kapitel zum OpenStack hier im Incub.AI.tor) |
2.1 Meinen Code auf PALMA kopieren
Die einfachste Möglichkeit, deinen Code auf PALMA verfügbar zu machen, ist dein Git-Repository im Home-Ordner zu klonen. Dies ermöglicht auch einfaches Updaten, solltest du deine Skripte weiterentwickeln oder Fehler beheben.
Zum klonen unseres Codes führen wir einfach den clone-Befehl aus:
cd /home/[a-z]/<username> git clone https://zivgitlab.uni-muenster.de/reach-euregio/incubaitor.git
Nun ist dein Code im Home-Ordner als Git-Repository verfügbar, du kannst mittels
git pull
Neue Änderungen vom Git-Server übernehmen, aber natürlich auch Änderungen, die du gegebenenfalls direkt auf PALMA durchführst, Committen.
Solltest du in einem privaten Repository arbeiten, musst du dich gegebenenfalls auf PALMA im Git einloggen, entweder durch einen Token oder per SSH-Key. Diesen Part ergänzen wir hier demnächst.
Stop
Bitte führe deinen Code noch nicht aus, wie du es von deinem lokalen Rechner gewohnt bist. Zur Ausführung von Code auf PALMA kommen wir in Abschnitt 3.
2.2 Sonstige Daten auf PALMA verfügbar machen
Um weitere Daten für deine Skripte verfügbar zu machen (beispielsweise einen Trainingsdatensatz), kannst du den scp-Befehl nutzen, der Analag zu cp auf einem Linux-System Dateien kopiert, jedoch auch mit Remote-Computern klarkommt. Möchten wir beispielsweise unsere Trainings-CSV auf PALMA kopieren:
scp -r /pfad/zu/lokalen/dateien <username>@palma.uni-muenster.de:/scratch/tmp/<username>/
Des Weiteren können wir einen usershare einbinden, den wir im OpenStack siehe Kapitel zum OpenStack) erstellen können und auch anderweitig nutzen können.
3. Job-Skript und Module
Auf PALMA ist einige Software bereits installiert und kann über environment module aufgerufen und genutzt werden. Da viele Module, Libraries und sonstige Software von wiederum anderen Libraries abhängig ist, wird dieses System in PALMA in so genannten toolchains gehandhabt. Eine toolchain ist einfach ein Kombination aus Kompilern und Libraries, derzeit gibt es hier foss (freie und open source Software) und intel (proprietär).
Eine Übersicht der verfügbaren toolchains ist hier einsehbar.
Eine toolchain kann über den Befehl
module load <palma software stack> module load <toolchain> # example: module load palma/2020a module load intel/2020a
geladen werden.
Danach ist erneut über den Befehl
module avail
Eine Liste mit den verfügbaren Libraries zu sehen.
Da PALMA mit einem Batch-System arbeitet und die Rechenkapazitäten mit den Berechnungen (jobs) zentral disponiert werden, müssen wir dem System in einem kleinen Skript mitteilen, welche Ressourcen und welche Software wir für unseren Job benötigen. Der Name der *.sh - Datei ist dabei relativ egal, sie kann zum Beispiel job.sh oder job_carprice.sh heißen, falls es verschiedene Dateien gibt.
In unserem Anwendungsfall könnte die Datei folgendermaßen aussehen:
Passe diese Datei entsprechend an, bevor du sie auf PALMA ausführst.
Zunächst sagen wir dem System, wie viele Knoten wir für unseren Job reservieren möchten, anschließend geben wir weitere Details wie die Anzahl der Tasks/Prozesse pro Node, die Anzahl der CPUs, die maximale Ausführungszeit etc. an. Da wir nur eine kleine Machine-Learning Aufgabe ausführen, benötigen wir keine GPU, diese kann aber ebenfalls reserviert werden, sollten wir GPUs benötigen. Abschließend geben wir ein paar Job-Details an und unsere E-Mail Adresse, an diese schickt das Scheduling-System die Benachrichtigungen, wenn sich der Status unseres Jobs ändert.
Manchmal ist es schwierig, einzuschätzen wie viele Ressourcen du für einen Job benötigst. Hab hier keine Angst, ein wenig auszuprobieren oder zu viele Ressourcen zu belegen. Allerdings gilt: Je mehr Ressourcen du reservierst, desto höher ist die Wahrscheinlichkeit, dass du ein bisschen warten muss bis dein Job startet, da die benötigten Ressourcen gegebenenfalls noch anderweitig reserviert sind.
Nun haben wir das Job-Skript, das unseren Task genau beschreibt und sind soweit startklar zur Ausführung. Hierzu benötigst unter anderem folgende Befehle:
Command | Task |
---|---|
sbatch job.sh | Füge deinen Job zur Warteliste hinzu. |
squeue -u <user> | Zeige alle Jobs eines Nutzers an |
squeue -u <user> -t RUNNING | Zeige alle laufenden Jobs eines Nutzers |
squeue -u <user> -t PENDING | Zeige alle wartenden Jobs eines Nutzers |
scancel <job-id> | Brich einen Job ab |
scancel -u <user> | Brich alle Jobs eines users ab |
scancel --name <jobname> | Brich alle Jobs mit diesem Namen ab |
Hast du nun deinen Job ausgeführt, findest du den Log in einer *.txt - Datei, um eventuelle Fehler nachverfolgen zu können.
4. incub.AI.tor Beispiel
Du kannst nun das Beispiel anpassen. Wenn du das Beispiel wie unter Abschnitt 2 gezeigt in dein Home Verzeichnis kopiert hast, kannst du z.B. über den Editor vim (https://www.vim.org/) die Datei job.sh anpassen (vim ist nicht sehr Nutzerfreundlich!), oder die Anpassung zunächst in einem Editor deiner Wahl durchführen und per scp (siehe 2.2) ersetzen.
Das Beispiel benötigt die Daten im Verzeichnis deiner workdir. Die hier genutzten Daten kommen von Kaggle used car dataset. Dieses kannst du lokal herunterladen und dann entweder in dein lokales Repository aufnehmen oder per scp (siehe oben) direkt in deine working directory laden (hier wurde die Datei schon entpackt und der Ordner in data umbenannt):
scp -i $HOME/.ssh/id_rsa_palma -r data <username>@palma.uni-muenster.de:/scratch/tmp/<username>/
Dann liegt dieser Ordner in der working directory und wir können ihn uns anschauen:
cd $WORK/data ls
und es sollten alle Datensätze aufgeführt sein. Nun müssten wir den job kopieren und starten können:
cd $WORK cp $HOME/incubaitor/2_1_PALMA/job.sh $WORK sbatch job.sh
Der Job bekommt eine jobid die dir angezeigt wird. Mit dem oben beschrieben squeue command können wir schauen, ob der Job ausgeführt wird. In der slurm datei können wir uns den Output auch anschauen (vim slurm-<jobid>.out). Wenn der Job durch ist, solltest du in der Working directory einen Ordner models haben, den du wie folgt wieder herunterladen kannst:
scp -i $HOME/.ssh/id_rsa_palma -r <username>@palma.uni-muenster.de:/scratch/tmp/<username>/models models scp -i $HOME/.ssh/id_rsa_palma <username>@palma.uni-muenster.de:/scratch/tmp/<username>/slurm-<jobid>.out slurm.txt
In slurm.txt kannst du nun den gesamten Python Output sehen, wie es normal unter Python gewesen wäre (inklusive Fehler).
Last but not lead: logge dich wieder von Palma aus indem du
exit
eingibst!