Best for
- A training run fails to start, with an import error or a
- A run OOMs while nvidia-smi still shows headroom.
- Throughput degrades partway through a run that started fine.
wshobson/agents/plugins/dgx-spark-ops/skills/spark-training-gotchas/SKILL.md
Preflight and diagnose the ten known failure modes for ML training on NVIDIA DGX Spark. Use when a training run on DGX Spark fails to start, OOMs below the 128GB limit, slows down mid-run, or before any multi-hour training job on GB10.
Decision brief
DGX Spark's GB10 chip (Grace Blackwell, SM121, 128GB unified memory, aarch64) has ten recurring failure modes across launch, memory, thermals, bandwidth, and precision. Each is named G1–G10 so it can be checked by number — the numbering is load-bearing for tooling that runs thes…
Compatibility matrix
| Platform | Status | Evidence | What to check |
|---|---|---|---|
| Codex | Not declared | No explicit evidence | Portability before use |
| Claude Code | Not declared | No explicit evidence | Portability before use |
| Cursor | Not declared | No explicit evidence | Portability before use |
| Gemini CLI | Not declared | No explicit evidence | Portability before use |
Installation
The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.
npx skills add https://github.com/wshobson/agents --skill "plugins/dgx-spark-ops/skills/spark-training-gotchas"Inspect the Agent Skill "spark-training-gotchas" from https://github.com/wshobson/agents/blob/c4b82b0ad771190355eb8e204b1329732a18449a/plugins/dgx-spark-ops/skills/spark-training-gotchas/SKILL.md at commit c4b82b0ad771190355eb8e204b1329732a18449a. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.
Workflow
A training run fails to start, with an import error or a
Review the “Common Issues Quick Reference” section in the pinned source before continuing.
SYMPTOM: ImportError: undefined symbol naming a CUDA
SYMPTOM: ImportError: undefined symbol naming a CUDA
SYMPTOM: pip install flash-attn still fails/hangs.
Permission review
The documentation asks the agent to run terminal commands or scripts.
python3 -c "import torch; print(torch.version.cuda)" # expect 13.x (G1); NGC builds have no +cu130 tag — that's not a failureEvidence record
| Signal | Value | Evidence type | Meaning |
|---|---|---|---|
| Quality score | 72/100 | Computed | Documentation, specificity, maintenance, and trust rules |
| Repository stars | 38,313 | Source | Repository attention, not individual Skill quality |
| Compatibility | 0 platforms | Source | Declared in the catalog source record |
| Usage guide | automated source guide | Editorial | Generated or reviewed according to the visible evidence level |
Pinned source
DGX Spark's GB10 chip (Grace Blackwell, SM121, 128GB unified memory, aarch64) has ten recurring failure modes across launch, memory, thermals, bandwidth, and precision. Each is named G1–G10 so it can be checked by number — the numbering is load-bearing for tooling that runs these checks. Read this before a long run, not after hour six.
nvidia-smi still shows headroom.| # | Symptom | Fix |
|---|---|---|
| G1 | undefined symbol / segfault | cu130 wheel or container |
| G2 | flash-attn wrong backend used | skip pip build; monkeypatch on NGC |
| G3 | OOM despite headroom | drop page cache |
| G4 | throughput drop / reboot | expect ~100W sustained cap |
| G5 | memory-bound step slow | budget 180–192 GB/s |
| G6 | cache evicted mid-run | one GPU server at a time |
| G7 | NVFP4 slower than FP8 | stay FP8 unless sm_121a |
| G8 | playbook fails outright | check upstream issues |
| G9 | env breaks after install | use a container |
| G10 | 2-Spark TP hangs | DDP/FSDP only, never TP |
ImportError: undefined symbol naming a CUDA
function, or a segfault on the first .cuda() call.libcudart.so.12; Spark
ships CUDA 13. pip never checks CUDA ABI, so it surfaces
only at import or first kernel launch.references/gotcha-checks.md G1 — the wheel's
CUDA build tag.download.pytorch.org/whl/cu130 or
use a matched container.pip install flash-attn still fails/hangs.
Unsloth may also silently train flash-attn over an
explicitly requested SDPA.attn_implementation="sdpa".references/gotcha-checks.md G2 — is flash-attn
already present and working.references/gotcha-checks.md G2.nvidia-smi still reports free memory under the 128GB cap
— or, on some setups, [N/A] outright instead of a number.references/gotcha-checks.md G3 — read free -g
and /proc/meminfo, not nvidia-smi.sync; echo 3 > /proc/sys/vm/drop_caches — needs root, a
between-run reset, not a mid-training step.references/gotcha-checks.md G4 — sample
nvidia-smi --query-gpu=temperature.gpu,power.draw.references/gotcha-checks.md G5 — observed step
time vs. the measured range, not spec.gpu-memory-utilization<=0.5.references/gotcha-checks.md
G6 — other GPU-resident
processes and whether
capped.cvt.e2m1x2 unless kernels target
sm_121a; NVFP4 runs ~32% slower without it.references/gotcha-checks.md G7 — capability
reports (12, 1); does the build target sm_121a?sm_121a.references/gotcha-checks.md G8 — the playbook
repo's recent issues.github.com/NVIDIA/dgx-spark-playbooks issues
before trusting a recipe for an expensive run.pip install, or two "identical"
environments behave differently.references/gotcha-checks.md
G9 — container or bare pip?spark-environment-setup
for tag guidance) or Unsloth's container. If bare pip is
unavoidable, follow the NVIDIA install order, including
--no-deps on Unsloth.references/gotcha-checks.md G10 — the
configured parallelism strategy.The cheapest checks to run before anything else:
python3 -c "import torch; print(torch.version.cuda)" # expect 13.x (G1); NGC builds have no +cu130 tag — that's not a failure
import torch; print(torch.cuda.get_device_capability()) # expect (12, 1) (G7)
{ [ -f /.dockerenv -o -f /run/.containerenv ] || grep -qE 'docker|containerd' /proc/1/cgroup; } 2>/dev/null && echo container || echo unknown # G9
assets/preflight.sh runs G1, G3, G4, G7, G9 and produces one
output line per gotcha in a fixed format: G-number first, then
PASS/FAIL/WARN where automatable, SKIP when unavailable, or
INFO: for a raw reading (G3, G4). Full commands:
references/gotcha-checks.md. See also
spark-environment-setup for the environment assumed working.