2026-10-03 – MolSSI10: from SLURM to OpenPBS#
Status: design note for Paul and the design session; nothing on MolSSI10 has
been changed. Phase 7 of the parallel-execution campaign (seamm_exec
docs/developer_guide/campaigns/2026-10-02/) includes “PBS validated on a
real PBS site”. seamm_scheduler’s PBS back end has only been tested against
mocked qsub/qstat output. The plan is to make MolSSI10 that site by
replacing its SLURM with a permanent single-node OpenPBS. SLURM stays covered by
ChemAI (local) and TinkerCliffs (ssh).
MolSSI10 today (checked read-only, 2026-10-03)#
Debian 11.11, kernel 5.10, 6 cores, 125 GB, 689 GB free on
/. Passwordless sudo forpsaxe.SLURM 20.11.4 (Debian
slurm-wlm,slurmctld,slurmd,slurmdbd) with munge. One node and one partition,batch;select/cons_treswithCR_Core_Memory. Accounting goes throughslurmdbdinto MariaDB 10.5, whose only database besides the system ones isslurm_acct_db.PostgreSQL 13 runs a
pubchemqccluster on port 5437 (/mnt/ssd1). It is unrelated to SEAMM and must not be touched.SEAMM runs as
psaxe:seamm-jobserverandseamm-webuifrom~/SEAMM(venv→/mnt/hdd2/psaxe/SEAMM/venv).~/SEAMM/molssi10.inihas two queues:[molssi10](this host’s SLURM,transport = local) and[tinkercliffs](ssh). The default queue is ``molssi10``. So every production job submitted without a queue is an sbatch on this host’s SLURM: 37 jobs since 2026-09-19.~/SEAMM_DEV/PaulVT.local.inion the Mac also has a[molssi10]queue (ssh to this host’s SLURM). Itsremote_run_from_jobserverstill points to the old conda env/home/psaxe/miniconda3/envs/seamm.
What shapes the plan#
The JobServer cannot run a flowchart as a PBS job. A target section’s
typeisslurm(the whole flowchart is one batch job) orlocal(a subprocess). PBS is accepted only for a flowchart’s tasks (tasks = queue,scheduler = pbs). The comment inseamm_scheduler/config.pysays so: a PBS evaluator needs a new type and a JobServer change. Because MolSSI10’s default queue is its local SLURM, removing SLURM without that change breaks production submissions that don’t name a queue. See decision A.OpenPBS has no Debian packages, and its last release is v23.06.06 (June 2023). We would build it from source: autotools, with hwloc (2.4.1 is installed), libical, libedit, Tcl/Tk, swig, expat, OpenSSL and the PostgreSQL development files. Its data service runs its own PostgreSQL instance (by default on port 15007, data under
PBS_HOME/datastore) using the system’s PostgreSQL server binaries, so it sits beside thepubchemqccluster without touching it. If the build turns out to need much patching on Debian 11, the fallback is a container (decision C).Gaps in the PBS back end that only a real site can settle:
A PBS job starts in
$HOME, not the submit directory as with SLURM. The batch script mustcd "$PBS_O_WORKDIR"or-d/-wthe directory.build_scriptadds nothing today.qstat -xneeds the server attributejob_history_enable = True(and ajob_history_duration), or finished jobs vanish and adoption after a restart cannot tell completed from lost.The environment:
qsubwithout-Vpasses onlyPBS_O_*. That is the behaviour we want (SLURM’sexport=NONElesson: ORCA’s clobberedLD_LIBRARY_PATH), but the payload must then set up its own environment, as the bundle worker already does for SLURM.The real
qstat -f -F jsonandqsuboutput (ids like12.molssi10), theExit_statusof aqdel-ed or killed job, andqselect, to replace the mocks with recorded fixtures.memin aselectchunk and thempiprocs/ncpusaccounting undercgroups(or none) on one node.
Plan#
Each step that changes the host is done only with Paul’s OK, in a window with no SEAMM jobs running there.
Decisions (below).
Freeze SLURM 20.11 (read-only, no host change). Record real
sinfo,squeue,sacct(text, since 20.11 has no JSON) andscontrol show joboutput for running, finished, failed and cancelled test jobs, asseamm_schedulerfixtures, so the old-SLURM text path stays tested without a host. Snapshot/etc/slurm, the munge key, both[molssi10]ini sections andmysqldump slurm_acct_db.Build OpenPBS in a scratch directory on MolSSI10 (
apt installof the build dependencies only, nothing started). This proves the build before SLURM is touched. Install prefix/opt/pbs,PBS_HOME/var/spool/pbs.Swap (the window): set the JobServer’s default queue so new jobs don’t go to SLURM (decision A). Wait for running jobs to finish. Stop and disable
slurmctld,slurmd,slurmdbdandmunge, thenapt removethe SLURM and munge packages (configuration kept withremove, notpurge). Install OpenPBS, with the server, scheduler, communication daemon and MoM on this host, through its systemd unit. Set up one queueworkqwith 6 CPUs and the node’s memory as resources,job_history_enable = True(7 days), and nosudoneeded for submission.Make the back end real (
seamm_scheduler): the working directory, the environment, recorded fixtures for qsub/qstat/qdel/qselect and job-history states, adoption of queued bundles after an evaluator restart, and apbsvariant in seamm-manager’s ini templates if needed. Keep the mocks for unit tests.Validate:
the scheduler suite from the Mac over ssh;
a table-writing MOPAC flowchart from MolSSI10’s own JobServer with its tasks on the local PBS queue;
with decision A, the same flowchart as a PBS job;
a MolSSI10 → TinkerCliffs job, proving the production ssh path still works;
the Mac’s SEAMM_DEV
[molssi10]queue as PBS over ssh.
Record in these notes, the design doc’s phase 7 and memory.
Rollback: stop and disable PBS, then apt install the same SLURM and munge
packages. The configuration is kept by remove, and the snapshot covers
/etc/slurm and the munge key; restore slurm_acct_db from the dump.
Then restore the ini sections and restart the JobServer.
Budget: about a day for the build and swap, and a day for the back-end work and validation.
Decisions for Paul#
PBS evaluators in the JobServer. Today MolSSI10’s default queue runs each flowchart as a SLURM job. Either:
extend the JobServer in this campaign so a section can run the evaluator as a PBS job: a scheduler-neutral
type = queuewithscheduler = pbs. This is the honest production test, but it is a JobServer change. Recommended.make MolSSI10’s default queue
local(flowcharts run as subprocesses, as on the Mac) withtasks = queue,scheduler = pbs, so only tasks go through PBS, and leave (1) for later.
Either way,
[molssi10]’s default changes during the window.MariaDB is used only for SLURM’s accounting. Remove it with SLURM (after the dump), or leave it installed and stopped?
On the host or in a container? OpenPBS in a container on MolSSI10 (images exist for development) would leave the host untouched, but a container’s PBS submitting the JobServer’s jobs on the host is not the “would it work in production” check we want. Recommended: on the host, with the container only if the build fails.
The window: when MolSSI10 can have no jobs running (its production JobServer submits to TinkerCliffs as well as locally).
Paul’s decisions (2026-10-03)#
MolSSI10 is no longer production; it is used only for testing this work. Remove SLURM and change its queues freely.
Remove MariaDB (after the dump). Install OpenPBS on the host.
Debian 11 is end of life (2026-08-31): point apt at the archives.
A (implied by the test-only role): the JobServer gets a scheduler-neutral
type = queuewithscheduler = pbs|slurm.
Done (2026-10-03)#
SLURM 20.11 frozen:
devtools/capture_fixtures.pydrives the back end over ssh against a real site and records every command;tests/fixtures/slurm-20.11/lifecycle.json(completed, failed 3:0, cancelled, pending on a dependency, unknown id) plussinfo/scontroltext, replayed bytests/test_recorded_sites.py. Snapshot on MolSSI10 in~/slurm_snapshot_2026-10-03(/etc/slurm, munge key, theslurm_acct_dbdump,saccthistory, the ini); a copy without the munge key in~/Work/SEAMM/molssi10_slurm_snapshot_2026-10-03.apt:
/etc/aptbacked up to~/apt_backup_2026-10-03; Debian sources nowarchive.debian.org(bullseye, -updates, -security), pgdgapt-archive.postgresql.org, pgadmin4 commented out,Acquire::Check-Valid-Until "false".Removed: slurmctld, slurmd, slurmdbd, slurm-client, slurm-wlm, munge and MariaDB (
remove, configuration kept;libmunge2remains).OpenPBS 23.06.06 built from source in
~/build(build dependencies from Debian;libpq-dev17 already installed), installed in/opt/pbs,PBS_HOME/var/spool/pbs, systemd unitpbsenabled; commands linked into/usr/local/binfor non-interactive ssh. Its data service runs on port 15007 with the PostgreSQL 15 binaries, beside the pubchemqc cluster on 5437. Two gotchas:/etc/hostsmapped the hostname to 127.0.1.1 (Debian’s default), and PBS insists on an interface address: now198.82.19.68(hosts.origin the apt backup). If the address changes, PBS stops.A first start needs
pbs_server -t create; without it the server exits silently after connecting to its database.
Configured with qmgr: node
molssi10(6 CPUs, 125 GB), queueworkq(default, enabled, started),job_history_enable = True(7 days).Back end made real (seamm_scheduler d3d16c0): dependencies are
-W depend=(real qsub refuses-l depend);chdirbecomes acd(Scheduler.prologue_lines);export=ALLbecomes-V;findusesqselect -xso finished jobs are found after a restart. Recorded OpenPBS fixtures (tests/fixtures/openpbs-23.06): running, queued, held, completed, failed (3), cancelled (271), unknown id.JobServer (seamm_scheduler 542ca51, seamm_jobserver 67073be):
type = queue+scheduler;is_batch/batch_scheduler; a PBS evaluator job gets-V(like SLURM’s default) unlessexport = NONE. Web UI (seamm_webui dc587ee): imports from seamm_scheduler instead of the seamm_slurm shim (an old seamm_slurm refusedtype = queue), and treatstype = queueas a batch queue.Validated from the Mac’s SEAMM_DEV (ini
[molssi10]and[molssi10-tasks]; the SLURM version saved asPaulVT.local.ini.slurm-2026-10-03) to MolSSI10’s PBS over ssh, with a test environment~/SEAMM_PBSthere (released phase 4 + the two checkouts):job 4006: the flowchart as a PBS job; results and the
seamm.dbtable staged back, values identical to local runs;job 4007: the same, with each MOPAC calculation a PBS job submitted from inside the evaluator job (tasks = queue, bundle 1, nothing inline); three bundle jobs, exit 0, identical table.
Follow-ups from the design session (2026-10-03)#
Remaining checks against “slurm” (workspace grep):
seamm_webuirouters/jobs.py: on-demand sync of a remote job’s files testedtype != "slurm", so it skipped PBS-over-ssh jobs. Fixed (seamm_webui 6be2499, with a test).seamm_execcomputational_environment.py:scheduler == "slurm"/"pbs"picks how to read the allocation (_slurm()/_pbs()); correct as is.seamm_jobserver:mode == "slurm"is the internal name of a job running as a batch job on any scheduler (injob_data-like state and the reattach path); harmless, left as is to keep the state format.seamm_schedulerconfig.py: the"slurm"alias and the historicalLocalSlurm/SshSlurmclasses; intended.seamm-manager’s ini templates and seamm_dashboard_client have none.
SLURM 20.11 coverage: the replayed calls are exactly those the back end
makes: sbatch --parsable, squeue --json (refused by 20.11) and the text
squeue --format=%i|%T|%R, sacct --json (refused) and the text
sacct --parsable2, the sacct --allocations and squeue --me finds,
squeue -r count, and scancel. The back end does not call sinfo or
scontrol; their recorded output (sinfo.txt, sinfo-Nl.txt,
scontrol-show-node.txt, scontrol-show-partition.txt) is kept beside the
fixture as reference, not replayed.
Draft HISTORY lines (for the release PRs):
seamm_scheduler: “PBS validated on a real OpenPBS 23.06 site: dependencies as
-W depend, the job starts with acdinto its directory,export=ALLbecomes-V, and finished jobs are found again (qselect -x). A section can run the flowchart itself as a batch job on any scheduler:type = queuewithscheduler = pbsorslurm(type = slurmstill works). Recorded output from real SLURM 20.11 and OpenPBS 23.06 sites is replayed by the tests.”seamm_jobserver: “Flowcharts can run as PBS jobs: a queue with
type = queueandscheduler = pbs. Like SLURM’s default, the job gets the JobServer’s environment unless the queue setsexport = NONE. Requires seamm-scheduler >= the new version.”seamm_webui: “Queues are read with seamm_scheduler (no longer the seamm_slurm shim);
type = queuequeues, such as PBS, are listed, and remote ones sync their files on demand. Requires seamm-scheduler >= the new version.”
Review (2026-10-03)#
The design session’s review (a subagent read the eight commits and checked the
findings with scripts and molssi10’s qstat history) found four must-fixes,
all fixed (seamm_scheduler 19d11c0, seamm_jobserver 0606455, seamm_webui
6be2499 and b177c6b):
Pbs.directives()replaced the section’sselectwhen the resources setntasks(every bundle does), losing the site’s memory: the live bundles of job 4007 ran withoutmem. The resources are now merged into the chunk.The JobServer’s PBS path dropped SLURM-spelled keys (
ntasks,mem) from the section and from a job’s overrides; they now become theselect. The flowchart job’s output went to$HOME(whereqsubran) and was never staged back; it is nowpbs.outin the job directory.A garbled
qstat -F jsonreply looked like “no jobs” (the JobServer would finalize or resubmit everything); it is now a failed poll.The pins named the released seamm_scheduler, which lacks
type = queue; now>= 2026.10.3. A remote venv needs the new seamm_scheduler too (documented);~/SEAMM_PBSwas updated.
Also fixed: SLURM-form times (1-00:00:00) and walltime limits; “Unknown
Job Id” on the text path means gone; cd ... || exit 1; -W block dropped;
type lower-cased; qstat -f continuation lines; replay tests check exit
codes and poll_failed; the web UI uses section.is_batch; user docs for
type = queue/PBS in seamm_scheduler and the JobServer.
Re-validated live (job 4008): the bundles ran with
select=1:ncpus=1:mem=4gb:mpiprocs=1, the flowchart job’s pbs.out came
back in the job directory, same table, all exit 0. (The output files of jobs
4006/4007, ~/seamm-4006.o17 and ~/seamm-4007.o18 on molssi10, are from
before the fix.)
Released and MolSSI10 rebuilt (2026-10-03)#
Released (Paul merged; Releases created after checking each main head):
seamm_scheduler 2026.10.3 (#2), seamm_jobserver 2026.10.3 (#25), seamm_webui
2026.10.3 (#11). The downstream CI first failed with “only seamm-scheduler
2026.10.2 is available”: PyPI’s CDN served uv a stale index for a few
minutes after the upload, although the JSON API and a plain curl already
listed 2026.10.3. Rerun once uv pip compile --no-cache resolves it locally.
MolSSI10’s own ~/SEAMM rebuilt (Paul’s decision): seamm-manager upgraded to
2026.10.2.3; environment migrate (old environment kept as
venvs/2026-10-03T17-48-17); environment recreate (it installs the nightly
list, so yesterday’s versions); update --latest --all (venv →
venvs/2026-10-03T17-50-02: seamm, molsystem, table_step, loop_step,
seamm_scheduler, seamm_jobserver 2026.10.3, seamm_exec 2026.10.3.1, mopac_step
2026.10.3.2; web UI 2026.10.3). molssi10.ini: [molssi10] is
type = queue, scheduler = pbs, transport = local, workq,
select = 1:ncpus=1:mem=20gb, limits ntasks ≤ 6, mem ≤ 100G, time ≤ 24 h;
still the default; [tinkercliffs] unchanged (SLURM version saved as
molssi10.ini.slurm-2026-10-03). JobServer and web UI (port 55060) running;
the legacy dashboard left stopped, as before.
Found while doing it (seamm-manager): environment migrate restarted a
JobServer that had been deliberately stopped (stopped again at once; it
dispatched nothing), and environment recreate has no --latest, so it
cannot pick up a release made the same day. The JobServer’s start-up log still
says “SLURM via transport” for every batch queue.
Validated with released packages on both ends:
MolSSI10 job 684: default queue, the flowchart as a PBS job on MolSSI10 (PBS job 26),
pbs.outin the job directory;MolSSI10 job 685:
tinkercliffsqueue, the ssh path to TinkerCliffs’ SLURM unchanged;SEAMM_DEV job 4009: the Mac’s SEAMM_DEV (released packages, no editable checkouts of these) to MolSSI10’s PBS, run in MolSSI10’s
~/SEAMMenvironment.
All three gave the same table as every earlier run, with no caught exceptions.
SEAMM_DEV’s [molssi10] and [molssi10-tasks] now use
/home/psaxe/SEAMM/venv/bin/run_from_jobserver. The ~/SEAMM_PBS test
environment and ~/pbs_dev checkouts on MolSSI10 are no longer used.