Rinnakkaisten töiden rajoittaminen Snakemakessa resurssien avulla

Johdanto

Kun Snakemakella ajetaan laskennallisesti raskaita työnkulkuja, voi käydä niin, että rinnakkain ajetaan liian monta työtä, mikä aiheuttaa liiallista I/O-kuormaa, muistipainetta tai suurta viivettä kiintolevyllä. Tämä voi johtaa epäonnistuneisiin töihin tai heikkoon suorituskykyyn.

Snakemake tarjoaa resources-direktiivin avulla tavan rajoittaa rinnakkaisuutta sääntökohtaisesti, mutta se toimii vain, jos työnkulkua ajettaessa annetaan myös globaali resurssiraja.

Tässä kirjoituksessa näytän, miten tietyn säännön rinnakkaisten töiden määrä rajoitetaan oikein Snakemaken resurssienhallinnan avulla.


Ongelma: liian monta työtä kerralla

Tarkastellaan seuraavaa Snakemake-sääntöä:

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}
        """

Miksi pelkkä resources ei rajoita töiden suorittamista?

Voisi olettaa, että resources: processing_jobs=1 rajoittaisi Snakemaken automaattisesti ajamaan yhden työn kerrallaan. Snakemake ei kuitenkaan aikatauluta resurssien mukaan, ellei työnkulkua käynnistettäessä anneta globaalia rajaa.

Ilman globaalia rajaa Snakemake voi silti käynnistää liian monta työtä rinnakkain ja kuormittaa järjestelmää liikaa.


Ratkaisu: resurssirajojen pakottaminen

Rinnakkaisten töiden määrän rajoittamiseksi Snakemake ajetaan näin:

snakemake --resources process_data_jobs=10

Miten tämä toimii?

  • Jokainen process_data-työ pyytää 1 yksikön resurssia process_data_jobs.
  • Globaali raja processing_jobs=10 varmistaa, että rinnakkain ajetaan enintään 10 työtä (10 / 1 = 10). Halutessaan yksiköt voi asettaa toisinkin

Ennen rajan asettamista kerralla saattoi olla käynnissä aivan liian monta työtä! Sen jälkeen rinnakkain sai ajaa vain 10 työtä.


Yhteenveto

Jos Snakemakessa on ongelmana suuri levyviive, I/O-kuorma tai liian monta samanaikaista työtä, sen saa parhaiten hallintaan:

  1. määrittelemällä työkohtaiset resurssitarpeet resources-direktiivillä
  2. asettamalla Snakemakea ajettaessa globaalin resurssirajan (--resources processing_jobs=10).

Näin työnkulku toimii tehokkaasti ja luotettavasti kuormittamatta järjestelmää liikaa!