Hyppää sisältöön

GNU xargs ja rinnakkaiset työnkulut monille pienille, itsenäisille ajoille

Page undergoing cleanup after Puhti and Mahti retirement

This page contains outdated references to Puhti and/or Mahti, which have now been decommissioned. The page is undergoing changes to reflect CSC's new supercomputer Roihu.

Learn more about Roihu.

Yleiskatsaus

Tämä opas esittelee yhden lähestymistavan suuren läpimenon laskentaan, jossa suuri määrä samankaltaisia, toisistaan riippumattomia tehtäviä pakataan pieneen määrään Slurm-töitä sen sijaan, että ne lähetettäisiin yksittäisinä töinä.

Sekä xargs että GNU Parallel ovat komentorivikäyttöliittymätyökaluja suuren määrän tehtävien rinnakkaiseen suorittamiseen, ja ne toimivat tässä tarkoituksessa suunnilleen samalla tavalla. Tässä oppaassa käytämme xargs-työkalua, koska se on yksinkertainen, kevyt ja yleensä käyttöjärjestelmän perusasennukseen kuuluva, mutta sama työnvuo voidaan toteuttaa myös GNU Parallelin parallel-komennolla. Tässä käytämme työkalua yhden Slurm-varauksen sisällä, jotta kaikki varatut ytimet pysyvät käytössä: syötetiedostojen nimet välitetään xargs-komennolle, joka jatkaa tehtävien suorittamista, kunnes ne kaikki ovat valmiita, käynnistäen uuden tehtävän heti kun yksi ydin vapautuu.

xargs sopii tähän tarkoitukseen hyvin, koska se ei vaadi tietokantaa tai pysyvää hallintaprosessia, se käyttää ajastimen resursseja tehokkaasti, ja se skaalautuu helposti suureen määrään tehtäviä ja solmuja. Toisaalta se suorittaa vain sarjallisia osatehtäviä eikä tue tehtävien välisiä riippuvuuksia tai virheistä palautumista. Se myös edellyttää, että järjestät syöte- ja tulostiedostot huolellisesti, ja skaalauksen kasvattaminen vaatii järjestelmän I/O-suorituskyvyn huomioimista. Kohtuullinen bash-skriptauksen tuntemus on suositeltavaa.

Jos tehtävilläsi on riippuvuuksia, tarvitset virheistä palautumista tai haluat tutustua työkaluihin, katso sivu suuren läpimenon laskenta ja työnvuot.

Esimerkki: 80000 itsenäisen yhden ytimen tehtävän suorittaminen

Yleisesti työnvuon suunnitteluun tarvitaan kolme syötettä:

  1. Kuinka monta ajoa on yhteensä?
  2. Kuinka kauan yksi ajo kestää?
  3. Kuinka monta tiedostoa luodaan?

Kaksi ensimmäistä määrittävät, miten ajot ryhmitellään eräajoiksi, ja viimeinen määrittää hakemistorakenteen.

Tarkastellaan esimerkkiä, jossa meillä on 80000 toisistaan riippumatonta, ei-rinnakkaista yhden ytimen ajoa, joista kukin kestää 0–30 minuuttia, keskimäärin 15 minuuttia. Pahimmassa tapauksessa kaikki eräajon ajot kestävät enimmäisajan eli 30 minuuttia. Voimme nähdä, että yksi 40 tunnin eräajo riittää vähintään 80 ajolle yhdellä ytimellä ja 3200 ajolle täydellä laskentasolmulla, jossa on kaikki 40 ydintä käytössä. Näin ollen kaikkien 80000 ajon pitäisi mahtua 25:een 40 tunnin eräajoon, joista kukin varaa yhden kokonaisen laskentasolmun.

Oletetaan, että sovelluksemme käyttää levyä erittäin paljon, ja yhden syötetiedoston ja yhden säilytettävän tulostiedoston lisäksi se luo myös 100 väliaikaistiedostoa nykyiseen hakemistoon. Yhdessä hakemistossa voi olla enintään noin 400 syöte- ja tulostiedostoa, ja väliaikaistiedostoille voidaan käyttää I/O-solmujen nopeaa paikallislevyä. Näin 80000 ajolle saadaan 200 hakemistoa, joissa kussakin on 400 ajoa.

many
    dir-001
        input-001
        input-002
        ...
        input-400
    dir-002
    ...
    dir-200

Lisähuomioita tarvitaan, jos yksittäiset ajot ovat rinnakkaisia tai niiden välillä on riippuvuuksia, mutta se on toinen tarina.

Katsotaanpa esimerkkitapauksen työskriptiä:

