nf-core/configs: purdue_gautschi
Purdue RCAC Gautschi cluster profile (CPU + NVIDIA GPU nf-core pipelines).
nf-core/configs: Purdue RCAC Gautschi
The purdue_gautschi profile configures nf-core pipelines to run on the Gautschi cluster operated by the Rosen Center for Advanced Computing (RCAC) at Purdue University.
Gautschi is an AMD EPYC 9654 (Genoa) cluster with 192 cores and 384 GB RAM per standard CPU node, 1.5 TB highmem nodes, plus NVIDIA L40 and H100 GPU partitions. See the RCAC Gautschi user guide for hardware and policy details.
Prerequisites
module purge
module load nextflowThe nextflow module pulls in a compatible JDK (openjdk/17.0.2_8 is available on Gautschi). Apptainer is system-wide; /usr/bin/singularity is a symlink to apptainer.
Required parameter: --cluster_account
slist
nextflow run nf-core/<pipeline> \
-profile purdue_gautschi \
--cluster_account <your_account> \
--input samplesheet.csv \
--outdir resultsThe profile will refuse to submit jobs if --cluster_account is unset.
Partition routing
CPU and high-memory jobs are routed dynamically based on the task’s memory request:
| Memory request | Partition | Walltime cap | Notes |
|---|---|---|---|
<= 384 GB | cpu | 14 d | Default for most pipeline steps |
> 384 GB | highmem | 24 h | Slurm requires >= 49 cores per job on this partition |
If a pipeline step requests more than 384 GB RAM but fewer than 49 cores, Slurm will reject the submission. Raise the step’s CPU request in a pipeline-level config, or lower its memory request if the real need is below 384 GB.
GPU-labelled steps (process_gpu) route to the smallgpu partition by default. The profiling partition is intended for hardware performance work and is not exposed by this profile.
GPU jobs
By default, process_gpu routes to the smallgpu partition (2x NVIDIA L40 per node, 24 h walltime). To use the ai partition (8x NVIDIA H100 per node, 14 d walltime), pass:
nextflow run ... -profile purdue_gautschi --gpu_partition ai ...The profile derives --gres=gpu:N from each task’s accelerator.request directive, so multi-GPU workflows (e.g. parabricks) work without further configuration. Pipelines that don’t set accelerator get 1 GPU by default. ai nodes are scarce; use smallgpu unless your workflow specifically needs H100 throughput, NVLink, or > 48 GB GPU memory.
Standby queue (optional)
Gautschi offers a 4 h standby QoS for short CPU jobs:
nextflow run ... -profile purdue_gautschi --use_standby true ...Jobs are routed through standby only when they fit within the QoS limits (<= 4 h walltime, <= 384 GB memory). Longer, larger, or GPU steps automatically fall back to the normal QoS.
Reference data
A shared iGenomes mirror is mounted at /depot/itap/datasets/igenomes and the profile sets params.igenomes_base accordingly. Use the standard nf-core --genome keys (e.g. --genome GRCh38) in supported pipelines.
To use your own reference instead, pass the relevant pipeline parameters explicitly (--fasta, --gtf, etc.).
Container cache and work directory
export NXF_SINGULARITY_CACHEDIR=$RCAC_SCRATCH/.apptainer/cache
nextflow run ... -w $RCAC_SCRATCH/nextflow-work ...Contact
- Arun Seetharam, @aseetharam, aseethar@purdue.edu
- RCAC support
Config file
// nf-core/configs: Purdue RCAC Gautschi cluster profile
// Gautschi: AMD EPYC 9654 (Genoa), 192 cores / 384 GB per cpu node; 1.5 TB highmem nodes;
// NVIDIA L40 (smallgpu) and H100 (ai) GPU partitions
// https://www.rcac.purdue.edu/knowledge/gautschi
params {
config_profile_description = 'Purdue RCAC Gautschi cluster profile (CPU + NVIDIA GPU nf-core pipelines).'
config_profile_contact = 'Arun Seetharam (@aseetharam)'
config_profile_url = 'https://www.rcac.purdue.edu/knowledge/gautschi'
// Shared iGenomes mirror (identical path on Bell, Negishi, Gautschi)
igenomes_base = '/depot/itap/datasets/igenomes'
// REQUIRED. Run `slist` on Gautschi to list your accounts.
cluster_account = null
// Opt-in: route CPU jobs that fit within standby limits (<= 4 h, <= 384 GB)
// through the 4 h standby QoS. Long, high-memory, and GPU jobs stay on normal QoS.
use_standby = false
// GPU partition for process_gpu label: 'smallgpu' (2x L40) or 'ai' (8x H100)
gpu_partition = 'smallgpu'
}
// Tell nf-core schema validation to ignore our custom params
validation {
ignoreParams = ['cluster_account', 'use_standby', 'gpu_partition']
}
process {
executor = 'slurm'
// Global ceiling: largest available node (highmem: 1.5 TB, 192 cores, 14 d).
// Covers all partitions; per-task routing below picks the right one.
resourceLimits = [
cpus : 192,
memory: 1500.GB,
time : 336.h
]
// Dynamic partition routing:
// highmem (1.5 TB, 24 h, >= 49 cores required by Slurm policy) when task.memory > 384 GB
// cpu (384 GB, 14 d) otherwise
queue = { task.memory > 384.GB ? 'highmem' : 'cpu' }
clusterOptions = {
if (!params.cluster_account) {
System.err.println("ERROR: purdue_gautschi profile requires --cluster_account=<slurm_account>.")
System.err.println(" Run 'slist' on a Gautschi login node to list your accounts.")
System.exit(1)
}
// standby QoS has a 4 h walltime cap and does not apply to highmem or GPU partitions.
def standby = params.use_standby && task.memory <= 384.GB && task.time <= 4.h
"--account=${params.cluster_account}" + (standby ? ' --qos=standby' : '')
}
// GPU jobs. Default to smallgpu (L40); override with --gpu_partition=ai for H100.
// GPU count is derived from the task's `accelerator.request` so multi-GPU
// workflows (e.g. parabricks) work without profile changes.
withLabel: process_gpu {
queue = {
if (!(params.gpu_partition in ['smallgpu', 'ai'])) {
System.err.println("ERROR: purdue_gautschi params.gpu_partition must be 'smallgpu' or 'ai' (got '${params.gpu_partition}').")
System.exit(1)
}
params.gpu_partition
}
clusterOptions = {
if (!params.cluster_account) {
System.err.println("ERROR: purdue_gautschi profile requires --cluster_account=<slurm_account>.")
System.err.println(" Run 'slist' on a Gautschi login node to list your accounts.")
System.exit(1)
}
def gpus = task.accelerator?.request ?: 1
"--account=${params.cluster_account} --gres=gpu:${gpus}"
}
}
}
executor {
queueSize = 50
pollInterval = '30 sec'
queueStatInterval = '5 min'
submitRateLimit = '10 sec'
}
apptainer {
enabled = true
autoMounts = true
cacheDir = "${System.getenv('RCAC_SCRATCH') ?: System.getenv('SCRATCH') ?: System.getProperty('user.home')}/.apptainer/cache"
}