-
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 siis suorittaa eri ympäristöissä vaihtamalla 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, jolla 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 itsessään on saatavilla moduulina Puhdissa, Mahdissa ja LUMIssa. Saatavilla olevat tarkat versiot on kuvattu Nextflown pääsivulla.
Nextflow’ssa 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 lennossa
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 lennossa konttirekistereistä. Etäkonttikuvat määritetään yleensä Nextflow-skriptissä tai asetustiedostossa yksinkertaisesti 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 lennossa. 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 lennossa, käytä laskentasolmun NVMe-levyä Apptainer-kuvien tallentamiseen. Tätä varten pyydä ensin eräajotiedostossa NVMe-levytilaa 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 monien pienten töiden tapauksessa. 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äajovarauksen sisällä, mutta on asetuksiltaan monimutkaisin. 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 Puhdin esimerkkiajoskripteistä.
Note
Jos et ole varma, miten työnkulku kannattaa ajaa tehokkaasti, älä epäröi ottaa yhteyttä CSC:n asiakastukeen.
Nextflow-skripti
Seuraava minimalistinen 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ääteulostulo näyttäisi samankaltaiselta kuin alla oleva teksti:
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 niin, että kaikki työtehtävät suoritetaan saman ajovarauksen 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 .
Lopuksi lähetä 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:lle ja GPU:lle. 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-executorin käyttöönottoa varten määritä 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
Lopuksi lähetä työ supertietokoneelle:
Tämä lähettää työnkulkusi jokaisen prosessin erillisenä eräajona Puhti-supertietokoneelle.
Nextflown ajaminen HyperQueue-executorilla
HyperQueue-meta-ajastimen executor 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
Lopuksi lähetä 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-koodiesimerkki, 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