OVO Schedulers¶
OVO uses Nextflow to define and execute pipelines where each type of task runs in a dedicated environment that isolates the software dependencies.
By default, Nextflow executes all tasks on the local machine, but it also supports a variety of execution platforms.
How the OVO Nextflow Scheduler works¶
Pipeline execution starts with submitting a workflow with user-specified parameters,
either through the OVO CLI or web UI. In case of Nextflow scheduler, a nextflow run subprocess
is executed in the background, automatically orchestrating grid job submission and monitoring,
enabling parallel execution of tasks and automatic retries. The process is executed from its
“execution directory” which is created under the OVO workdir (by default, ~/ovo/workdir/execdir/JOB_ID).
This directory contains the main Nextflow log file (.nextflow.log), and the process ID (.nextflow.pid)
that is used to track and manage the running workflow. Upon workflow completion, it will also store
an output/ directory with all final output files (linked from individual task working directories).
The nextflow process runs in the background for the whole duration of the workflow execution,
submitting and managing status of individual tasks (e.g. a RFdiffusion task that generates a batch of 100 backbones).
Each task will be executed in its own dedicated environment (e.g. Conda, Singularity, Docker, etc.)
and run from its own working directory created under the OVO workdir (by default, ~/ovo/workdir/work/PREFIX/TASK_ID).
The task working directory contains the task script (.command.sh), the run wrapper script (.command.run),
task-specific logs (.command.log), all input files (as symlinks) and output files.
When executing using a grid engine (e.g., SLURM, PBS Pro), each task will correspond to one grid job
and will have its own job ID. OVO itself does not directly track the status of the individual jobs.
When the workflow is submitted via web UI, job status is periodically checked and updated in the
OVO Database under a DesignJob or DescriptorJob object.
Upon workflow completion, the results need to be “processed”
by OVO logic specific to the given pipeline – copying relevant files from the workflow output directory
(by default ~/ovo/workdir/execdir/JOB_ID/output/, containing symlinks to individual task working directories)
to OVO Storage (by default, ~/ovo/storage/),
assigning unique Design IDs and creating Design and DescriptorValue entries in the database.
Configuring OVO for SLURM scheduler¶
This example uses SLURM with Singularity, see Containers for details on different containerization options.
To use SLURM executor, modify the OVO configuration file, typically located at ~/ovo/config.yml:
default_scheduler: slurm
local_scheduler: local # <-- used for preview jobs, should run locally if possible
schedulers:
slurm: # <- your new scheduler key, can be any name you choose, set as default_scheduler above
name: SLURM Singularity GPU # <-- user-friendly name
type: NextflowScheduler
workdir: ./workdir # <-- where to store temporary files, potentially in a tmp dir like /scratch/ovo/workdir
submission_args:
profile: singularity # <-- or apptainer, docker, conda, etc.
config: ./nextflow_slurm_singularity.config
local: # <--- default local scheduler, adjust based on your settings
name: Local with Singularity
type: NextflowScheduler
workdir: ./workdir # <-- where to store temporary files, potentially in a tmp dir like /scratch/ovo/workdir
submission_args:
profile: singularity,cpu_env
config: ./nextflow_local.config
And create the referenced nextflow_slurm_singularity.config nextflow config file:
// params {
// // override default params here if needed
// foo = bar
// }
process {
executor = "slurm"
queue = "cpu-med" // Adjust to your default partition
beforeScript = "module load singularity"
// add automatic retries to handle random job failures
errorStrategy = { task.attempt <= process.maxRetries ? 'retry' : 'terminate' }
maxRetries = 2
withLabel: "colabdesign|ligandmpnn|rfdiffusion" {
queue = "gpu-small" // Match your actual GPU partition
cpus = 4
memory = '15.GB'
clusterOptions = "--gres=gpu:1" // Only specify GPU, let cpus/memory be handled by Nextflow
}
withLabel: "boltz" {
queue = "gpu-med"
cpus = 4
memory = '15.GB'
clusterOptions = "--gres=gpu:1"
}
withLabel: "bindcraft" {
queue = "gpu-med"
cpus = 8
memory = '30.GB'
clusterOptions = "--gres=gpu:1"
}
}
Test that your scheduler configuration is working by submitting a test job:
ovo init rfdiffusion --scheduler slurm
Please refer to the Nextflow documentation for more details on SLURM configuration options.
Configuring OVO for PBS Pro scheduler¶
This example uses PBS Pro with Singularity, see Containers for details on different containerization options.
To use PBS executor, modify the OVO configuration file, typically located at ~/ovo/config.yml:
default_scheduler: pbs
local_scheduler: local # <-- used for preview jobs, should run locally if possible
schedulers:
pbs: # <- your new scheduler key, can be any name you choose, set as default_scheduler above
name: PBS Singularity GPU # <-- user-friendly name
type: NextflowScheduler
workdir: ./workdir # <-- where to store temporary files, potentially in a tmp dir like /scratch/ovo/workdir
submission_args:
profile: singularity # <-- or apptainer, docker, conda, etc.
config: ./nextflow_pbs_singularity.config
local: # <--- default local scheduler, adjust based on your settings
name: Local with Singularity
type: NextflowScheduler
workdir: ./workdir # <-- where to store temporary files, potentially in a tmp dir like /scratch/ovo/workdir
submission_args:
profile: singularity,cpu_env
config: ./nextflow_local.config
And create the referenced nextflow_pbs_singularity.config nextflow config file:
// params {
// // override default params here if needed
// foo = bar
// }
process {
// executor type
executor = "pbspro"
// default queue
queue = "general_cloud" // Adjust to your default queue
// add automatic retries to handle random job failures
errorStrategy = { task.attempt <= process.maxRetries ? 'retry' : 'terminate' }
maxRetries = 2
// commands to run at the start of each job
beforeScript = "module add singularity"
withLabel: "colabdesign|rfdiffusion" {
queue = "gpu_moldyn" // Match your actual GPU queue
cpus = 4
memory = '15.GB'
}
withLabel: "boltz" {
queue = "gpu_a10g" // Match your actual GPU queue
cpus = 4
memory = '15.GB'
}
withLabel: "bindcraft" {
queue = "gpu_a10g" // Match your actual GPU queue
cpus = 8
memory = '30.GB'
}
}
Test that your scheduler configuration is working by submitting a test job:
ovo init rfdiffusion --scheduler pbs
An example PBS Pro configuration directory can be found in the example repository: hpc_pbs_config_example.
Please refer to the Nextflow documentation for more details on PBS Pro configuration options.
AWS HealthOmics¶
To use AWS HealthOmics, modify the OVO configuration file, typically located at ~/ovo/config.yml:
default_scheduler: healthomics
local_scheduler: local # <-- used for preview jobs, should run locally if possible
schedulers:
healthomics: # <- your new scheduler key, can be any name you choose, set as default_scheduler above
name: HealthOmics # <-- user-friendly name
type: HealthOmicsScheduler
submission_args:
workflow_name_prefix: dev_ # <-- Prefix as configured during deployment
role_arn: arn:aws:iam::YOUR_ACCOUNT_ID:role/YOUR-EXECUTION-ROLE
workdir: s3://workdir-bucket-name/prefix # <-- S3 location for HealthOmics job output
local: # <--- default local scheduler, adjust as needed
name: Local with Conda
type: NextflowScheduler
submission_args:
profile: conda,cpu_env
config: ./nextflow_local.config
Pipelines will need to be deployed to AWS HealthOmics. An example AWS HealthOmics repository with GitHub actions for deployment can be found in aws_healthomics_example.
Other Nextflow executors¶
See Nextflow Executor documentation for other available Nextflow execution options.