#!/bin/bash
#SBATCH --partition=small
#SBATCH --account=<project>
#SBATCH --nodes=1
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=40
#SBATCH --time=40:00:00
#SBATCH --mem=160G
#SBATCH --gres=nvme:3600
#SBATCH --array=0-24

cd /scratch/${SLURM_JOB_ACCOUNT}/many

(( from_dir_index = SLURM_ARRAY_TASK_ID * 8 + 1 ))
(( to_dir_index = SLURM_ARRAY_TASK_ID * 8 + 8 ))

job_dirs=$(printf "%dir-%03d " $(seq $from_dir_index $to_dir_index))

find $job_dirs -name 'input-*' | \
    xargs -n 1 -P $SLURM_CPUS_PER_TASK bash wrapper.sh {}

Eräajo varaa kokonaisen solmun 40 tunniksi. Solmussa käynnistyy yksi tehtävä, jolla on pääsy kaikkiin solmun 40 CPU-ytimeen. Koska varaamme kaikki ytimet, voimme samalla varata kaiken muistin ja koko paikallislevyn, eikä tässä tarvitse kitsastella. Viimeinen rivi, #SBATCH --array=0,24, kertoo eräajo- järjestelmälle, että tästä työstä suoritetaan 25 kopiota, joista kukin tunnistetaan yksilöllisellä numerolla ympäristömuuttujassa SLURM_ARRAY_TASK_ID. Jonotilanteesta riippuen monet näistä töistä voivat olla käynnissä rinnakkain.

xargs-komento kuuluu yleensä käyttöjärjestelmän perusasennukseen. HPC-järjestelmissä vastaavan GNU Parallelin parallel-komennon käyttöön saaminen vaatii usein moduulin lataamisen. Käytämme xargs-komentoa (tai GNU Parallelia) solmun sisällä kaikkien 3200 ajon "ajastamiseen" yhdessä työssä siten, että kaikki 40 ydintä ovat koko ajan käytössä, mutta eivät ylikuormitettuina.

Seuraavat rivit laskevat, mitkä hakemistot kuuluvat nykyiseen taulukkotyöhön käyttäen SLURM_ARRAY_TASK_ID-ympäristömuuttujaa.

Skriptin pää-"silmukka" on toteutettu xargs-komennolla (tai GNU Parallelin parallel-komennolla). Valinnalla -P $SLURM_CPUS_PER_TASK kerromme xargsille, että sen tulee pitää 40 komentoa (sovellusta) käynnissä rinnakkain. Koska meidän täytyy kopioida tiedostoja paikalliselle SSD-levylle ja sieltä pois jokaisessa ajossa, käärimme sovelluksemme pieneen komentotulkkiskriptiin wrapper.sh, joka ottaa syötetiedoston nimen argumenttina. Syötetiedostojen nimet välitetään xargsille putken kautta, ja xargs jatkaa komennon bash wrapper.sh <syötetiedosto> suorittamista niin kauan kuin putkessa on argumentteja.

Käärinskriptin erottaminen eräajon työskriptistä mahdollistaa sen, että niitä voidaan kehittää ja testata erikseen. Yleisesti kannattaa käyttää pieniä testiaineistoja työnvuota kehitettäessä, eikä kannata odottaa saavansa kaikkea täydelliseksi ensimmäisellä yrittämällä. Voit tutkia ja testata pientä versiota esimerkkitapauksesta seuraavasti:

export SBATCH_ACCOUNT=<your project>
wget -c https://a3s.fi/docs-files/support/tutorials/many.tar.gz -O - | tar xz
cd many
bash create_inputs.sh
tree /scratch/${SBATCH_ACCOUNT}/many
sbatch job.sh

Note

Useiden erillisten töiden ajaminen suuremman varauksen sisällä voi johtaa käyttämättömiin resursseihin. Varmista, että tällaisessa työssä on paljon nopeasti valmistuvia töitä ajettavana, jotta viimeisenä käynnissä oleva työ ei pidä koko varausta turhaan hengissä pitkään. Siksi alityön keston tulisi olla paljon lyhyempi kuin varauksen kesto, ja alitöiden määrän paljon suurempi kuin yhdessä tehtävässä pyydettyjen ytimien määrä.

Voit käyttää seff -työkalua selvittääksesi, kuinka kauan aiemmat työt ovat kestäneet.

Onko tämä sivu hyödyllinen?
Kiitos palautteestasi!
Kiitos! Arvostamme palautettasi.

Kerro meille miten voisimme parantaa tätä sivua ottamalla meihin yhteyttä .