-
Nextflow-työvuoiden ajaminen supertietokoneilla
Nextflow-työvuoiden ajaminen supertietokoneilla
Nextflow on tieteellinen työnkulunhallintaohjelmisto, joka tarjoaa sisäänrakennetun tuen HPC-ympäristöihin sopiville konteille, kuten Apptainerille (= Singularity). Yksi Nextflown eduista on, että varsinaisen putken toiminnallinen logiikka on erotettu suoritusympäristöstä. Sama skripti voidaan siksi suorittaa eri ympäristöissä muuttamalla suoritusympäristöä koskematta varsinaiseen putkikoodiin. Nextflow käyttää executor-tietoa päättääkseen, missä työ ajetaan. Kun executor on määritetty, Nextflow lähettää jokaisen prosessin puolestasi määritettyyn työnajastimeen.
Oletusexecutor on local, jolloin prosessit ajetaan sillä tietokoneella, jossa Nextflow käynnistetään. Useita muita executoreita tuetaan, ja CSC:n laskentaympäristöihin sopivat parhaiten SLURM- ja HyperQueue-executorit.
Tieteelliseen laskentaan on olemassa monia muitakin suuren läpimenon työkaluja ja työnkulunhallintaohjelmistoja, ja oikean työkalun valinta voi joskus olla haastavaa. Katso yleiskuva sopivista työkaluista suuren läpimenon laskennan ja työnkulkujen sivultamme.
Asennus
Nextflow
Nextflow itse on saatavilla moduulina Puhdissa, Mahdissa ja LUMIssa. Saatavilla olevat tarkat versiot on kuvattu Nextflown pääsivulla.
Nextflowssa käytettävien työkalujen asennus
Paikalliset asennukset
Oletuksena Nextflow odottaa, että analyysityökalut ovat saatavilla paikallisesti. Työkalut voidaan ottaa käyttöön olemassa olevista moduuleista tai omista mukautetuista moduuliasennuksista. Katso myös, miten luodaan kontteja.
Apptainer-asennukset ajon aikana
Kontit voidaan integroida sujuvasti Nextflow-putkiin. Nextflow-skripteihin ei tarvita muita muutoksia kuin Apptainer-moottorin käyttöönotto Nextflown asetustiedostossa. Nextflow voi noutaa etäkonteista Apptainer-kuvia konttirekistereistä ajon aikana. Etäkonteista haettavat kuvat määritellään yleensä Nextflow-skriptissä tai asetustiedostossa lisäämällä kuvan nimen eteen shub:// tai docker://. On myös mahdollista määrittää eri Apptainer-kuva jokaiselle Nextflow-putken prosessimäärittelylle.
Useimmat Nextflow-putket noutavat tarvittavat konttikuvat ajon aikana. Jos putkessa kuitenkin tarvitaan useita kuvia, on hyvä ajatus valmistella kontit paikallisesti ennen Nextflow-putken käynnistämistä.
Käytännön huomioita:
- Apptainer on asennettu kirjautumis- ja laskentasolmuille, eikä erillistä moduulia tarvitse ladata CSC:n supertietokoneilla.
- Kansioiden bindaukseen tai muiden Apptainer-asetusten käyttöön käytä
nextflow.config-tiedostoa. - Jos noudat useita Apptainer-kuvia suoraan ajon aikana, käytä laskentasolmun NVMe-levyä Apptainer-kuvien tallentamiseen. Tee tätä varten eräajotiedostossa ensin pyyntö NVMe-levytilasta ja aseta sitten Apptainerin väliaikaiskansiot ympäristömuuttujiksi.
#SBATCH --gres=nvme:100 # Request 100 GB of space to local disk
export APPTAINER_TMPDIR=$LOCAL_SCRATCH
export APPTAINER_CACHEDIR=$LOCAL_SCRATCH
Warning
Vaikka Nextflow tukee myös Docker-kontteja, niitä ei voi käyttää sellaisenaan supertietokoneilla, koska tavallisilla käyttäjillä ei ole ylläpitäjän oikeuksia.
Käyttö
Nextflow-putkia voidaan ajaa supertietokoneympäristössä eri tavoilla:
- Interaktiivisessa tilassa local-executorilla, rajallisilla resursseilla. Hyödyllinen lähinnä virheenjäljitykseen tai hyvin pienten työnkulkujen testaukseen.
- Eräajona ja local-executorilla. Hyödyllinen pienille ja keskisuurille työnkuluille.
- Eräajona ja SLURM-executorilla. Tämä voi käyttää useita solmuja ja eri SLURM-osioita (CPU ja GPU), mutta voi aiheuttaa merkittävää kuormaa, jos pieniä töitä on paljon. Tätä voi käyttää, jos jokainen työvaihe jokaiselle tiedostolle kestää vähintään 30 minuuttia.
- Eräajona ja HyperQueue alityönajastimena. Voi käyttää useita solmuja saman eräajoallokaation sisällä, mutta vaatii monimutkaisimman käyttöönoton. Sopii hyvin tilanteisiin, joissa työnkulku sisältää paljon pieniä työvaiheita ja paljon syötetiedostoja (suuren läpimenon laskenta).
Yleisen johdannon eräajoihin löydät sivulta esimerkkieräajoskriptit Puhdille.
Note
Jos et ole varma, miten työnkulku kannattaa ajaa tehokkaasti, älä epäröi ottaa yhteyttä CSC:n asiakastukeen.
Nextflow-skripti
Seuraava minimaalinen esimerkki havainnollistaa Nextflow-skriptin perussyntaksia.
#!/usr/bin/env nextflow
greets = Channel.fromList(["Moi", "Ciao", "Hello", "Hola","Bonjour"])
/*
* Use echo to print 'Hello !' in different languages to a file
*/
process sayHello {
input:
val greet
output:
path "${greet}.txt"
script:
"""
echo ${greet} > ${greet}.txt
"""
}
workflow {
// Print a greeting
sayHello(greets)
}
sayHello. Tämä prosessi ottaa joukon eri kielisiä tervehdyksiä ja kirjoittaa sitten jokaisen niistä erilliseen tiedostoon satunnaisessa järjestyksessä.
Tuloksena syntyvä pääteulostus näyttäisi suunnilleen alla olevan tekstin kaltaiselta:
N E X T F L O W ~ version 23.04.3
Launching `hello-world.nf` [intergalactic_panini] DSL2 - revision: 880a4a2dfd
executor > local (5)
[a0/bdf83f] process > sayHello (5) [100%] 5 of 5 ✔
Nextflow-putken ajaminen local-executorilla interaktiivisesti
Nextflown ajaminen interaktiivisessa istunnossa:
sinteractive -c 2 -m 4G -d 250 -A project_2xxxx # replace actual project number here
module load nextflow/23.04.3 # Load nextflow module
nextflow run workflow.nf
Note
Älä käynnistä raskaita Nextflow-työnkulkuja kirjautumissolmuilla.
Nextflown ajaminen local-executorilla eräajossa
Jos haluat käynnistää Nextflow-työn tavallisena eräajona siten, että kaikki työtehtävät suoritetaan saman työallokaation sisällä, luo eräajotiedosto:
#!/bin/bash
#SBATCH --time=00:15:00 # Change your runtime settings
#SBATCH --partition=test # Change partition as needed
#SBATCH --account=<project> # Add your project name here
#SBATCH --cpus-per-task=<value> # Change as needed
#SBATCH --mem-per-cpu=1G # Increase as needed
# Load Nextflow module
module load nextflow/23.04.3
# Actual Nextflow command here
nextflow run workflow.nf <options>
# nf-core pipeline example:
# nextflow run nf-core/scrnaseq -profile test,singularity -resume --outdir .
Lähetä lopuksi työ supertietokoneelle:
Nextflown ajaminen SLURM-executorilla
Jos työnkulku sisältää vain rajallisen määrän yksittäisiä töitä tai työvaiheita, Nextflown SLURM-executoria voidaan harkita.
Ensimmäinen eräajotiedosto varaa resurssit vain Nextflow’lle itselleen. Nextflow luo sitten lisää SLURM-töitä työnkulun prosesseille. Nextflown luomat SLURM-työt voidaan jakaa useille supertietokoneen solmuille, ja ne voivat myös käyttää eri osioita eri työnkulkusäännöille, esimerkiksi CPU:ta ja GPU:ta. SLURM-executoria tulisi käyttää vain, jos työvaiheet kestävät vähintään 20–30 minuuttia, muuten se voi kuormittaa SLURMia liikaa.
Warning
Älä käytä SLURM-executoria, jos työnkulku sisältää paljon lyhyitä prosesseja. Se kuormittaisi SLURMia liikaa. Käytä sen sijaan HyperQueue-executoria.
SLURM-executor otetaan käyttöön asettamalla process.xx-asetukset nextflow.config-tiedostossa. Asetukset ovat samankaltaisia kuin eräajotiedostoissa.
profiles {
standard {
process.executor = 'local'
}
puhti {
process.clusterOptions = '--account=project_xxxx --ntasks-per-node=1 --cpus-per-task=4 --ntasks=1 --time=00:00:05'
process.executor = 'slurm'
process.queue = 'small'
process.memory = '10GB'
}
}
Luo eräajotiedosto ja huomaa profiilin käyttö.
#!/bin/bash
#SBATCH --time=00:15:00 # Change your runtime settings
#SBATCH --partition=test # Change partition as needed
#SBATCH --account=<project> # Add your project name here
#SBATCH --cpus-per-task=1 # Change as needed
#SBATCH --mem-per-cpu=1G # Increase as needed
# Load Nextflow module
module load nextflow/23.04.3
# Actual Nextflow command here
nextflow run workflow.nf -profile puhti
Lähetä lopuksi työ supertietokoneelle:
Tämä lähettää työnkulun jokaisen prosessin erillisenä eräajona Puhti-supertietokoneelle.
Nextflown ajaminen HyperQueue-executorilla
HyperQueue-meta-ajastimen executori sopii tilanteisiin, joissa työnkulku sisältää paljon lyhyitä prosesseja ja laskentaan tarvitaan useita solmuja. Executorin asetukset voivat kuitenkin olla monimutkaisia putkesta riippuen.
Tässä on eräajoskripti nf-core-putken ajamiseen:
#!/bin/bash
#SBATCH --job-name=nextflowjob
#SBATCH --partition=small
#SBATCH --account=<project>
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=1
#SBATCH --cpus-per-task=40
#SBATCH --mem-per-cpu=2G
#SBATCH --time=01:00:00
# Load the required modules
module load hyperqueue
module load nextflow
# Create a per job directory
wrkdir=${PWD}/WRKDIR-${SLURM_JOB_ID}
# Set the directory which hyperqueue will use
export HQ_SERVER_DIR=${wrkdir}/.hq-server
mkdir -p ${HQ_SERVER_DIR}
# Start the server in the background (&) and wait until it has started
hq server start &
until hq job list &>/dev/null ; do sleep 1 ; done
# Start the workers in the background and wait for them to start
srun --overlap --cpu-bind=none --mpi=none hq worker start --cpus=${SLURM_CPUS_PER_TASK} &
hq worker wait "${SLURM_NTASKS}"
# change to the work directory if needed
cd ${wrkdir}
# Ensure Nextflow uses the right executor and knows how many jobs it can submit
# The `queueSize` can be limited as needed.
echo "executor {
queueSize = $(( 40*SLURM_NNODES ))
name = 'hq'
cpus = $(( 40*SLURM_NNODES ))
}" >> ${wrkdir}/nextflow.config
# run the Nextflow pipeline here
nextflow run main.nf <options>
# Wait for all jobs to finish, then shut down the workers and server
hq job wait all
hq worker stop all
hq server stop
Lähetä lopuksi työ supertietokoneelle:
Lisätietoja
- Virallinen Nextflow-dokumentaatio
- CSC:n Nextflow-dokumentaatio
- Antoni Gołośin diplomityö, jossa vertaillaan automatisoituja työnkulkuratkaisuja supertietokoneilla
- Antoni Gołośin täydellinen Nextflow-esimerkki koodista, jossa on 3 eri executoria Puhdille
- Yleiset ohjeet suuren läpimenon laskentaan CSC:n HPC-ympäristössä
- Virallinen HyperQueue-dokumentaatio
- CSC:n HyperQueue-dokumentaatio