Skip to main content
skill CX Codex

dynamo-troubleshoot — Claude Code skill: diagnose Dynamo failures

Sorts a broken Dynamo deployment into one problem class and hands you the next command. Useful when pods, PVCs or benchmark jobs stall.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add NVIDIA/skills --skill dynamo-troubleshoot -a claude-code
Open on GitHub

What dynamo-troubleshoot does

The skill works top down and gathers read-only evidence at every step. It starts with scripts/collect_dynamo_debug_bundle.py --namespace, and you can add --deployment-name when you already know which deployment is failing. Secrets are never collected and Hugging Face tokens are never printed.

From there the failure lands in one primary bucket: cluster, namespace and secret, model cache and PVC, image pull, GPU scheduling, DynamoGraphDeployment reconciliation, frontend and router, worker, endpoint, or benchmark job. The check order is fixed. Namespace and storage class first, then the PVC and model-download job, then DynamoGraphDeployment status and events, pod status with describe pod and logs, the frontend service, /v1/models, /v1/chat/completions, and the benchmark job only after the endpoint smoke test passes.

Fixes go in one layer at a time, smallest reversible change first. The skill is read-only: it returns remediation commands and patches instead of running them. You need Python 3.10+ and kubectl with read access to pods, events, jobs, PVCs and DynamoGraphDeployment — no secret access. If kubectl returns Forbidden on events or pods, the service account is missing read RBAC, and that is the first thing to check. Disagg transport is out of scope here; dynamo-interconnect-check covers it.

What it helps with

  • figure out why worker pods hit CrashLoopBackOff
  • trace a model-download job stuck in Pending
  • debug a PVC that never bound to its storage class
  • read DynamoGraphDeployment status and events
  • smoke-test the endpoint before running a benchmark

Example prompts for the agent

  • Collect a debug bundle for namespace dynamo-demo and tell me what broke
  • Why are the worker pods in CrashLoopBackOff? Check logs and GPU scheduling
  • The model-download job is stuck in Pending — look at the PVC and the Hugging Face secret

How to install dynamo-troubleshoot

1Skills CLI (Vercel)

npx skills add NVIDIA/skills --skill dynamo-troubleshoot -a claude-code

2Manually: put the files in place

~/.claude/skills/dynamo-troubleshoot/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/dynamo-troubleshoot/

Step by step, with commands for each platform: How to install skills in Claude Code: five ways

Questions about dynamo-troubleshoot

How do I install dynamo-troubleshoot in Claude?

Run npx skills add NVIDIA/skills --skill dynamo-troubleshoot -a claude-code. The skill lands in ~/.claude/skills/dynamo-troubleshoot/SKILL.md.

What does dynamo-troubleshoot do?

It collects a read-only debug bundle, classifies the Dynamo failure into one bucket, and returns the likely cause with the exact next command or patch.

What do I need to run it?

Python 3.10+ on the operator machine and kubectl with read access to the target namespace: pods, events, jobs, PVCs and DynamoGraphDeployment. Secret access is not required.

Source text

SKILL.md · Apache-2.0
---
name: dynamo-troubleshoot
description: Diagnose failed or unhealthy Dynamo deployments. Use when pods, model-cache jobs, PVCs, workers, frontend/router health, endpoints, or benchmark jobs fail; use recipe-runner/router-starter before this for normal bring-up.
license: Apache-2.0
metadata:
  author: Dan Gil <[email protected]>
  tags:
    - dynamo
    - kubernetes
    - troubleshooting
    - day-2
---

# Dynamo Troubleshoot

<!--
SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
SPDX-License-Identifier: CC-BY-4.0
-->

## Purpose

Turn a Dynamo failure into a clear problem class, strongest signal, and next
action. Start with read-only evidence, avoid secrets, and fix one layer at a
time.

## Prerequisites

- Python 3.10+ on the operator machine.
- `kubectl` configured with read access to the target namespace.
- Permission to read pods, events, jobs, PVCs, and `DynamoGraphDeployment` resources (NOT secrets).
- Network reachability to the cluster API server.

## Instructions

### 1. Collect A Read-Only Bundle

Run:

```bash
python3 scripts/collect_dynamo_debug_bundle.py \
  --namespace "${NAMESPACE}"
```

If the user names a deployment, include it:

```bash
python3 scripts/collect_dynamo_debug_bundle.py \
  --namespace "${NAMESPACE}" \
  --deployment-name <deployment-name>
```

Do not collect Kubernetes secrets. Do not print Hugging Face tokens.

### 2. Classify The Failure

Use `references/failure-decision-tree.md` and classify into one primary bucket:

- cluster/platform
- namespace/secret
- model cache/PVC/download
- image pull/runtime image
- GPU scheduling/resources
- operator/DynamoGraphDeployment reconciliation
- frontend/router
- worker/backend
- endpoint/API
- benchmark/perf job

### 3. Debug Top Down

Check in this order:

