🧪 NextFlow#
NextFlow es un framework de flujo de trabajo que permite el desarrollo de pipelines de análisis de datos científicos y bioinformáticos. Está diseñado para ser escalable y reproducible, permitiendo la ejecución de flujos de trabajo en diferentes entornos computacionales, desde laptops hasta clusters de alto rendimiento.
Nota
Para más información revise la documentación oficial.
Instalación#
NextFlow puede compilarse e instalarse a través de Spack.
A continuación se detallan los pasos:
Use Spack para compilar e instalar el programa NextFlow
# Instalar NextFlow spack install nextflow
Si la compilación fue exitosa, va a poder hacer lo siguiente:
# Actualizar módulos de Spack spack module tcl refresh -y module use ~/spack/share/spack/modules/linux-rocky8-zen2/
Dentro del listado de módulos disponibles podrá encontrar la versión de NextFlow instalada.
# Verificar módulos disponibles module avail
Ejemplo Básico#
Para ejecutar el «hello world» de NextFlow primero tiene que cargar el módulo:
# Cargar la versión instalada recientemente module load nextflow/23.10.0-gcc-12.3.0-u6v2oc2
Luego puede trabajar dentro de un directorio para la prueba del «hello world»:
# Crear y entrar al directorio del proyecto mkdir -p ~/workspace/nextflow-hello-world cd ~/workspace/nextflow-hello-world # Ejecutar el ejemplo hello world nextflow run hello
Script de SLURM#
A continuación se muestra un script de ejemplo para ejecutar un pipeline de NextFlow en el cluster.
Escriba el script submit_nf.sh
#!/bin/bash
#SBATCH --job-name=test_nf
#SBATCH --partition=short
#SBATCH --ntasks-per-node=1
#SBATCH --cpus-per-task=64
#SBATCH --nodes=1
#SBATCH --time 05:00
source /etc/profile
# Cargar módulos necesarios
module use ~/spack/share/spack/modules/linux-rocky8-zen2/
module load nextflow/23.10.0-gcc-12.3.0-u6v2oc2
# Configurar variables de entorno para NextFlow
export NXF_BASE_DIR="/scratch/$USER/nextflow-hello-world"
export NXF_WORK="$NXF_BASE_DIR/nxf_work"
export NXF_TEMP="$NXF_BASE_DIR/nxf_temp"
export NXF_LAUNCHER="$NXF_BASE_DIR/nxf_launcher"
# Crear directorios temporales
mkdir -p $NXF_BASE_DIR $NXF_WORK $NXF_TEMP $NXF_LAUNCHER
# Ejecutar el pipeline
cd $NXF_BASE_DIR
nextflow run hello -ansi-log false
Nota
Ajuste los parámetros de SLURM (nodos, CPUs, tiempo) según las necesidades específicas de su pipeline.
Ya puede encolar el job:
sbatch submit_nf.sh
Ejemplo de salida
N E X T F L O W ~ version 23.10.0
Launching `https://github.com/nextflow-io/hello` [golden_moriondo] DSL2 - revision: 2be824e69a [master]
[a0/b4fbcf] Submitted process > sayHello (2)
[9b/923a62] Submitted process > sayHello (3)
[76/dc9944] Submitted process > sayHello (4)
[de/9d6753] Submitted process > sayHello (1)
Bonjour world!
Ciao world!
Hello world!
Hola world!
Ver también
Contenedores#
NextFlow permite que cada proceso pueda ejecutarse dentro de un container, ya sea de Docker o de Apptainer (anteriormente conocido como Singularity).
Puede verificar que Apptainer está cargado y funcionando a través del commando:
apptainer --help
Script de SLURM con Apptainer#
Importante
Dado que solo los nodos cabecera (head) cuentan con acceso a internet, es necesario descargar las imágenes de Apptainer previo a la ejecución del workflow dentro de un directorio en nuestro Home.
Este directorio será informado a NextFlow mediante la variable de entorno
NXF_APPTAINER_CACHEDIR.
Descarga de las imágenes de Apptainer#
Apptainer almacenará las imágenes por defecto en
/scratch/$USER/.apptainer/cache. La ubicación de la caché puede modificarse configurando la variable de entornoAPPTAINER_CACHEDIR.
Para cambiar el directorio a Home:
export APPTAINER_CACHEDIR=$HOME/.apptainer/cache
export NXF_APPTAINER_CACHEDIR=$APPTAINER_CACHEDIR
mkdir -p $APPTAINER_CACHEDIR
Además,es necesario crear un directorio con las imágenes en formato SIF:
export APPTAINER_SIFDIR_FOR_NXF=$HOME/workspace/apptainer/images
mkdir -p
Luego descargue las imágenes que serán utilizadas por el workflow, en este caso de ejemplo, ejecutamos:
cd $APPTAINER_SIFDIR_FOR_NXF
apptainer pull docker://quay.io/nextflow/bash
Nota
Puede encontrar todas las imágenes utilizadas dentro del archivo nextflow.config de su workflow NextFlow.
Verificamos que la imagen esté guardada:
apptainer cache list
En caso de necesitar limpiar el cache:
apptainer cache clean
Encolado del job#
Escriba el script submit_nf_apptainer.sh
#!/bin/bash
#SBATCH --job-name=test_nf_apt
#SBATCH --partition=short
#SBATCH --ntasks-per-node=60
#SBATCH --cpus-per-task=1
#SBATCH --nodes=1
#SBATCH --time 05:00
source /etc/profile
# Cargar módulos necesarios
module use ~/spack/share/spack/modules/linux-rocky8-zen2/
module load nextflow/23.10.0-gcc-12.3.0-u6v2oc2
# Configurar variables de entorno para NextFlow
export NXF_BASE_DIR=/scratch/$USER/nextflow-hello-world
export NXF_WORK=$NXF_BASE_DIR/nxf_work
export NXF_TEMP=$NXF_BASE_DIR/nxf_temp
export NXF_LAUNCHER=$NXF_BASE_DIR/nxf_launcher
export APPTAINER_SIFDIR_FOR_NXF=$HOME/workspace/apptainer/images
# Configurar el directorio cache para las imagenes de Apptainer
export APPTAINER_CACHEDIR=$HOME/.apptainer/cache
export NXF_APPTAINER_CACHEDIR=$APPTAINER_CACHEDIR
# Crear directorios temporales
mkdir -p $NXF_BASE_DIR $NXF_WORK $NXF_TEMP $NXF_LAUNCHER $NXF_APPTAINER_CACHEDIR
# Ejecutar el pipeline
cd $NXF_BASE_DIR
nextflow run hello -ansi-log false -with-apptainer $APPTAINER_SIFDIR_FOR_NXF/bash_latest.sif
Ya puede encolar el job:
sbatch submit_nf_apptainer.sh
Ejemplo de salida
Nextflow 25.04.4 is available - Please consider updating your version to it
N E X T F L O W ~ version 23.10.0
Launching `https://github.com/nextflow-io/hello` [berserk_magritte] DSL2 - revision: 2be824e69a [master]
[9b/35ec78] Submitted process > sayHello (4)
[01/9630d3] Submitted process > sayHello (2)
[b6/0e877c] Submitted process > sayHello (1)
[98/eaed8b] Submitted process > sayHello (3)
Hola world!
Ciao world!
Hello world!
Bonjour world!
Múltiples imágenes#
En caso de contar con procesos dentro del workflow que utilizan diferentes imágenes de Apptainer, es necesario especificarlas dentro del archivo de configuración nextflow.config, como el siguiente ejemplo:
process {
withName:foo {
container = '$APPTAINER_SIFDIR_FOR_NXF/image_name_1'
}
withName:bar {
container = '$APPTAINER_SIFDIR_FOR_NXF/image_name_2'
}
}
apptainer {
enabled = true
}
Más información disponible aquí