Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add aws/tools-for-devops-agent --skill aiml-gpu-training-cluster-investigationgit clone --depth 1 https://github.com/aws/tools-for-devops-agentWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/aws/tools-for-devops-agent/aiml-gpu-training-cluster-investigation)<a href="https://agentmods.dev/skills/aws/tools-for-devops-agent/aiml-gpu-training-cluster-investigation"><img src="https://agentmods.dev/badge/skills/aws/tools-for-devops-agent/aiml-gpu-training-cluster-investigation/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/aws/tools-for-devops-agent/aiml-gpu-training-cluster-investigation"><img src="https://agentmods.dev/badge/skills/aws/tools-for-devops-agent/aiml-gpu-training-cluster-investigation.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00236 | $0.05300 |
| Opus 5.5 | $0.00094 | $0.02120 |
| Sonnet 5.5 | $0.00047 | $0.01060 |
| Haiku 4.5 | $0.00024 | $0.00530 |
Grade A, and why
aiml-gpu-training-cluster-investigation scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 10d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 325 lines — stays where its author put it; the contents beside it link to each section on GitHub.
GPU Cluster Evidence, Readiness, and Fault Verdicts
For GPU clusters on SageMaker HyperPod (Slurm or EKS), AWS ParallelCluster, and self-managed EC2 or EKS. Generic investigation finds the obvious signals; this skill adds what it gets wrong: silent evidence, wrong-headline hardware verdicts, and predictable failures before a long run. Read-only. Never reboot, replace, update, or delete anything, and never read training data, checkpoints, or model weights.
Critical rules R1 to R11 (apply in every mode, in this order)
R1. Answer in one pass, and always leave room to answer. In chat, do not stop to ask a
question and do not hand off to a separate investigation before answering. If an input is
missing, use the default (impact window: last 24 hours; run length: evaluate 24, 48, and
72 hours), state the assumption, and mark dependent checks Needs input. For "slow" or
performance questions with no time given, use the last 72 hours. Offer follow-ups only
after the answer.
Budget the evidence gathering so the answer always gets written. An investigation that
runs out of room before it reports is worth nothing to the operator, and it is worse than a
partial answer because it looks like a failure rather than a finding. So: collect the
mandatory evidence for the mode first (R2, R4, R5, and for Mode P the P1 to P6 core), then
write the report. Pick up the optional checks only with what is left. If you notice you are
deep into tool calls and have not yet produced an answer, stop collecting and report what
you have, marking everything unreached as Not checked with the call that would close
it. Never end a turn with evidence gathered and no verdict.
R2. Inventory and capability profile. HyperPod: sagemaker.DescribeCluster and
ListClusterNodes (paginate). Read NodeProvisioningMode from DescribeCluster: if it is
Continuous, also pull sagemaker.ListClusterEvents for the window (see rule R11), which
is the only timeline source that survives broken log delivery. On any other value the call
is unsupported and must be skipped, not retried.
EC2/ParallelCluster/EKS: ec2.DescribeInstances. For every
GPU instance type: ec2.DescribeInstanceTypes (strip HyperPod ml.): GPU count,
EfaSupported, MaximumEfaInterfaces; per EC2 node, attached efa/efa-only interfaces.
Report <attached> of <max>, where attached = interfaces with InterfaceType efa or
efa-only (the primary ENA interface does not count unless it is efa). HyperPod nodes
are not visible to DescribeInstances: say so. On NVSwitch types, search every log source
found under rule R4 for Started "Nvidia Fabric Manager" before saying it is not confirmed.
R3. Node identity survives replacement. A HyperPod reboot keeps the instance ID; a replace
gives the node a new instance ID in the same instance group, so the current ID will
never appear in the replace request. Query CloudTrail by event name, not by instance
ID: cloudtrail.LookupEvents with LookupAttributes=[{AttributeKey: EventName, AttributeValue: BatchReplaceClusterNodes}], then again for BatchRebootClusterNodes,
BatchDeleteClusterNodes, and UpdateCluster, with StartTime = window start minus 6
hours and EndTime = now as full ISO-8601 UTC timestamps, paginating with NextToken.
Keep events whose requestParameters.clusterName is this cluster. A nodeIds entry
that is not in the current ListClusterNodes output was replaced; the instance group
whose node has a LaunchTime just after that event is the replaced group. That operator
or automatic call is the explanation for the node going Pending (Branch E), not hardware.
R4. Find every log source by substring, not prefix. Call logs.DescribeLogGroups with
logGroupNamePattern (case-sensitive substring) = the cluster name, then again for
kernel, messages, syslog, journal, and gpu, paginating with nextToken. Never
search only /aws/parallelcluster or /aws/sagemaker prefixes: customer pipelines use
other names (for example /aws/<pipeline>/<cluster>/kernel). Evaluate every source found.
R5. Prove coverage before any "no errors". For each node and source: find the stream that
carries kernel: lines, then bin that exact stream by hour across the window padded by
one hour. Always name the evidence you used: quote the full log group name and the exact
log stream name for every node in the coverage table, and again in the answer text. A
coverage claim without the group and stream it rests on is not auditable, so the operator
cannot re-run it. Any empty hour means Not observable for that hour. First and last event times
are not proof, and the time of the last kernel: line is not when logging stopped:
a healthy kernel goes quiet. Liveness comes only from the hourly bins of all lines in
that stream. A node is Measured if one source passes. HyperPod: a missing
SagemakerHealthMonitoringAgent/<group>/<instance-id> stream means No HMA detections
when the cluster log group is otherwise live. NCCL transport with no NCCL INFO lines
anywhere is Not observable; never infer it from the instance type.
R5a. Name every resource you looked at, by ID. A finding the operator cannot re-run is
not a finding. Whatever you analysed, put its identifier in the answer: the FSx file system
(fs-...) behind any storage claim, the instance IDs (i-...) behind any node claim, the
cluster name, the capacity reservation (cr-...) behind any capacity claim, and the log
group and stream behind any log claim as R5 already requires. "The file system was
saturated" or "the metrics looked fine" names nothing and cannot be checked. This applies
to the resource you cleared as much as the one you blamed, since ruling something out is
only useful if the reader knows what was ruled out.
R6. Verdict per node, headline to match. REPLACE, REBOOT, LEAVE ALONE, MONITOR, or
NOT OBSERVABLE, against the evidence bar in references/incident-branches.md (Step 4b).
Application-class Xids (for example 13, 31) or HMA reason: XidUserAppError with the node
Running is LEAVE ALONE. Never headline "hardware error" unless the verdict is REPLACE
or REBOOT on hardware grounds.
R7. Label every cause Proven (measured signal on the affected node, before the failure,
nothing competing) or Hypothesis (to validate) with the one confirming measurement. A
spike at the same time is correlation. FSx without a saturated metric is not a proven cause.
Only a Proven cause may be called the root cause, in the headline or in a branch table.
Otherwise write Leading hypothesis: <cause>, or Root cause: Not observable when the
deciding evidence is missing (for example a dead control-plane log). Never write "Proven
mechanism" for something whose trigger or removal path you did not observe.
Utilization metrics from FSx (NetworkThroughputUtilization, DiskIopsUtilization, and
similar) and GPUPowerUtilization are already percent from 0 to 100: a value of 0.9 is
0.9 percent. Quote the raw value with a percent sign.
R8. Recovery questions always state three things: whether automatic node recovery is on
(NodeRecovery), what it does (reboot or replace the node), and that the job resumes
only with checkpoints plus the orchestrator's auto-resume (Slurm on HyperPod:
srun --auto-resume=1).
R9. Capacity Blocks begin terminating instances 30 minutes before the end time (60 for
UltraServers); blocks end at 11:30 UTC and termination starts at 11:00 UTC on the last day.
For a planned run, write out: usable until = end time minus the lead time; run end = start
plus run length; hours covered = usable until minus start. Give every value as a full UTC
date and time, and check the latest safe start is not already in the past.
R10. Rule out the frequent non-GPU causes in references/cluster-edge-cases.md before
blaming hardware: subnet IP or network interface exhaustion, ParallelCluster bootstrap
failures and protected mode, EFA nodes in a public subnet, a Capacity Block not yet
active, and the FSx maintenance window. HyperPod does not export system metrics to
CloudWatch, so HyperPod GPU activity is Not observable there.
R11. When the logs are dead, ask the control plane. On a HyperPod cluster with
NodeProvisioningMode = Continuous, sagemaker.ListClusterEvents gives you a node and
cluster timeline that owes nothing to a log agent, so it keeps answering when a stream has
gone silent or a node has disappeared. Filter the window with EventTimeAfter and
EventTimeBefore, narrow with NodeId or InstanceGroupName, sort with
SortBy=EventTime, and page through NextToken. Where a Description is not
self-explanatory, DescribeClusterEvent has the detail. Note that the response has no
severity or level field at all, so any grouping you apply is your own and should be
described that way. If NodeProvisioningMode is anything other than Continuous the call
is not supported; write ListClusterEvents not supported in the coverage table and carry
on. What you must not do is report a dead log as "no events" without either trying this
source or saying it was unavailable.
What ships with it
60 files beside SKILL.md in the same directory: the scripts, references and assets a skill reads on demand. Not counted in the per-session cost; read them before you install if any of them is executable.
- .skilleval.yaml 77 B
- CHANGELOG.md 8.5 KB
- evals/best-practices/v10/benchmark.json 6.2 KB
- evals/best-practices/v10/iteration-1/best-practices-tests-results.json 11 KB
- evals/best-practices/v10/iteration-2/best-practices-tests-results.json 10 KB
- evals/best-practices/v10/iteration-3/best-practices-tests-results.json 10 KB
- evals/evals.json 11 KB
- evals/functional/v5/_metadata.json 24 KB
- evals/functional/v5/benchmark.json 107 KB
- evals/functional/v5/evals.json 11 KB
- evals/functional/v5/iteration-1/capacity-block-expiry/with_skill/functional-tests-results.json 808 B
- evals/functional/v5/iteration-1/capacity-block-expiry/with_skill/outputs/journal_records.json 175 KB
- evals/functional/v5/iteration-1/capacity-block-expiry/without_skill/functional-tests-results.json 566 B
- evals/functional/v5/iteration-1/capacity-block-expiry/without_skill/outputs/journal_records.json 5.9 KB
- evals/functional/v5/iteration-1/control-plane-log-dead/with_skill/functional-tests-results.json 2.5 KB
- evals/functional/v5/iteration-1/control-plane-log-dead/with_skill/outputs/journal_records.json 295 KB
- evals/functional/v5/iteration-1/control-plane-log-dead/without_skill/functional-tests-results.json 567 B
- evals/functional/v5/iteration-1/control-plane-log-dead/without_skill/outputs/journal_records.json 6.1 KB
- evals/functional/v5/iteration-1/fsx-training-slowdown-cause/with_skill/functional-tests-results.json 7.0 KB
- evals/functional/v5/iteration-1/fsx-training-slowdown-cause/with_skill/outputs/journal_records.json 1586 KB
- evals/functional/v5/iteration-1/fsx-training-slowdown-cause/without_skill/functional-tests-results.json 7.5 KB
- evals/functional/v5/iteration-1/fsx-training-slowdown-cause/without_skill/outputs/journal_records.json 1681 KB
- evals/functional/v5/iteration-1/gpu-log-coverage-audit/with_skill/functional-tests-results.json 6.1 KB
- evals/functional/v5/iteration-1/gpu-log-coverage-audit/with_skill/outputs/journal_records.json 200 KB
- evals/functional/v5/iteration-1/gpu-log-coverage-audit/without_skill/functional-tests-results.json 7.3 KB
- evals/functional/v5/iteration-1/gpu-log-coverage-audit/without_skill/outputs/journal_records.json 74 KB
- evals/functional/v5/iteration-1/hyperpod-application-xid-verdict/with_skill/functional-tests-results.json 7.1 KB
- evals/functional/v5/iteration-1/hyperpod-application-xid-verdict/with_skill/outputs/journal_records.json 50 KB
- evals/functional/v5/iteration-1/hyperpod-application-xid-verdict/without_skill/functional-tests-results.json 7.2 KB
- evals/functional/v5/iteration-1/hyperpod-application-xid-verdict/without_skill/outputs/journal_records.json 49 KB
- evals/functional/v5/iteration-1/negative-bedrock-throttling/with_skill/functional-tests-results.json 454 B
- evals/functional/v5/iteration-1/negative-bedrock-throttling/with_skill/outputs/journal_records.json 17 KB
- evals/functional/v5/iteration-1/negative-load-balancer-choice/with_skill/functional-tests-results.json 456 B
- evals/functional/v5/iteration-1/negative-load-balancer-choice/with_skill/outputs/journal_records.json 5.2 KB
- evals/functional/v5/iteration-1/preflight-long-run-readiness/with_skill/functional-tests-results.json 6.3 KB
- evals/functional/v5/iteration-1/preflight-long-run-readiness/with_skill/outputs/journal_records.json 163 KB
- evals/functional/v5/iteration-1/preflight-long-run-readiness/without_skill/functional-tests-results.json 7.8 KB
- evals/functional/v5/iteration-1/preflight-long-run-readiness/without_skill/outputs/journal_records.json 57 KB
- evals/functional/v5/iteration-1/xid-48-reboot-first/with_skill/functional-tests-results.json 1.9 KB
- evals/functional/v5/iteration-1/xid-48-reboot-first/with_skill/outputs/journal_records.json 121 KB
- evals/functional/v5/iteration-1/xid-48-reboot-first/without_skill/functional-tests-results.json 1.6 KB
- evals/functional/v5/iteration-1/xid-48-reboot-first/without_skill/outputs/journal_records.json 33 KB
- evals/functional/v5/iteration-2/capacity-block-expiry/with_skill/functional-tests-results.json 1.8 KB
- evals/functional/v5/iteration-2/capacity-block-expiry/with_skill/outputs/journal_records.json 206 KB
- evals/functional/v5/iteration-2/capacity-block-expiry/without_skill/functional-tests-results.json 566 B
- evals/functional/v5/iteration-2/capacity-block-expiry/without_skill/outputs/journal_records.json 6.0 KB
- evals/functional/v5/iteration-2/control-plane-log-dead/with_skill/functional-tests-results.json 2.4 KB
- evals/functional/v5/iteration-2/control-plane-log-dead/with_skill/outputs/journal_records.json 199 KB
- evals/functional/v5/iteration-2/control-plane-log-dead/without_skill/functional-tests-results.json 567 B
- evals/functional/v5/iteration-2/control-plane-log-dead/without_skill/outputs/journal_records.json 3.1 KB
- evals/functional/v5/iteration-2/fsx-training-slowdown-cause/with_skill/functional-tests-results.json 9.7 KB
- evals/functional/v5/iteration-2/fsx-training-slowdown-cause/with_skill/outputs/journal_records.json 1530 KB
- evals/functional/v5/iteration-2/fsx-training-slowdown-cause/without_skill/functional-tests-results.json 8.5 KB
- evals/functional/v5/iteration-2/fsx-training-slowdown-cause/without_skill/outputs/journal_records.json 1477 KB
- evals/functional/v5/iteration-2/gpu-log-coverage-audit/with_skill/functional-tests-results.json 3.2 KB
- evals/functional/v5/iteration-2/gpu-log-coverage-audit/with_skill/outputs/journal_records.json 217 KB
- evals/functional/v5/iteration-2/gpu-log-coverage-audit/without_skill/functional-tests-results.json 7.5 KB
- evals/functional/v5/iteration-2/gpu-log-coverage-audit/without_skill/outputs/journal_records.json 95 KB
- evals/functional/v5/iteration-2/hyperpod-application-xid-verdict/with_skill/functional-tests-results.json 6.4 KB
- evals/functional/v5/iteration-2/hyperpod-application-xid-verdict/with_skill/outputs/journal_records.json 215 KB
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 10d ago First seen · 325 lines · 236 tokens per session scan A 2c6551e1648f
aiml-gpu-training-cluster-investigation is a skill published in the GitHub repository aws/tools-for-devops-agent (107 stars, last pushed today), licensed Apache-2.0. It adds 236 tokens to every session and 5,300 once invoked, about $0.0009 per session on Opus 5.5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-10-06.
Other skills, from other repositories
model-deployment
Generates code that deploys fine-tuned models from SageMaker Serverless Model Customization to SageMaker endpoints or Bedrock. Use when the user says "deploy my model", "create an endpoint", "make it available", or asks about deployment options. Identifies the correct deployment pathway (Nova vs OSS), generates…
azure-storage-file-datalake-py
Azure Data Lake Storage Gen2 SDK for Python. Use for hierarchical file systems, big data analytics, and file/directory operations. Triggers: "data lake", "DataLakeServiceClient", "FileSystemClient", "ADLS Gen2", "hierarchical namespace".
airunway-aks-setup
Set up AI Runway on AKS — from bare cluster to running model. Covers cluster verification, controller install, GPU assessment, provider setup, and first deployment. WHEN: "setup AI Runway", "onboard AKS cluster", "install AI Runway", "airunway setup", "deploy model to AKS", "GPU inference on AKS", "KAITO setup on…
amplify-workflow
Build and deploy full-stack web and mobile apps with AWS Amplify Gen2 (TypeScript code-first). Covers auth (Cognito), data (AppSync/DynamoDB including schema modeling, enum types, relationships, authorization rules), storage (S3), functions, APIs, and AI (Amplify AI Kit with Bedrock). Supports React, Next.js, Vue…
dataset-transformation
Generates code that transforms datasets between ML schemas for model training or evaluation. Use when the user says "transform", "convert", "reformat", "change the format", or when a dataset's schema needs to change to match the target format — always use this skill for format changes rather than writing inline…
hyperpod-cluster-debugger
Diagnose and remediate cluster-wide HyperPod (EKS or Slurm) problems — creation / deployment failures (CloudFormation, EFA health check, lifecycle scripts, capacity), EKS access, node replacement, CloudFormation nested-stack errors, post-maintenance rollback state, dangling nodes, autoscaler conflicts. Includes…