All posts

July 22, 2026 · Temple Compute

+25 production workflows for heterogeneous compute

Every computational chemistry group we talk to has the same file sitting somewhere in their repo. It is a shell script, four hundred lines long, and it exists to move data between machines. Copy the topology to the GPU box. Run mdrun. Copy the trajectory back. Hope nothing timed out.

The science in that script is maybe thirty lines. The rest is plumbing.

Today we are open-sourcing pantheon, a library of 27 production workflows for horus-runtime. Every one of them is a real multi-stage pipeline, and every stage picks its own compute target. You can browse the whole library here.

The actual problem is that a pipeline is not one workload

Take a virtual screen. It has three stages, and they want completely different hardware.

Preparing the ligands is a CPU job that finishes in seconds. Predicting binding structure and affinity needs a GPU with a lot of memory, and it is the only stage that costs real money. Ranking the results is a CPU job that finishes in seconds again.

Most tools make you pick one machine for all three. So you rent a GPU node and then let it idle through the cheap stages, or you split the pipeline by hand and write the plumbing yourself. Neither is good. The first wastes money and the second wastes your afternoon.

The awkward part is that the right answer changes constantly. It changes when you move from your laptop to the cluster, when a reviewer asks for ten times the sampling, when the GPU queue is full, and when you switch from x86 to Apple Silicon and half your conda packages stop resolving.

What per-stage routing looks like

In Horus, the compute target is a field on the stage, not a property of the workflow. Here is Boltz-2 virtual screening:

prep (local, CPU)          target.fasta + ligands.smi ──► boltz_inputs.tar.gz
   │   LocalToSSH transfer (automatic)
predict (SSH GPU box)      boltz predict (container)   ──► predictions.tar.gz
   │   SSHToLocal transfer (automatic)
rank (local, CPU)          parse affinity + confidence ──► top_hits.csv

The expensive GPU runs exactly one stage. Horus moves the data across each boundary on its own; there is no scp anywhere in the workflow. Moving that GPU stage to a different machine, into a container, or onto an HPC scheduler is a one-field change, and the command definition does not move at all.

That last part matters more than it sounds. It means the workflow you debug on a laptop with a tiny ligand set is byte-for-byte the workflow you run against the full library on a cluster.

The library

All workflows are MIT-licensed and runnable today with uv run horus run workflow.yaml.

Drug discovery

Molecular dynamics, built on the BioExcel building blocks

Engine capabilities, small workflows that each demonstrate one runtime feature

A note on ARM64

Several of these were genuinely annoying to get running on Apple Silicon, because biobb_amber, biobb_cmip, biobb_flexserv, and friends have no native arm64 conda build. The fix is the same mechanism as everything else: those stages declare a Docker executor while the neighbouring Python stages stay in a native conda environment, and the workflow does not otherwise change. The per-workflow pages say which stages need this.

Where this is going

pantheon is the open-source half. The other half is Temple Compute OS, which runs these workflows on managed compute so you do not have to own the GPU box or maintain the cluster in the first place. It is in early access and you can ask for beta access.

If you run one of these and it breaks, open an issue. If you have a pipeline that should be in the library, open a PR.