1. namespace, storage class, GPU nodes, and HF secret existence
2. PVC and model-download job
3. `DynamoGraphDeployment` status and events
4. pod status, `describe pod`, and container logs
5. frontend service and port-forward
6. `/v1/models`
7. `/v1/chat/completions`
8. benchmark job only after endpoint smoke test passes

### 4. Fix One Layer At A Time

Prefer the smallest reversible change:

- create missing namespace or HF secret
- patch `storageClassName`
- patch image tag or image pull secret
- reduce GPU request only if the recipe can still be valid
- switch KV router to approximate mode only if workers do not publish events
- restart failed jobs after fixing the underlying config

After each fix, rerun the relevant readiness check before moving deeper.

## Available Scripts

| Script | Purpose | Arguments |
|---|---|---|
| `scripts/collect_dynamo_debug_bundle.py` | Collect a read-only debug bundle (pods, events, jobs, PVCs, CR status) | `--namespace`, `--deployment-name`, `--output-dir` |

Invoke via the agentskills.io `run_script()` protocol:

```python
run_script("scripts/collect_dynamo_debug_bundle.py", args=["--namespace", "dynamo-demo"])
```

## Examples

Collect everything in a namespace for triage:

```bash
python3 scripts/collect_dynamo_debug_bundle.py --namespace dynamo-demo
```

Scope to a single failing deployment:

```bash
python3 scripts/collect_dynamo_debug_bundle.py \
  --namespace dynamo-demo \
  --deployment-name qwen-vllm-disagg
```

Equivalent through the agent protocol:

```python
run_script("scripts/collect_dynamo_debug_bundle.py", args=["--namespace", "dynamo-demo", "--deployment-name", "qwen-vllm-disagg"])
```

## Output Contract

Return:

- problem class
- evidence checked
- strongest signal
- likely cause
- exact next command or patch
- what was ruled out
- whether it is safe to continue deployment or benchmarking

## Limitations

- Read-only. Never mutates the cluster; remediation commands are returned, not executed.
- Will not collect secrets or print Hugging Face tokens; some failure modes (auth) may need user-side inspection.
- Bundle size grows with deployment size; on very large namespaces, scope with `--deployment-name`.
- Does not validate disagg transport — use `dynamo-interconnect-check` for that.

## Troubleshooting

| Symptom | Likely cause | Next step |
|---|---|---|
| `kubectl` returns Forbidden on events/pods | Service account lacks read RBAC | Ask operator for read-only role binding on the namespace |
| Bundle missing `DynamoGraphDeployment` status | Operator not installed or different namespace | Verify `dynamo-platform` operator is installed and watching the namespace |
| Model-download job in `Pending` | PVC unbound or HF secret missing | Fix PVC binding or create the named HF secret, then rerun the job |
| Worker pods `CrashLoopBackOff` | Image/runtime mismatch or GPU not available | Inspect container logs; check `nvidia.com/gpu` allocatable on nodes |

## Benchmark

See `BENCHMARK.md` for the NVCARPS-EVAL performance report (auto-generated by the NVSkills CI pipeline). To refresh, re-run `/nvskills-ci` on an upstream PR touching this skill.

## References

- Read `references/failure-decision-tree.md` for bucket-specific checks.
- Use `scripts/collect_dynamo_debug_bundle.py` for read-only bundle collection.

© Dan Gil · Apache-2.0 · NVIDIA/skills

Similar skills

Everything for DevOps and infrastructure →

From the same set178

nemo-rl-session-memory Keeps a durable, human-readable record of a working session under session/, so another agent can resume after a disconnect or a VS Code restart. CX Codex +1 2,000installs nemotron-speech A skill that walks your agent through NVIDIA Nemotron Speech (formerly Riva) NIM work: deploying, running and testing ASR, TTS and NMT in the cloud or self-hosted. CX Codex +1 2,000installs physical-ai-defect-image-generation Prepares automated defect synthesis pipelines for optical quality inspection. Helps construct training sets for electronic boards, metal, and glass using Cosmos vision models. CX Codex +1 2,000installs physical-ai-video-data-augmentation Runs the video augmentation and auto-labeling loop on OSMO, from picking a flow and preflight checks to monitoring and pulling outputs. CX Codex +1 2,000installs nemo-mbridge-recipe-recommender A skill that picks a starting Megatron Bridge recipe for your model, GPU count and training goal, then helps you resize parallelism. CX Codex +1 1,900installs launch-nemo-rl Playbook for launching, inspecting, and debugging NeMo-RL recipes on Kubernetes using the nrl-k8s CLI. CX Codex +1 1,900installs nemo-mbridge-perf-memory-tuning Helps diagnose GPU OOM failures in Megatron Bridge training and choose settings that reduce peak memory use. CX Codex +1 1,900installs nemo-rl-auto-research Automates hypothesis testing and training loops in NeMo-RL and NeMo-gym. Keeps experiments tracked through dedicated git branches and TSV logs. CX Codex +1 1,900installs

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor