Einleitung
Bei rechenintensiven Workflows mit Snakemake kann es passieren, dass zu viele Jobs parallel laufen und übermäßige I/O-Last, Speicherdruck oder hohe Latenz auf der Festplatte verursachen. Das kann zu fehlgeschlagenen Jobs oder schlechter Leistung führen.
Snakemake bietet mit der Direktive resources eine Möglichkeit, die parallele Ausführung pro Regel zu begrenzen; das funktioniert aber nur, wenn man beim Ausführen des Workflows auch ein globales Ressourcenlimit angibt.
In diesem Beitrag zeige ich, wie man die Zahl paralleler Jobs für eine bestimmte Regel mit dem Ressourcenmanagement von Snakemake richtig begrenzt.
Das Problem: Zu viele Jobs gleichzeitig
Nehmen wir folgende Snakemake-Regel:
rule process_data:
input:
"{sample}.raw"
output:
"{sample}.processed"
resources:
process_data_jobs=1 # Assign a resource unit for limiting the number of jobs
shell:
"""
some_tool --input {input} --output {output}
"""
Warum begrenzt resources allein die Ausführung nicht?
Man könnte erwarten, dass resources: processing_jobs=1 Snakemake automatisch auf einen Job gleichzeitig beschränkt. Snakemake plant aber nicht nach Ressourcen, solange man beim Start des Workflows kein globales Limit angibt.
Ohne globales Limit startet Snakemake womöglich trotzdem zu viele Jobs parallel und überlastet das System.
Die Lösung: Ressourcenlimits durchsetzen
Um die Zahl paralleler Jobs tatsächlich zu begrenzen, startet man Snakemake mit:
snakemake --resources process_data_jobs=10
Wie funktioniert das?
- Jeder Job von
process_datafordert 1 Einheit vonprocess_data_jobsan. - Das globale Limit
processing_jobs=10sorgt dafür, dass höchstens 10 Jobs (10 / 1 = 10) parallel laufen. Man kann auch andere Einheiten wählen, wenn man möchte
Vor dem Limit liefen teils viel zu viele Jobs gleichzeitig! Danach durften nur noch 10 Jobs parallel laufen.
Fazit
Wer in Snakemake mit hoher Festplattenlatenz, I/O-Druck oder zu vielen gleichzeitigen Jobs kämpft, bekommt das am besten in den Griff, indem er:
- mit
resourcesdie Ressourcen pro Job festlegt. - beim Ausführen von Snakemake ein globales Ressourcenlimit setzt (
--resources processing_jobs=10).
So läuft der Workflow effizient und zuverlässig, ohne das System zu überlasten!
