slurm-workflows: HPC workflow helpers for Slurm clusters
slurm-workflows lets you run Python functions on a Slurm cluster
without sbatch scripts written by hand.
It provides an interface inspired by
concurrent.futures.
The interface launches long-lived workers inside pilot jobs.
It then dispatches tasks to those workers.
You pay Slurm's scheduling latency once per pilot job, not once per task.
Use it in three cases:
- You have many Python tasks to run on one cluster allocation.
- An exploration or a search has to spread across a pool of workers.
- Per-worker state is expensive, and you want it to stay warm between tasks.
Installation
A run needs:
- Python >= 3.12
- Access to a Slurm cluster (
sbatch,squeue,scancelonPATH) - The
ds-servicebinary onPATH
pip install -U slurm-workflows
To set up on UVA's Rivanna cluster, read How to install slurm-workflows on Rivanna.
Usage
Replace the Slurm account (-A), the partition (-p)
and the setup script with the ones for your cluster.
The driver must run on a node with the ib0 interface.
For another interface, read
How to run the ds-service server.
from ds_service_client import DsServiceServer
from slurm_workflows import SlurmPilotExecutor
def square(x):
return x * x
SETUP_SCRIPT = """
module load gcc/14.2.0
conda activate my-env
"""
with DsServiceServer(interface="ib0") as ds_service:
ds_service.wait_until_ready()
with SlurmPilotExecutor("my-run", ds_service.address) as executor:
# 1. Describe a job group. This submits nothing.
executor.define_job_group(
name="cpu",
sbatch_args=["-A my_alloc", "-p standard", "-t 01:00:00"],
setup_script=SETUP_SCRIPT,
)
# 2. Launch 4 pilot jobs of that job group.
executor.scale_jobs("cpu", 4)
# 3. Submit tasks to a named queue. That job group's workers claim them.
tasks = [executor.submit("cpu", square, i) for i in range(100)]
# 4. Block until every result is in.
executor.wait(tasks, desc="squaring")
# The executor canceled every pilot job at the end of the block.
print(sum(task.output for task in tasks))
work directory: '/home/<user>/.cache/slurm-workflows/my-run/<timestamp>'
328350
You can submit tasks before the workers exist. They wait on the queue until a worker starts and claims them.
Documentation
| Document | What it covers |
|---|---|
| Computing pi on a Slurm cluster | The main features of slurm-workflows, by creating a pool of workers to compute $\pi$. |
| Computing pi with a Sobol' QMC exploration | Using ExploreSpaceSobolQMC to create a space filling design and evaluate it. |
| Optimizing Himmelblau's function | Using OptimizeSpaceBotorch to run a batch Bayesian search. |
| How to install slurm-workflows on Rivanna | Installing the package and the ds-service binary on Rivanna. |
How to run the ds-service server |
Starting a ds-service server from the driver and binding it where workers can reach it. |
| How to keep per-worker state with actors | Loading an expensive model or connection once per worker instead of once per task. |
| How to fold results across workers | Using mapreduce to run one function over a whole collection and bring back a single value. |
How to watch a run with swtop |
Following a live run from another shell, and keeping a record of one. |
| How to troubleshoot a failing run | Finding the right log, and what each RuntimeError means. |
| How to resume a search | Carrying a search on across a Slurm time limit. |
SlurmPilotExecutor |
The executor, Task, RaiseOnError, and the job group options. |
mapreduce |
Mapping an iterable across the pool, the fold contract, and what the call creates on the server. |
| What a run publishes | The environment a task sees, the keys and series a run writes, the worker entry point, and the logs. |
ExploreSpaceSobolQMC |
The Sobol' exploration, its study fields, and the results file. |
OptimizeSpaceBotorch |
The batch Bayesian search, its study fields, and its stopping rule. |
| Search spaces | IntRange, FloatRange and CategoricalRange, the objective contract, and what a failed evaluation does to a run. |
swtop |
The CLI, the blocks on screen, and what the host and job readings measure. |
| The pilot-job model | Why pilot jobs, the three processes, where the driver runs, and which class to reach for. |
| Batch Bayesian optimization | Why a search has rounds, where the fit runs, and when it is worth the overhead. |
| The trail a run leaves | Why a run is observable from outside itself, and the limits of that. |
For contributors
| Document | What it covers |
|---|---|
| Developer notes | The layout of the code, where each kind of documentation goes, and the conventions a change is held to. |
| Terminology | The word this project uses for each concept, in prose and in identifiers, and where each word comes from. |
| How to run the tests | Running the suite, what it mocks, and what it runs for real. |
License
MIT. See LICENSE.
Release files for slurm-workflows 4.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| slurm_workflows-4.0.0.tar.gz | 49.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| slurm_workflows-4.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 106.2 kB
Release files / slurm_workflows-4.0.0.tar.gz
| Download URL | slurm_workflows-4.0.0.tar.gz |
|---|---|
| Size | 49.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
6d144c52a372626289dd8ba2e42725de3bc05608b747a10268e94dcf8672bcc3
|
|
BLAKE2b-256 checksum How to use checksums |
ce9b4ef663cc5758685ee706239a8a4df383f0e47be7b5eea3a681e029bd52a3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.15
|
Release files / slurm_workflows-4.0.0-py3-none-any.whl
| Download URL | slurm_workflows-4.0.0-py3-none-any.whl |
|---|---|
| Size | 56.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
b61755500d0b7572ff3c6869cf4f0facb1f30c9a570147f694e9cfc20a9da7e8
|
|
BLAKE2b-256 checksum How to use checksums |
fc41f7203b84ffd1d34d8221f1ecc662cd5d5ea91071160cf0b1cf5694a50f72
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.15
|