Parallele Jobs in Snakemake mit Ressourcen begrenzen

Verfasst von

in

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_data fordert 1 Einheit von process_data_jobs an.
  • Das globale Limit processing_jobs=10 sorgt 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:

  1. mit resources die Ressourcen pro Job festlegt.
  2. 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!