Generated banner for Hyperpod Slurm Debugger
Generated logo for Hyperpod Slurm Debugger

Hyperpod Slurm Debugger

AWS LabsOfficialPublished by AWS Labs

  • Skill
  • Review and audit
  • Cloud and DevOps
  • Apache-2.0
  • Low risk
  • Has scripts

From the author

Diagnostic-only skill for Slurm scheduler and node-daemon issues on Amazon SageMaker HyperPod Slurm clusters. Scope mirrors the HyperPod troubleshooting guide. Invoke when the user reports a Slurm node stuck in down/drain, "Node unexpectedly rebooted" after auto-repair, slurmd not running, jobs stuck PENDING with REASON=Resources while sinfo shows idle nodes, jobs stuck COMPLETING after node replacement, GRES/GPU counts wrong, scontrol ping failing, slurmctld unresponsive, an Action:Reboot/Replace request that did not trigger HyperPod auto-recovery, or auto-resume not restarting a job. Also triggers on "drain before reboot", "diagnose a Slurm node", "investigate stuck jobs."
— the description by AWS Labs

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

  1. Download the skill as a ZIP:

    https://autogineer.com/agent-skills/awslabs/hyperpod-slurm-debugger/download
  2. Unzip 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 — invoke hyperpod-node-debugger or hyperpod-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:ListClusterNodes

    • ssm:StartSession on the HyperPod-created SSM document

  • Session Manager plugin installed locally.

  • jq ≥ 1.6.

  • unbuffer (from the expect package). Required — without it aws ssm start-session returns empty stdout intermittently with Cannot perform start session: EOF and every check silently misreports. Install: expect package on Amazon Linux / RHEL / Debian / Ubuntu / macOS. Script exits at prerequisite check if missing.

Procedure

Step 1 — Collect inputs

Ask the user for:

  1. HyperPod cluster name (not Slurm partition name).

  2. AWS region.

  3. Optional: a specific Slurm node name.

Step 2 — Confirm orchestrator
aws sagemaker describe-cluster --cluster-name <NAME/ARN> --region <REGION> \
  --query 'Orchestrator' --output json

If 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 belowA: Node Down
Node state = down*, Reason = Node unexpectedly rebootedB: Unexpected Reboot
Jobs PENDING with REASON=Resources while nodes are idleC: Controller State
Jobs stuck COMPLETING after node replacementC: Controller State
scontrol ping returns DOWN for the controllerC: Controller State
GRES (GPU) counts incorrect or not releasedC: Controller State
state=fail issued but no recovery occurredD: Action Reason Mismatch
Accounting errors or RPC errors mentioning dbdC: Controller State (slurmdbd)
slurm.conf edited; new partitions or nodes not visibleC: Controller State (config)
Job exited on a hardware failure but did not restartE: Auto-resume

Defaults

BehaviorDefaultOverride
Moderead-only — always; no remediation flag existsn/a
Region$AWS_DEFAULT_REGION, falling back to us-east-1--region <R>
Scopeall nodes in down / drain / fail / "unexpectedly rebooted"--node <SLURM_NODE_NAME>
Outputcolorized terminal--no-color
SSM target formatsagemaker-cluster:<clusterId>_<instanceGroupName>-<instanceId> (derived)n/a
Controller discovery--controller-group (if set) → SlurmConfig.NodeType=Controller → provisioning_parameters.json--controller-group <N>

Error handling

FailureSkill behaviorRequired user action
describe-cluster failsPrint AWS error; exit 1Fix credentials/region; verify cluster name
Cluster has Orchestrator.EksExit 1 with pointer to EKS-side skillsUse hyperpod-node-debugger or hyperpod-nccl
session-manager-plugin missing / SSM unreachablesinfo returns empty; exit 1Install plugin; verify node InService
Disk ≥ 95 % full on a down nodeReport finding disk-full-<node>Refer to AWS troubleshooting docs
Missing jq or awsExit 1 at prerequisite checkInstall 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.

Link: https://github.com/aws/sagemaker-hyperpod-cluster-setup/blob/troubleshooting-doc-20250917/troubleshoot/index.md

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:

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:

SymptomWhy
PENDING with REASON=Resources, idle nodesRe-evaluates the queue
Jobs stuck COMPLETING after node replacementController held a reference to the old node
GRES (GPU, EFA) not released after a job endsResource accounting de-synced
Nodes stuck Unknown after reboot, slurmd is upRe-registration was not processed
scontrol ping times outController event loop is hung
Lost connection to slurmdbd / RPC errorsDBD 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 slurmd on that node.

  • sinfo and squeue are responsive — problem is elsewhere.

  • journalctl -u slurmctld not reviewed yet — panic / OOM will reproduce.

  • slurm.conf was just edited — try scontrol reconfigure first.

Folded triggers

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:Reboot

  • Action:Replace

Link: https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-hyperpod-resiliency-slurm-replace-faulty-instance.html

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 sbatch not srun — per-step; sbatch directives are silently ignored.

  • HMA did not flag the node — failure was application/transient, not hardware. Step exits as a normal Slurm failure.

  • Cluster NodeRecovery is None — 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

ConditionNext skill
Node returns to down shortly after a manual resumehyperpod-node-debugger (hardware)
slurmd logs contain CUDA / NVIDIA / XID errorshyperpod-node-debugger § G
Disk full or /dev/shm exhaustedhyperpod-node-debugger § I
Node unreachable via SSMhyperpod-ssm
Controller restart does not clear COMPLETING after 2 attemptshyperpod-issue-report + AWS Support

Files

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 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 NodeRecovery setting; Automatic or None) — when Automatic, replaces drained nodes after their jobs exit.

  • --auto-resume=1 (srun step 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 -X

Same JOBID after NodeList change → auto-resume succeeded.

Why auto-resume didn't restart
  • Flag on sbatch not srun — per-step option; sbatch directives ignored.

  • HMA did not flag the node — auto-resume only reacts to HMA-triggered replacements. Inspect dmesg and journalctl -k for hardware signals (XID, MCE, PCIe AER, EFA driver errors). None → not hardware; failure was application or transient and auto-resume cannot fire.

  • Cluster NodeRecovery is None — 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-resume in srun --help.

  • Concurrent manual Action:Replace racing with the automatic replacement.


Action reason-string validation

HyperPod auto-recovery matches the Slurm node Reason field exactly, case-sensitive:

IntentRequired reason
RebootAction:Reboot
ReplaceAction:Replace

Any mismatch is silently ignored. Common near-misses:

  • action:replace — wrong case

  • Action: Reboot — extra space after colon

  • Action:Reboot⎵ (where ⎵ is whitespace) — trailing whitespace

  • Action:Reboot. — trailing punctuation

  • Reboot / replace this — wrong format

Verify (read-only):

sinfo -o "%N %T %30E" | grep <NODE>
scontrol show node <NODE> | grep -i reason

Canonical 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/shm
Findings → docs
FindingLink
slurmd stopped, logs cleanHyperPod Slurm troubleshooting (Authoritative recovery)
slurmd crashing, munge errorshttps://slurm.schedmd.com/authentication.html
Disk fullHyperPod storage layout (/opt/sagemaker, /opt/dlami/nvme, FSx)
OOM in dmesgRight-size workload — AWS instance-type docs
Kernel panic / recent reboot§ B: Unexpected reboot
GPU XID / ECC errors in dmesghyperpod-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:

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 (squeue returns the same queue).

  • DOWN, DRAINED, DRAINING node states + Reason field.

  • Accounting records (via slurmdbd).

Re-read from slurm.conf on startup:

  • Partition definitions, NodeName definitions, 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=Resources on pending jobs.

  • Stuck COMPLETING tracking.

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 files

If 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-pager

No 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 stats returns Unable to contact slurmdbd or Connection refused.

  • sacct -j <JOBID> returns Sockets disabled or no rows.

  • journalctl -u slurmctld | grep -i dbd shows 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 3306

Common causes:

CauseLink
slurmdbd daemon stopped or crashedhttps://slurm.schedmd.com/accounting.html
MySQL / MariaDB endpoint unreachableRestore SG / VPC route; slurmdbd self-recovers
slurmdbd.conf StoragePass wrong / rotatedhttps://slurm.schedmd.com/slurmdbd.conf.html
Disk full on slurmdbd hostDaemon won't start without log-file write access
Schema migration pending after Slurm upgradehttps://slurm.schedmd.com/upgrades.html

Recovery order:

  1. Restore slurmdbd. Running jobs are unaffected — no time pressure.

  2. Verify with sacctmgr show stats (rollup counters, no errors).

  3. Only then evaluate whether slurmctld itself needs a restart. If slurmctld recovered 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