-
Nextflow
Nextflow
Nextflow on tieteellinen työnkulunhallintajärjestelmä skaalautuvien, siirrettävien ja toistettavien työnkulkujen luomiseen. Se on Groovyyn perustuva kieli, jolla koko työnkulku voidaan ilmaista yhdessä skriptissä, ja se tukee myös muiden kielten, kuten R:n, bashin ja Pythonin, skriptien suorittamista (Snakemake-säännön script/run/shell-direktiivin kautta).
Nextflow tarjoaa sisäänrakennetun tuen
HPC-ympäristöihin sopiville konteille, kuten Apptainerille (= Singularity). Yksi Nextflow’n eduista on, että varsinainen putken toiminnallinen logiikka on erotettu suoritusympäristöstä. Sama skripti voidaan siksi 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 suoritetaan siinä tietokoneessa, jossa Nextflow käynnistetään. Useita muita executoreita tuetaan, ja CSC:n laskentaympäristöihin sopivat parhaiten SLURM- ja HyperQueue-executorit.
Jos pohdit edelleen työnkulkuja yleisemmällä tasolla tai sitä, mitä työnkulkuvälinettä kannattaa käyttää, katso myös suurteholaskennan ja työnkulkujen sivumme.
Saatavilla
CSC:n palvelimilla saatavilla olevat versiot
- Roihu-CPU: 25.10.4.11173
- Roihu-GPU: ei saatavilla
- Puhti: 21.10.6, 22.04.5, 22.10.1, 23.04.3, 24.01.0-edge.5903, 24.10.0
- Mahti: 22.05.0-edge, 24.04.4
- LUMI: 22.10.4
Kiinnitä huomiota Nextflow-version käyttöön
Huomaa, että Nextflow-versiota 23.04.3 ja sitä uudempia voidaan käyttää vain DSL2:lla rakennettuihin putkiin. Voit vaihtaa alempaan versioon DSL1-yhteensopivia putkia varten.
Lisenssi
Nextflow on julkaistu Apache 2.0 -lisenssillä.
Asennus
Nextflow
Nextflow LUMIssa
Jotta voit käyttää CSC:n moduuleja LUMIssa, muista ensin ottaa CSC:n moduulipuu käyttöön komennolla
Nextflow itse on saatavilla moduulina Puhdissa, Mahdissa ja LUMIssa. Saatavilla olevat tarkat versiot on lueteltu yllä.
Nextflow otetaan käyttöön lataamalla nextflow-moduuli:
Oletusversio on yleensä uusin. Valitse Nextflow-versio oman putkesi vaatimusten mukaan. Toistettavuuden näkökulmasta on suositeltavaa ladata Nextflow-moduuli versionumeron kanssa. Jos haluat ladata nextflow-moduulin tietyllä versiolla:
Käyttöohjeen saat komennolla:
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 kontteja luodaan.
Apptainer-asennukset lennossa
Kontit voidaan integroida sujuvasti Nextflow-putkiin. Nextflow-skripteihin ei tarvita muita
muutoksia kuin Apptainer-moottorin käyttöönotto Nextflow’n asetustiedostossa
. Nextflow voi noutaa etäkonttikuvia Apptainer-muodossa
konttirekistereistä lennossa. Etäkonttikuvat
määritellää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 skriptin
prosessimäärittelylle.
Useimmat Nextflow-putket noutavat tarvittavat konttikuvat lennossa. Kuitenkin, kun putkessa 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ä se vaadi erillisen moduulin lataamista 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äajotiedostossasi 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 voida sellaisenaan käyttää supertietokoneilla, koska tavallisilla käyttäjillä ei ole ylläpito-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 local-executorilla. Hyödyllinen pienille ja keskisuurille työnkuluille.
- Eräajona 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 vuoksi. Tätä voidaan käyttää, jos jokainen työvaihe jokaiselle tiedostolle kestää vähintään 30 minuuttia.
- Eräajona 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 (suurteholaskenta).
Yleisen johdannon eräajoihin löydät Puhdin esimerkkieräajoskripteistä.
Note
Jos et ole varma, miten työnkulkusi 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ääteulostulo 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
Nextflow’n 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
Huomio
Älä käynnistä raskaita Nextflow-työnkulkuja kirjautumissolmuilla.
Nextflow’n ajaminen local-executorilla eräajossa
Jos haluat käynnistää Nextflow-työn tavallisena eräajona, joka suorittaa kaikki työtehtävät samassa ajovarauksessa, 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:
Nextflow’n ajaminen SLURM-executorilla
Jos työnkulku sisältää vain rajallisen määrän yksittäisiä töitä tai työvaiheita, Nextflow’n SLURM-executoria voidaan harkita.
Ensimmäinen eräajotiedosto varaa resurssit vain Nextflow’lle itselleen. Tämän jälkeen Nextflow luo lisää SLURM-töitä työnkulun prosesseille. Nextflow’n luomat SLURM-työt voidaan jakaa supertietokoneen useille 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önkulkusi 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
Lopuksi lähetä työ supertietokoneelle:
Tämä lähettää työnkulkusi jokaisen prosessin erillisenä eräajotyönä Puhdin supertietokoneelle.
Nextflow’n 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
Lopuksi lähetä työ supertietokoneelle:
Viitteet
Jos käytät Nextflow’ta työssäsi, viittaa seuraavasti:
Di Tommaso, P., Chatzou, M., Floden, E. et al. Nextflow enables reproducible computational workflows. Nat. Biotechnol. 35, 316–319 (2017). https://doi.org/10.1038/nbt.3820