Hyperpod Slurm Debugger
AWS LabsOfficialPublished by AWS Labs
- Skill
- Review and audit
- Cloud and DevOps
- Apache-2.0
- Low risk
- Has scripts
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
The HyperPod Slurm Debugger is a read-only diagnostic utility designed to investigate common issues in Slurm-based Amazon SageMaker HyperPod clusters. It provides a structured approach to identifying problems such as nodes stuck in down or drain states, unexpected reboots, controller desynchronization, and job failures. The skill strictly adheres to a read-only policy, ensuring no state-mutating commands are executed, recommended, or printed. Instead, it maps diagnostic findings to official AWS and Slurm documentation for user-led remediation.
What it does
- Identifies Slurm node states and daemon health issues.
- Diagnoses controller desyncs and job scheduling bottlenecks.
- Validates Action:Reboot and Action:Replace strings for HyperPod auto-recovery.
- Maps diagnostic findings to authoritative AWS and Slurm documentation.
- Verifies cluster orchestration type to ensure compatibility.
- Provides read-only analysis of cluster logs and node status.
When to use it
- When Slurm nodes are stuck in down or drain states.
- When jobs are stuck in PENDING or COMPLETING states unexpectedly.
- When GRES or GPU counts appear incorrect.
- When scontrol ping fails or the controller is unresponsive.
- When HyperPod auto-recovery or auto-resume fails to trigger as expected.
Advantages
- Prevents accidental state mutation by enforcing a strict read-only policy.
- Streamlines troubleshooting by mapping symptoms to specific documentation.
- Reduces manual log parsing by automating diagnostic data collection.
- Provides clear escalation paths for hardware-specific or complex issues.
Usage examples
- “Investigate why my Slurm nodes are stuck in down state.”
- The agent runs the diagnostic script to check slurmd status and system logs, then reports the findings and links to the relevant troubleshooting documentation.
- “Diagnose a Slurm node that is not responding.”
- The agent identifies the node's state and provides a summary of potential causes like disk full or network partitions, referencing the appropriate AWS troubleshooting guide.
- “Why are my jobs stuck PENDING with REASON=Resources?”
- The agent checks the controller state and resource accounting, identifying if a desync exists and pointing the user to the correct controller restart or reconfiguration procedures.
Install
Download the skill as a ZIP:
https://autogineer.com/agent-skills/awslabs/hyperpod-slurm-debugger/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip hyperpod-slurm-debugger.zip -d .agents/skills
Documentation by AWS Labs
HyperPod Slurm Debugger
Diagnostic-only. Identify and classify Slurm scheduler and node-daemon issues on HyperPod Slurm clusters. Do not run, recommend, or print any state-mutating command. For remediation, link to the official AWS or Slurm documentation.
When to invoke
Invoke when the user reports any of the symptoms in the decision table.
When NOT to invoke
Cluster has
Orchestrator.Eks— invokehyperpod-node-debuggerorhyperpod-nccl.Single-node hardware fault with healthy Slurm scheduler — invoke
hyperpod-node-debugger.NCCL training-hang investigation — invoke
hyperpod-nccl.Node unreachable via SSM — invoke
hyperpod-ssm.
Constraints
Read-only. Do not run, recommend, or print state-mutating commands.
For any remediation, link to AWS or Slurm docs. The user authorizes and executes.
IaC-managed cluster (Terraform / CloudFormation / CDK): warn that direct mutation drifts the live state from the IaC plan.
Canonical recovery URLs: references/slurm-details.md → Authoritative recovery documentation.
Prerequisites
AWS CLI v2, authenticated for the target account and region with permissions:
sagemaker:DescribeCluster,sagemaker:ListClusterNodesssm:StartSessionon the HyperPod-created SSM document
Session Manager plugin installed locally.
jq≥ 1.6.unbuffer(from theexpectpackage). Required — without itaws ssm start-sessionreturns empty stdout intermittently withCannot perform start session: EOFand every check silently misreports. Install:expectpackage on Amazon Linux / RHEL / Debian / Ubuntu / macOS. Script exits at prerequisite check if missing.
Procedure
Step 1 — Collect inputs
Ask the user for:
HyperPod cluster name (not Slurm partition name).
AWS region.
Optional: a specific Slurm node name.
Step 2 — Confirm orchestrator
aws sagemaker describe-cluster --cluster-name <NAME/ARN> --region <REGION> \
--query 'Orchestrator' --output jsonIf Orchestrator.Eks is present, stop. Route per When NOT to invoke.
Step 3 — Run the diagnostic script
bash scripts/slurm-diagnose.sh --cluster <NAME> --region <REGION>
# Scope to a node:
bash scripts/slurm-diagnose.sh --cluster <NAME> --region <REGION> --node <SLURM_NODE>Relay the script output to the user verbatim.
Step 4 — Map findings → docs
For each finding, look up the section in the decision table and link the user to the corresponding AWS / Slurm doc. Do not type out remediation commands.
Decision table
Symptom (sinfo -o "%N %T %30E" or script finding) | Section |
|---|---|
Node state = down or down*, reason other than below | A: Node Down |
Node state = down*, Reason = Node unexpectedly rebooted | B: Unexpected Reboot |
Jobs PENDING with REASON=Resources while nodes are idle | C: Controller State |
Jobs stuck COMPLETING after node replacement | C: Controller State |
scontrol ping returns DOWN for the controller | C: Controller State |
| GRES (GPU) counts incorrect or not released | C: Controller State |
state=fail issued but no recovery occurred | D: Action Reason Mismatch |
Accounting errors or RPC errors mentioning dbd | C: Controller State (slurmdbd) |
slurm.conf edited; new partitions or nodes not visible | C: Controller State (config) |
| Job exited on a hardware failure but did not restart | E: Auto-resume |
Defaults
| Behavior | Default | Override |
|---|---|---|
| Mode | read-only — always; no remediation flag exists | n/a |
| Region | $AWS_DEFAULT_REGION, falling back to us-east-1 | --region <R> |
| Scope | all nodes in down / drain / fail / "unexpectedly rebooted" | --node <SLURM_NODE_NAME> |
| Output | colorized terminal | --no-color |
| SSM target format | sagemaker-cluster:<clusterId>_<instanceGroupName>-<instanceId> (derived) | n/a |
| Controller discovery | --controller-group (if set) → SlurmConfig.NodeType=Controller → provisioning_parameters.json | --controller-group <N> |
Error handling
| Failure | Skill behavior | Required user action |
|---|---|---|
describe-cluster fails | Print AWS error; exit 1 | Fix credentials/region; verify cluster name |
Cluster has Orchestrator.Eks | Exit 1 with pointer to EKS-side skills | Use hyperpod-node-debugger or hyperpod-nccl |
session-manager-plugin missing / SSM unreachable | sinfo returns empty; exit 1 | Install plugin; verify node InService |
Disk ≥ 95 % full on a down node | Report finding disk-full-<node> | Refer to AWS troubleshooting docs |
Missing jq or aws | Exit 1 at prerequisite check | Install per Prerequisites |
A: Node Down
Node is down because slurmd stopped responding. Causes: slurmd crash, disk full,
OOM, network partition, hardware fault.
Script checks: systemctl is-active slurmd, srun -w <NODE> hostname (RPC layer), disk,
memory.
If node returns to down after a manual resume → escalate to hyperpod-node-debugger.
Context: references/slurm-details.md § A.
B: Unexpected Reboot
Node is down* with Reason "Node unexpectedly rebooted" because slurmd
re-registered after an out-of-band reboot. Upstream Slurm behavior, not HyperPod.
Node is typically healthy.
Links:
https://slurm.schedmd.com/scontrol.html (
state=resumesemantics)
If node reboots again within minutes → escalate to hyperpod-node-debugger.
Context: references/slurm-details.md § B.
C: Controller State
slurmctld in-memory state can desync from the on-disk state. A controller restart reloads from StateSaveLocation and clears bad caches. User decides and executes.
Restart may help:
| Symptom | Why |
|---|---|
PENDING with REASON=Resources, idle nodes | Re-evaluates the queue |
Jobs stuck COMPLETING after node replacement | Controller held a reference to the old node |
| GRES (GPU, EFA) not released after a job ends | Resource accounting de-synced |
Nodes stuck Unknown after reboot, slurmd is up | Re-registration was not processed |
scontrol ping times out | Controller event loop is hung |
Lost connection to slurmdbd / RPC errors | DBD connection wedged |
Do NOT restart when:
HyperPod replacement (
Action:Replace) in progress on any node — concurrent changes fail the replacement.Only one compute node is bad — restart
slurmdon that node.sinfoandsqueueare responsive — problem is elsewhere.journalctl -u slurmctldnot reviewed yet — panic / OOM will reproduce.slurm.confwas just edited — tryscontrol reconfigurefirst.
Folded triggers
slurmdbd disconnected —
sacctfails, accounting fields showUnknown, controller log spamsUnable to contact slurmdbd. Restoreslurmdbdbefore considering controller restart. https://slurm.schedmd.com/accounting.html · details.Stale config —
slurm.conf/topology.confmtime > slurmctld start.scontrol reconfigurefirst; restart is fallback. https://slurm.schedmd.com/scontrol.html · details.
Restart procedure / what's preserved:
Context: references/slurm-details.md § C.
D: Action Reason Mismatch
scontrol update state=fail reason=... was issued with a reason that does not match
Action:Reboot or Action:Replace exactly. HyperPod silently ignores anything else.
Script detects near-misses on nodes in fail state.
Required strings (case-sensitive, no whitespace, no punctuation):
Action:RebootAction:Replace
Context: references/slurm-details.md § Action reason-string validation.
E: Auto-resume
--auto-resume=1 is an srun step option. It re-runs the step after HMA (the Health
Monitoring Agent) flags a node and Automatic node recovery replaces it.
Why it didn't restart the job:
Flag on
sbatchnotsrun— per-step;sbatchdirectives are silently ignored.HMA did not flag the node — failure was application/transient, not hardware. Step exits as a normal Slurm failure.
Cluster
NodeRecoveryisNone— faulty nodes are labeled but not replaced.No checkpointing — step restarts from process zero each iteration.
AMI predates HMA support (released 2025-09-11) — needs AMI / cluster-software update.
Link: https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-hyperpod-resiliency-slurm-auto-resume.html
Context: references/slurm-details.md § HyperPod auto-resume.
Escalation
| Condition | Next skill |
|---|---|
Node returns to down shortly after a manual resume | hyperpod-node-debugger (hardware) |
slurmd logs contain CUDA / NVIDIA / XID errors | hyperpod-node-debugger § G |
Disk full or /dev/shm exhausted | hyperpod-node-debugger § I |
| Node unreachable via SSM | hyperpod-ssm |
Controller restart does not clear COMPLETING after 2 attempts | hyperpod-issue-report + AWS Support |
Files
- ATTRIBUTION.mdAdded by AutoGineer930 B
- LICENSELicence file added by AutoGineer9.9 KiB
- NOTICELicence file added by AutoGineer89 B
- SKILL.md12.8 KiB
- references/slurm-details.md13.3 KiB
- scripts/slurm-diagnose.shScript37.0 KiB
references/slurm-details.md
Slurm Details
Diagnostic context for hyperpod-slurm-debugger. Diagnostic-only — do not run,
recommend, or print state-mutating commands. Link to AWS / Slurm docs for remediation.
Table of contents
Authoritative recovery documentation
HyperPod auto-resume
Action reason-string validation
§ A: Node down — diagnostic context
§ B: Unexpected reboot — diagnostic context
§ C: Controller state — diagnostic context
scontrol reconfigure vs restart
slurmdbd connectivity
Authoritative recovery documentation
HyperPod Slurm troubleshooting: https://github.com/aws/sagemaker-hyperpod-cluster-setup/blob/troubleshooting-doc-20250917/troubleshoot/index.md
Replace a faulty Slurm instance: https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-hyperpod-resiliency-slurm-replace-faulty-instance.html
HyperPod auto-resume: https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-hyperpod-resiliency-slurm-auto-resume.html
BatchRebootClusterNodes: https://docs.aws.amazon.com/cli/latest/reference/sagemaker/batch-reboot-cluster-nodes.htmlBatchReplaceClusterNodes: https://docs.aws.amazon.com/cli/latest/reference/sagemaker/batch-replace-cluster-nodes.htmlscontrol(1): https://slurm.schedmd.com/scontrol.htmlslurmctld(8): https://slurm.schedmd.com/slurmctld.htmlslurm.conf(5): https://slurm.schedmd.com/slurm.conf.htmlSlurm accounting: https://slurm.schedmd.com/accounting.html
Slurm authentication (munge): https://slurm.schedmd.com/authentication.html
HyperPod auto-resume
Three separate features that compose:
HMA (Health Monitoring Agent) — runs hardware checks (NVIDIA SMI, Neuron sysfs, EFA) continuously, independent of jobs. Marks faulty nodes for drain.
Automatic node recovery (cluster
NodeRecoverysetting;AutomaticorNone) — whenAutomatic, replaces drained nodes after their jobs exit.--auto-resume=1(srunstep option) — re-runs the step after HMA + node recovery replace a node in its allocation.
Auto-resume itself does not run health checks. HMA does. Auto-resume reacts to HMA-triggered replacements. The AWS doc's "How auto-resume works" section is misleading on this point — the authoritative description is in the "How automatic node recovery and auto-resume work together" section, which states: "If the HMA detects a hardware fault, the node is marked for drain regardless of job-level status. With node automatic recovery enabled, the nodes are automatically replaced once all the jobs running in the nodes exit. In this scenario, for jobs with auto-resume enabled, if there is a non-zero exit status in the step, the auto resume kicks in."
If HMA does not flag a node, auto-resume does not fire — the step exits as a normal Slurm failure.
https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-hyperpod-resiliency-slurm-auto-resume.html
Verify auto-resume ran (read-only)
# Replace events in slurmctld log:
sudo journalctl -u slurmctld --since "2 hours ago" | grep -E 'auto.?resume|Action:Replace|replac'
# Last reason and boot time on the node:
scontrol show node <NODE> | grep -i 'reason\|boot'
# Job-step events from accounting:
sacct -j <JOBID> -o JobID,JobName,State,ExitCode,NodeList,Start,End -XSame JOBID after NodeList change → auto-resume succeeded.
Why auto-resume didn't restart
Flag on
sbatchnotsrun— per-step option;sbatchdirectives ignored.HMA did not flag the node — auto-resume only reacts to HMA-triggered replacements. Inspect
dmesgandjournalctl -kfor hardware signals (XID, MCE, PCIe AER, EFA driver errors). None → not hardware; failure was application or transient and auto-resume cannot fire.Cluster
NodeRecoveryisNone— HMA labels faulty nodes but nothing replaces them. Confirm:aws sagemaker describe-cluster ... --query NodeRecovery.AMI predates HMA support (released 2025-09-11). Script flags this by checking for
--auto-resumeinsrun --help.Concurrent manual
Action:Replaceracing with the automatic replacement.
Action reason-string validation
HyperPod auto-recovery matches the Slurm node Reason field exactly, case-sensitive:
| Intent | Required reason |
|---|---|
| Reboot | Action:Reboot |
| Replace | Action:Replace |
Any mismatch is silently ignored. Common near-misses:
action:replace— wrong caseAction: Reboot— extra space after colonAction:Reboot⎵(where⎵is whitespace) — trailing whitespaceAction:Reboot.— trailing punctuationReboot/replace this— wrong format
Verify (read-only):
sinfo -o "%N %T %30E" | grep <NODE>
scontrol show node <NODE> | grep -i reasonCanonical command form per AWS docs (do not run from this skill — operator-executed):
scontrol update node=<ip-ipv4> state=fail reason="Action:Reboot"
scontrol update node=<ip-ipv4> state=fail reason="Action:Replace"Re-issue procedure: https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-hyperpod-resiliency-slurm-replace-faulty-instance.html
§ A: Node down — diagnostic context
slurmd stopped responding. Causes: slurmd crash/stop, disk full, OOM, network
partition, hardware fault.
Inspection (read-only)
# Head node:
sinfo -o "%N %T %30E" | grep -E 'down|drain'
scontrol show node <NODE> # Reason, LastBusyTime, Boot
# Reachability per layer:
ping <NODE> # L3
srun -w <NODE> hostname # Slurm RPC
ssh <NODE> true # SSH (if configured)
# Affected node (via SSM):
systemctl status slurmd
journalctl -u slurmd -n 200 --no-pager
journalctl -xe -n 100 --no-pager # kernel errors, OOM kills
free -h
df -h
df -h /dev/shmFindings → docs
| Finding | Link |
|---|---|
slurmd stopped, logs clean | HyperPod Slurm troubleshooting (Authoritative recovery) |
slurmd crashing, munge errors | https://slurm.schedmd.com/authentication.html |
| Disk full | HyperPod storage layout (/opt/sagemaker, /opt/dlami/nvme, FSx) |
OOM in dmesg | Right-size workload — AWS instance-type docs |
| Kernel panic / recent reboot | § B: Unexpected reboot |
GPU XID / ECC errors in dmesg | hyperpod-node-debugger § G |
If node returns to down after manual recovery → hyperpod-node-debugger (hardware).
§ B: Unexpected reboot — diagnostic context
slurmd re-registered after an out-of-band reboot (kernel panic, watchdog, manual
reboot, HyperPod auto-repair). Slurm marks the node down* with reason
Node unexpectedly rebooted and refuses scheduling. Upstream Slurm behavior, not
HyperPod-specific — protects pending jobs from landing on a node with potentially
corrupt local state (partial checkpoints, half-written scratch).
Node is usually fine. Resume procedure:
https://slurm.schedmd.com/scontrol.html (
state=resumesemantics)
If the node loops through reboots → kernel / hardware issue. Inspect dmesg and
journalctl -b -1 (previous boot) before any further action. Route to
hyperpod-node-debugger.
§ C: Controller state — diagnostic context
slurmctld in-memory state desynced from disk-persisted state. Standard restart reloads
from StateSaveLocation (typically /var/spool/slurmctld/ on HyperPod, but
admin-configured — confirm with scontrol show config | grep StateSaveLocation).
What's preserved across a restart
Per slurmctld(8), without -c the restart
preserves running jobs plus node state of DOWN, DRAINED, and DRAINING nodes with
their Reason field.
Recovered from StateSaveLocation:
Running jobs (continue executing on compute nodes; reconnect when controller is back).
Pending queue (
squeuereturns the same queue).DOWN,DRAINED,DRAININGnode states + Reason field.Accounting records (via
slurmdbd).
Re-read from slurm.conf on startup:
Partition definitions,
NodeNamedefinitions, scheduling parameters.
Reset (this is what fixes the symptoms):
In-memory scheduling decisions and priority calculations.
GRES / TRES accounting caches.
Hung RPC connections to compute nodes.
Stale
REASON=Resourceson pending jobs.Stuck
COMPLETINGtracking.
Pre-restart inspection (read-only)
scontrol show config | grep StateSaveLocation
STATE=$(scontrol show config | awk -F= '/^StateSaveLocation/ {gsub(/ /,"",$2); print $2; exit}')
sudo ls -la "$STATE" # should have recent state filesIf the directory is missing or empty, do NOT restart — recover state file from backup
first. slurmctld -c (clean start) purges every job from the controller.
Restart procedure:
When-to-restart vs when-not-to: see SKILL.md § C.
scontrol reconfigure vs restart
slurm.conf / topology.conf / gres.conf was edited; controller has stale config
in memory. Two reload paths:
scontrol reconfigure — no downtime. Reloads slurm.conf in place. Per
scontrol(1), cannot change daemons'
listening TCP port or AuthType; changing AuthType requires terminating all Slurm
daemons + commands per slurm.conf(5).
systemctl restart slurmctld — ~5–30s scheduling pause. Required for changes that
scontrol reconfigure rejects. In practice operators also restart for structural
changes (adding/removing nodes, NodeName changes, topology rewrites) since
reconfigure isn't guaranteed to apply them cleanly.
Pre-reload inspection (read-only):
# HyperPod installs to /opt/slurm-<version>/etc/, not /etc/slurm/:
CONF=$(scontrol show config | awk -F= '/^SLURM_CONF/ {gsub(/ /,"",$2); print $2; exit}')
ls -la "$CONF"
# After reload, watch for parse errors:
journalctl -u slurmctld -n 50 --no-pagerNo syntax-check flag exists for slurmctld or slurmdbd. Errors surface in
journalctl after reload.
scontrol reconfigure only reloads the controller's view. Compute nodes read their own
copy of slurm.conf from disk. If the lifecycle script doesn't push slurm.conf to
every node (via shared FSx mount or explicit copy step), node-side slurmd runs with
stale config until restarted.
slurmdbd connectivity
slurmctld cannot reach slurmdbd. Scheduler keeps running; accounting fails. Symptoms
look like a controller hang but aren't.
Symptoms:
sacctmgr show statsreturnsUnable to contact slurmdbdorConnection refused.sacct -j <JOBID>returnsSockets disabledor no rows.journalctl -u slurmctld | grep -i dbdshows repeated reconnect attempts.New jobs complete but accounting records never appear in
sacct.
Diagnose (read-only):
systemctl status slurmdbd
journalctl -u slurmdbd -n 100 --no-pager
journalctl -u slurmctld -n 100 --no-pager | grep -iE 'dbd|accounting'
# slurmdbd.conf path — HyperPod uses /opt/slurm-<version>/etc/:
SLURMDBD_CONF=$(find /opt/slurm*/etc /etc/slurm -name slurmdbd.conf 2>/dev/null | head -1)
sudo grep -E 'StorageHost|StoragePort|StorageUser' "$SLURMDBD_CONF"
nc -vz <StorageHost> <StoragePort> # default port 3306Common causes:
| Cause | Link |
|---|---|
slurmdbd daemon stopped or crashed | https://slurm.schedmd.com/accounting.html |
| MySQL / MariaDB endpoint unreachable | Restore SG / VPC route; slurmdbd self-recovers |
slurmdbd.conf StoragePass wrong / rotated | https://slurm.schedmd.com/slurmdbd.conf.html |
| Disk full on slurmdbd host | Daemon won't start without log-file write access |
| Schema migration pending after Slurm upgrade | https://slurm.schedmd.com/upgrades.html |
Recovery order:
Restore
slurmdbd. Running jobs are unaffected — no time pressure.Verify with
sacctmgr show stats(rollup counters, no errors).Only then evaluate whether
slurmctlditself needs a restart. Ifslurmctldrecovered the DBD connection on its own, no restart is needed. If the controller log still shows stuck DBD-RPC threads, see § C.
If the database is RDS / Aurora / managed, check snapshot windows and maintenance
events — a brief failover can leave slurmctld with a wedged connection.
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs a command-line tool, Needs Node.js
Security
What our scanner noticed· Low risk
- Scripts that your agent may run
This skill includes scripts that your agent may run. Read them before you use it.
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Published by
- AWS Labs
- Publisher
- AWS Labs (Official)
- Source
- awslabs/agent-plugins · plugins/sagemaker-ai/skills/hyperpod-slurm-debugger · commit fbefb37
- Licence
- Apache License 2.0 (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- NOTICE (added by AutoGineer from NOTICE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by AWS Labs or AWS Labs.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download hyperpod-slurm-debugger.zip