...
- Die Entwicklung der Programme bzw. Skripte und gegebenenfalls das Datenmanagement findet in der Regel auf dem eigenen Rechner statt.
- Die Programme/Skripte und Daten werden auf den Festplattenspeicher des Login-Knoten übermittelt.
- Ein Shell-Skript wird an das Batchsystem geschickt. Dieses Skript enthält sowohl Meta-Informationen zum Auftrag, als auch den eigentlichen Auftrag in Form eines Skripts oder eines Programmaufrufs.
- Das Batchsystem sortiert es gemäß Eigenschaften des Auftrags in Warteschlangen ein, konfiguriert gemäß der Meta-Informationen den angefragten virtuellen Rechner und startet die Bearbeitung auf diesem.
- Während der Bearbeitungszeit kann entweder über das Batchsystem oder über das Monitoring-Tool "myJam" der Status des Auftrags überwacht werden.
Kommunikation mit dem Batchsystem
Die Kommunikation geschieht über spezielle Konsolen-Befehle. Die folgende Liste führt häufig verwendeten Befehle auf. Eine vollständige Dokumentation gibt der PBS Pro User's Guide (PBSProUserGuide12.1).
Ein Arbeitsauftrag an das Batchsystem senden:
Codeblock language bash qsub SHELL-SCRIPT
"SHELL-SCRIPT" bezeichnet hier den Namen des entsprechenden Skripts, dass die Meta-Informationen und die eigentliche Befehle bzw. Programmaufrufe des Arbeitsauftrags umfassen. Die Inhalte und Struktur eines solchen Skripts wird weiter unten besprochen. Als Antwort auf die Übermittlung wir Ihnen die Job-ID mitgeteilt mit deren Hilfe Sie den Status des Arbeitsauftrags überwachen können.
Einen bereits übermittelten Arbeitsauftrag (gegebenenfalls anhalten und) löschen:
Codeblock language bash qdel JOB-ID
"JOB-ID" bezeichnet die Job-ID Ihres Arbeitsauftrags, die Ihnen beim übermitteln des Arbeitsauftrags zugeteilt wurde (siehe "qsub").
Statusinformationen abrufen:
Codeblock language bash firstline 1 linenumbers true qstat -f JOB-ID qstat -u ACCOUNT-NAME qstat -q
In der ersten Zeile werden Informationen zu einem konkreten Arbeitsauftrag abgerufen. In der zweiten Zeile werden Informationen zu allen Arbeitsaufträgen, die unter Ihrem Namen übermittelt wurden, abgefragt. In der letzten Zeile wird der Status (Auslastung, etc) der Warteschlangen des Batchsystems ausgelesen. (Weiterführende Informationen: Kapitel 11 im PBS Pro User's Guide)
Das Shell-Skript
Das folgenden Minimalbeispiel illustriert den Aufbau und den Inhalt eines typischen Shell-Skripts.
Codeblock | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||
#!/bin/bash #PBS -l select=1:ncpus=2:mem=3gb:arch="uv2000" #PBS -l walltime=01:59:00 #PBS -A "HPC-Project" set -e module load R R CMD BATCH --slave R-Script.R R-Output.Rout |
...
Ein solches Skript würde dann mit "qsub startScript1.sh
" an das Batchsystem übermittelt werden.
Ein erweitertes Shell-Skript
Im folgenden Shell-Skript wird, wie im Minimalbeispiel, R für die Abarbeitung eines R-Skript gestartet. Zudem kommen zwei nützliche Erweiterungen hinzu.
- Es wird eine Log-Datei angelegt, in die automatisiert Informationen zum Arbeitsauftrag gespeichert werden. Dies erleichtert bei Problemen während der Auftragsausführung die Fehlersuche.
- Das gesamte Arbeitsverzeichnis wird auf das sehr performante Scratch-Laufwerk (GPFS) kopiert. Dort wird dann die Ausführung gestartet und nach Abschluss wird das gesamte Verzeichnis mitsamt der gespeicherten Resultate zurück kopiert. Diese Ergänzung ist immer dann sinnvoll, wenn innerhalb des Arbeitsauftrag eine intensive Festplattennutzung stattfindet (wenn z.B. viele/große Dateien eingelesen werden sollen oder häufig Resultate gespeichert werden müssen).
Codeblock | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||
#!/bin/bash #PBS -l select=1:ncpus=2:mem=3gb #PBS -l walltime=01:59:00 #PBS -A "HPC-Project" set -e ## Log-File definieren export LOGFILE=$PBS_O_WORKDIR/$PBS_JOBNAME"."$PBS_JOBID".log" ##Scratch-Laufwerk definieren und erzeugen SCRATCHDIR=/scratch_gs/$USER/$PBS_JOBID mkdir -p "$SCRATCHDIR" ##Information zum Start in das Log-File schreiben cd $PBS_O_WORKDIR echo "$PBS_JOBID ($PBS_JOBNAME) @ `hostname` at `date` in "$RUNDIR" START" > $LOGFILE echo "`date +"%d.%m.%Y-%T"`" >> $LOGFILE ##Software-Umgebung laden module load R ##Daten vom Arbeitsverzeichnis auf das Scratch-Laufwerk kopieren cp -r $PBS_O_WORKDIR/* $SCRATCHDIR/. cd $SCRATCHDIR rm $PBS_JOBNAME"."$PBS_JOBID".log" ##R-Aufruf R CMD BATCH --slave R-Script.R R-Output.Rout ##Daten zurück kopieren cp -r "$SCRATCHDIR"/* $PBS_O_WORKDIR/. cd $PBS_O_WORKDIR ##Verfügbare Informationen zum Auftrag in das Log-File schreiben echo >> $LOGFILE qstat -f $PBS_JOBID >> $LOGFILE echo "$PBS_JOBID ($PBS_JOBNAME) @ `hostname` at `date` in "$RUNDIR" END" >> $LOGFILE echo "`date +"%d.%m.%Y-%T"`" >> $LOGFILE |
Paralleles Arbeiten im Shell-Skript
Häufig bieten die genutzten Programme wie Matlab, R, usw. Möglichkeiten die gewünschten Berechnungen auf mehrere Prozessoren zu verteilen. Eine weitere Möglichkeit ist direkt in der Shell gegeben. Der folgende Code zeigt ein Skript, in dem zuerst zwei R-Instanzen geöffnet werden, die jeweils ein Skript verarbeiten. Das "&"-Zeichen am Ende der Zeile weist das System an, nicht auf die Fertigstellung zu warten und beginnt dann parallel mit dem nächsten Aufruf. Der Befehl "wait" bewirkt, dass bei der Abarbeitung des Batch-Skripts solange gewarte wird, bis die zuvor begonnenen Programmaufrufe beendet sind. Daran schließen sich zwei weitere Aufrufe von R an. Ein solche Skript muss immer mit einer "wait"-Anweisung enden.
Codeblock | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||
#!/bin/bash #PBS -l select=1:ncpus=2:mem=3gb #PBS -l walltime=01:59:00 #PBS -A "HPC-Project" set -e module load R R CMD BATCH --slave R-Script1.R R-Output1.Rout & R CMD BATCH --slave R-Script2.R R-Output2.Rout & wait R CMD BATCH --slave R-Script3.R R-Output3.Rout & R CMD BATCH --slave R-Script4.R R-Output4.Rout & wait |
...