heshamfs/materials-simulation-skills/slurm-job-script-generator
Claude Code and agent skill by heshamfs/materials-simulation-skills
- community
Checking that the SKILL.md file is still in the repository.
Generate correct, copy-pasteable SLURM sbatch job scripts and sanity-check HPC resource requests — configure nodes, MPI tasks, OpenMP threads, memory (per-node or per-cpu), GPUs, walltime, partitions, modules, and environment variables, with automatic detection of conflicting directives and oversubscription. Use when preparing a SLURM submission script, deciding between pure MPI and hybrid MPI+OpenMP layouts, standardizing #SBATCH directives across a team, debugging why a job won't launch or gets killed, or setting up GPU-accelerated simulation jobs, even if the user only says "I need to run this on the cluster" or "my job keeps getting killed."
Install
npx vskill@latest install heshamfs/materials-simulation-skills/slurm-job-script-generatorSKILL.md
SLURM Job Script Generator
Goal
Generate a correct, copy-pasteable SLURM job script (.sbatch) for running a simulation, and surface common configuration mistakes (bad walltime format, conflicting memory flags, oversubscription hints).
Requirements
- Python 3.10+
- No external dependencies (Python standard library only)
- Works on Linux, macOS, and Windows (script generation only)
Inputs to Gather
| Input | Description | Example | |
|---|---|---|---|
| Job name | Short identifier for the job | phasefield-strong-scaling | |
| Walltime | SLURM time limit | 00:30:00 | |
| Partition | Cluster partition/queue (if required) | compute | |
| Account | Project/account (if required) | matsim | |
| Nodes | Number of nodes to allocate | 2 | |
| MPI tasks | Total tasks, or tasks per node | 128 or 64 per node | |
| Threads | CPUs per task (OpenMP threads) | 2 | |
| Memory | --mem or --mem-per-cpu (cluster policy dependent) | 32G | |
| GPUs | GPUs per node (optional) | 4 | |
| Working directory | Where the run should execute | $SLURM_SUBMIT_DIR | |
| Modules | Environment modules to load (optional) | gcc/12, openmpi/4.1 | |
| Run command | The command to launch under SLURM | ./simulate --config cfg.json |
Decision Guidance
MPI vs MPI+OpenMP layout
Rule of thumb: if you see diminishing strong-scaling efficiency at high MPI ranks, try fewer ranks with more threads per rank (and measure).
Memory flag selection
- Use either
--mem(per node) or--mem-per-cpu(per CPU), not both. - Follow your cluster’s documentation; some sites enforce one style.
- SLURM
--memunits are integer MB by default, or an integer with suffixK/M/G/T(and--mem=0commonly means “all memory on node”).
Launcher selection (avoid double-wrapping)
- By default (
--launcher srun) the generator prependssrun --ntasks=N --cpus-per-task=Tto your run command so it inherits SLURM task placement. - If your run command already starts with `srun`, `mpirun`, or `mpiexec`, pass `--launcher none` so the generator does not double-wrap it. Wrapping
srunaroundmpirunlaunches N independent copies ofmpirun(each spawning its own MPI world); wrappingsrunaroundsrunis malformed. - As a safety net, the generator auto-detects a leading launcher (
srun,mpirun,mpiexec,mpiexec.hydra,orterun,aprun,jsrun) and falls back to no-wrap, emitting a warning that recommends--launcher none.
GPU layout
- Ranks-per-GPU =
total_ranks / (nodes * gpus_per_node). When--gpus-per-nodeis set the generator reportsresults.derived.total_gpusandresults.derived.ranks_per_gpu. - Aim to map ranks evenly to devices. If
ntasksis not divisible by the total number of GPUs, the generator emits a "task-to-GPU ratio is not an integer" warning; either adjustntasks/GPUs or document intentional sharing (e.g. NVIDIA MPS). - Consider binding options such as
--gpu-bind=closestor--ntasks-per-gpu(passed via your run command /--srun-extra). GPU and QoS policies are site-specific — confirm with your cluster docs.
Script Outputs (JSON Fields)
| Script | Key Outputs | |
|---|---|---|
scripts/slurm_script_generator.py | results.script, results.directives, results.derived, results.warnings, results.run_line |
results.derived reports ntasks, ntasks_per_node, cpus_total_requested, and (when applicable) cores_per_node, cpus_per_node_requested, total_gpus, and ranks_per_gpu. results.warnings may include CPU oversubscription, task-to-GPU ratio, and double-launcher warnings.
Workflow
- Gather cluster constraints (partition/account, GPU policy, memory policy).
- Choose a process layout (MPI-only vs hybrid MPI+OpenMP).
- Generate the script with
slurm_script_generator.py. - Inspect warnings (conflicts, suspicious layouts).
- Save the generated script as
job.sbatch. - Submit with
sbatch job.sbatchand monitor withsqueue.
CLI Examples
Conversational Workflow Example
User: I need an sbatch script for my MPI simulation. I want 2 nodes, 64 ranks per node, 2 OpenMP threads per rank, and 2 hours.
Agent workflow:
- Confirm partition/account and whether GPUs are needed.
- Generate a hybrid job script:
``bash python3 scripts/slurm_script_generator.py --job-name run --time 02:00:00 --nodes 2 --ntasks-per-node 64 --cpus-per-task 2 -- ./simulate ``
- Explain the mapping:
- Total ranks = 128
- Threads per rank = 2 (
OMP_NUM_THREADS=2)
- If the user provides node core counts, sanity-check oversubscription using
--cores-per-node.
Error Handling
| Error | Cause | Resolution | |
|---|---|---|---|
time must be HH:MM:SS or D-HH:MM:SS | Bad walltime format | Use 00:30:00 or 1-00:00:00 | |
nodes must be positive | Non-positive nodes | Provide --nodes >= 1 | |
Provide either --mem or --mem-per-cpu, not both | Conflicting memory directives | Choose one memory style | |
Provide a run command after -- | Missing launch command | Add -- ./simulate ... | |
--partition must match /^[A-Za-z0-9]... | Partition/account/qos/constraint/reservation contains spaces or shell metacharacters | Use a plain identifier | |
module must match /^[A-Za-z0-9]... | Module name contains shell metacharacters | Use e.g. gcc/12, openmpi/4.1 | |
nodes must be <= 100000 (got ...) | Integer request exceeds the sanity upper bound | Re-check the requested value |
Verification checklist
- [ ] Confirmed the generated
results.scriptplaces every#SBATCHdirective immediately after the shebang and beforeset -euo pipefail(open the script and check the first real command line) — a directive after the first command is silently ignored by SLURM. - [ ] Inspected
results.warningsand confirmed it is empty, or recorded each warning (CPU oversubscription, non-integer task-to-GPU ratio, double-launcher) with a deliberate justification for ignoring it. - [ ] Recorded
results.derived.cpus_total_requested(=ntasks * cpus-per-task) and, when--cores-per-nodewas supplied, confirmedcpus_per_node_requested <= cores_per_nodeso the node is not oversubscribed. - [ ] For hybrid runs, verified the script's
export OMP_NUM_THREADSvalue equalsresults.derivedcpus_per_task(the generator sets them equal — confirm that matches the intended threads-per-rank). - [ ] For GPU jobs, recorded
results.derived.total_gpusandranks_per_gpuand confirmedranks_per_gpuis the intended integer (or documented intentional sharing such as MPS). - [ ] Verified
results.run_lineis not double-wrapped: if the run command already starts withsrun/mpirun/mpiexec/orterun/aprun/jsrun, confirmed--launcher nonewas used (or the auto-detect warning fired) so SLURM does not launch N independent copies. - [ ] Cross-checked the partition, account, QoS, memory style (
--memvs--mem-per-cpu), and GPU directive against the actual cluster's documented policy — the generator only validates internal consistency, never site policy.
Common pitfalls & rationalizations
| Tempting shortcut | Why it's wrong / what to do | |
|---|---|---|
| "It generated a script with no errors, so the resources are correct." | The generator only checks internal consistency — it never queries the cluster. Validate partition/account/QoS/memory style and GPU directives against your site's actual docs before submitting. | |
"I'll keep the srun/mpirun already in my run command and let the generator wrap it." | Wrapping srun around mpirun launches N independent mpirun processes (each its own MPI world); srun around srun is malformed. Pass --launcher none, and confirm the auto-detect warning fired in results.warnings. | |
| "I requested the nodes I want, so the job will use them all." | If any #SBATCH directive slips below the first command it is silently dropped and the job falls back to cluster defaults. Re-read the generated script and confirm all directives precede set -euo pipefail. | |
| "ntasks doesn't divide the GPU count, but it ran, so it's fine." | A non-integer ranks_per_gpu means ranks map unevenly to devices (idle/oversubscribed GPUs). The generator emits a task-to-GPU warning — fix ntasks/GPUs or explicitly document MPS sharing. | |
"I set high ntasks-per-node because more ranks is faster." | Without --cores-per-node the generator can't catch oversubscription, and ntasks-per-node*cpus-per-task exceeding physical cores degrades performance. Pass --cores-per-node and check cpus_per_node_requested. | |
"I'll set both --mem and --mem-per-cpu to be safe." | These are mutually exclusive; the generator rejects supplying both. Pick the one your cluster's policy enforces. | |
| "OMP_NUM_THREADS doesn't matter for an MPI-only code." | The generator always exports OMP_NUM_THREADS=cpus-per-task; for MPI-only runs keep --cpus-per-task=1 so threaded libraries don't silently oversubscribe cores. |
Security
Input Validation
--timeis validated against strictHH:MM:SSorD-HH:MM:SSformat via regex (minutes/seconds in[00,59])--nodes,--ntasks,--ntasks-per-node,--cpus-per-task,--gpus-per-node,--cores-per-nodeare validated as positive integers with generous upper bounds (e.g. nodes ≤ 100000, ntasks ≤ 10000000, cpus-per-task ≤ 4096, gpus-per-node ≤ 64); the derived totalntasks = nodes * ntasks-per-nodeis also bounds-checked--memand--mem-per-cpuare validated against SLURM's accepted format (^[0-9]+([KMGT])?$); providing both simultaneously is rejected--job-nameis validated against^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$(no spaces or shell metacharacters)--partition,--account,--qos,--constraint,--reservation, and--gpu-typeare validated against a safe-character allowlist^[A-Za-z0-9][A-Za-z0-9._:,+-]{0,127}$before being emitted into#SBATCHdirectives--modulevalues are validated against^[A-Za-z0-9][A-Za-z0-9._/+-]{0,127}$to prevent shell injection (no;,|,&, backticks,$, or whitespace)--envkeys must be valid shell identifiers (^[A-Za-z_][A-Za-z0-9_]*$); values are shell-quoted in the generatedexportlines--srun-extrais tokenized withshlex.splitand each token is re-quoted withshlex.quote, so it cannot inject shell syntax (;,|,&,$, ...) into the run line- Invalid input causes the CLI to print a message to stderr and exit with code
2
File Access
- The script reads no external files; all inputs are provided via CLI arguments
--outwrites the generated sbatch script to a single specified file path- The generated script is a plain-text shell script with
#SBATCHdirectives; it contains no dynamically generated code
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 95 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingskills/hpc-deployment/slurm-job-script-generator/SKILL.md
Popularity
- Repository stars
- 57
- Repository forks
- 4
- 7-day trend score
- 20
Stars and forks are for the whole GitHub repository, not this skill alone. Refreshed 16 Jul 2026, 3 months ago.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/heshamfs/materials-simulation-skills/slurm-job-script-generator)