Arbeiten mit Python Virtualenvs auf dem Cluster
- Eine Shell auf einem Compute-Node nutzen
- Virtualenvs erstellen
- Virtualenv aktivieren und nutzen
- Jobs mit Virtualenv starten
Für die meisten Python-Projekte empfiehlt es sich, ein Virtual Environment zu benutzen, um sie auszuführen. Ein Virtual Environment ist quasi eine lokale Python-Installation in einem Ordner, so dass dort nur die Pakete verfügbar sind, die für das Projekt gebraucht werden. Dies ist insbesondere dann nötig, wenn verschiedene Projekte unterschiedliche Versionen des selben Pakets benötigen.
Eine Shell auf einem Compute-Node nutzen
Der Server slurmmaster-ls6
hat absichtlich wenig Ressourcen, um zu verhindern, dass Rechenjobs an Slurm vorbei gestartet werden. Es gibt jedoch Pakete (pytorch), welche bereits zum Installieren größere Ressourcenmengen benötigen.
Um ein Virtualenv einzurichten, ohne jeden Befehl separat mit srun
oder sbatch
auf einem Compute Node auszuführen, kann man auch eine interaktive Shell auf einem Compute Node starten. Hierzu muss srun
mit dem Parameter --pty
aufgerufen werden, um interaktive Prozesse zu erlauben. Wird ein Virtualenv für GPU-Jobs erstellt, ist es außerdem empfehlenswert mit -w
einen GPU-Node explizit anzugeben:
srun --pty -w tithanos bash
Virtualenvs erstellen
Zum Erstellen eines Virtualenvs kann das in Python integrierte Modul venv
genutzt werden. Dabei sollte auch gleich pip
auf den neuesten Stand gebracht werden:
python3.8 -mvenv myNewVenv
source myNewVenv/bin/activate
pip install -U pip
Dies erstellt ein neues Virtualenv im Ordner myNewVenv
. Dieses nutzt die Python-Version, welche zum Erstellen benutzt
wird, d.h. in diesem Beispiel wird innerhalb des Virtualenv der Befehl python
auf python3.8
verweisen.
Es können beliebig viele Virtualenvs angelegt werden, hierzu einfach verschiedene Ordnernamen nutzen
Virtualenv aktivieren und nutzen
Um ein Virtualenv zu nutzen, muss man es “aktivieren”, was in der laufenden Shell den PATH
anpasst, so dass python
die Installation aus dem Virtualenv nutzt. Hierzu folgenden Befehl aufrufen (myNewVenv
durch den Pfad zum
Virtualenv-Ordner ersetzen):
source myNewVenv/bin/activate
Je nach benutzter Shell sollte dann das Prompt (venv)
o.ä. enthalten. Nun können Pakete mit pip
in das Virtualenv installiert werden.
# Installiere tensorflow
pip install tensorflow
# Installiere Pakete aus einer requirements.txt
pip install -r myProject/requirements.txt
# Installiere eigenes Projekt z.B. aus Gitlab.
# -e bewirkt, dass der Ordner zum PYTHONPATH hinzugefügt wird, d.h. Änderungen am Projekt wirken sich direkt ohne neue
# Installation aus
git clone https://gitlab2.informatik.uni-wuerzburg.de/example/exampleProject
pip install -e ./exampleProject
Jobs mit Virtualenv starten
Wenn ein Job mit Slurm gestartet wird, nutzt der die beim Aufruf von srun
/sbatch
gültigen Environment-Variablen, d.h. falls man sein Virtualenv wie oben aktiviert hat, wird dies auch beim Job übernommen.
Alternativ kann man, falls der Job aus einem Shellscript besteht, die Zeile source ${PFAD_ZUM_VENV}/bin/activate
oben im Script einfügen (${PFAD_ZUM_VENV}
dabei natürlich entsprechend ersetzen).