agentsclimarketplace

Install zymtrace profiler

Skill zystem-io/zymtrace-skills/zymtrace/skills/install-zymtrace-profiler

Use when installing the zymtrace profiler agent on Kubernetes (Helm DaemonSet), Docker, or as a binary with systemd. Covers CPU-only profiling, CUDA GPU profiling (CUDA 12.x or higher required; CUDA 11.x and below not supported), GPU metrics (utilization, memory, temperature, SM efficiency, Tensor Core, PCIe), framework-specific metrics (vLLM, SGLang, NVIDIA Dynamo-Triton), and air-gapped installs via a custom image registry. Connects the agent to an existing backend gateway. Trigger phrases: "install profiler", "install zymtrace profiler", "install zymtrace agent", "deploy the profiler", "deploy zymtrace DaemonSet", "set up GPU profiling", "set up CUDA profiling", "profile my GPU workloads", "install profiler on EKS / GKE / Slurm / bare-metal", "install profiler on every node", "start collecting profiles".From its SKILL.md

Install
npx -y skills add zystem-io/zymtrace-skills --skill install-zymtrace-profiler

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

2 things to look at

  • 5 stars5 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
  • runs commandsInstructs the agent to run 8 commands, including `helm version --short && kubectl version --client` and 7 more.

SKILL.md

16.0 KB, ~3.9k tokens by cl100k_base, as published. Nobody here has run it

Install zymtrace Profiler

Helps the user install the zymtrace profiler agent β€” the low-overhead eBPF + CUDA profiler that runs on every node and ships profiles to the backend gateway.

The backend must be installed first (install-zymtrace-backend skill). Profiler agents have nowhere to send profiles otherwise.

Deep details (NVML library paths, PC sampling, env var reference, air-gapped image mirroring, framework metrics) live in ${CLAUDE_PLUGIN_ROOT}/skills/install-zymtrace-profiler/reference.md.

Greet the user (start here)

Open with a short welcome before any commands or questions:

πŸ‘‹ Thanks for installing the zymtrace profiler! It's a low-overhead agent (<1% CPU, ~256 MB RAM) that ships profiles to your backend.

Stuck? Reach out:

Tip β€” analyze GPU and CPU flamegraphs via MCP: once profiles start flowing, connect the zymtrace MCP to your agent (Claude Code, Codex, or Cursor) β€” see configure-zymtrace-mcp β€” and analyze GPU + CPU flamegraphs in natural language. Docs: https://docs.zymtrace.com/mcp

Here's the plan:

  1. Verify your tools and locate the backend gateway.
  2. Decide CPU-only vs CUDA (GPU) profiling.
  3. Install the DaemonSet (or Docker / binary).
  4. Verify the agent is reporting.

Ready when you are.

If the user has already specified Helm / GPU / target, skip the roadmap and dive in.

Sources of truth

Pre-flight: verify the tools

Claude runs
helm version --short && kubectl version --client
kubectl cluster-info | head -2
helm list -A | grep -i zymtrace      # locate the backend release

If helm/kubectl are missing β†’ point to install docs; do not install them. If no backend release is found anywhere β†’ STOP and route to install-zymtrace-backend first; the profiler has nowhere to send data without it.

Pre-resolve what you can

Recommend defaults zymtrace / profiler for namespace + release name. Full policy: shared/conventions.md.

VariableResolve by
Backend release & its namespacehelm list -A | grep -i 'backend.*zymtrace'
Backend gateway service FQDN<PREFIX>-gateway.<backend-NS>.svc.cluster.local:80 (in-cluster) or external ingress host
GPU nodes present?kubectl get nodes -l nvidia.com/gpu=true 2>/dev/null | wc -l
NVIDIA device plugin / GPU operator?kubectl get pods -A | grep -E 'nvidia-device-plugin|gpu-operator'
CUDA runtime β‰₯ 12.x? (required for GPU profiling)kubectl get nodes -o jsonpath='{range .items[*]}{.metadata.labels.nvidia\.com/cuda\.runtime-version\.major}{"\n"}{end}' | sort -u β€” must be 12 or higher. If labels are missing, kubectl exec into an existing GPU pod and run nvidia-smi, or ask the user to run nvidia-smi on a GPU node themselves and report back (the skill usually can't SSH into the node).
Existing profiler release?helm list -A | grep -i 'profiler.*zymtrace'
Customer-provided values file?Ask β€” same rule as backend skills. Filename respected.

Things you must ask:

  • CPU-only or GPU (CUDA) profiling?
  • Backend gateway endpoint (in-cluster vs external).

Blockers vs recommendations (don't conflate)

Blockers (stop, surface):

  • Backend gateway endpoint unreachable from where the agent will run.
  • GPU profiling requested with CUDA < 12.x β€” unsupported; offer CPU-only profiling instead or have the user upgrade CUDA first.

Recommendations (note, proceed):

  • NVIDIA driver / device plugin missing on GPU nodes β€” CPU profiling still works, GPU profiling won't until the driver is installed.
  • PC sampling disabled (default) β€” useful for production; explicitly enabled only when the user asks (requires CAP_SYS_ADMIN, see reference.md Β§ PC sampling).

Decision tree

1. Install method

MethodWhen
Helm DaemonSet (recommended)Kubernetes β€” gives you the full chart with GPU support and framework metrics.
kubectl manifestKubernetes without Helm. CPU-only is fine; GPU profiling has fewer config knobs.
DockerSingle host (non-k8s) β€” same VM the workload runs on.
Binary + systemdBare-metal Linux (Slurm nodes, on-prem GPU servers).

2. CPU or GPU?

ProfilingTemplateWhat it gives you
CPU onlyvalues/helm-cpu.yamleBPF unwinder for native, Python, Go, Java, Node. No CUDA libraries.
GPU (CUDA)values/helm-gpu.yamlAbove + CUDA kernel profiling + GPU metrics + vLLM/SGLang/Triton metrics. Same template works for MIG slices and dense multi-GPU nodes.

GPU profiling requires CUDA 12.x or higher. Older CUDA runtimes are not supported. If the customer's nodes are on CUDA 11.x, GPU profiling is a blocker β€” recommend CPU-only profiling until they upgrade the CUDA toolkit / driver. Architecture: AMD64/x86_64 and ARM64 are both supported.

If GPU nodes exist on the cluster (nvidia.com/gpu=true label) and CUDA β‰₯ 12.x, default-recommend GPU profiling. The agent works on CPU nodes too β€” cudaProfiler.enabled: true is a no-op when there's no NVIDIA driver.

3. Backend gateway endpoint

Where does the agent send profiles? The format is always <host-or-ip>:<port> β€” never a URL with https:// in front. TLS is controlled by the -disable-tls flag, not by the URL scheme.

SetupSet -collection-agent to
Same cluster as backend (default in templates)<PREFIX>-gateway.<backend-NS>.svc.cluster.local:80 + -disable-tls
Different cluster, backend has TLS ingress<gateway-host>:443 β€” remove -disable-tls
Different cluster, NodePort<any-node-ip>:<nodeport> + -disable-tls

Resolve <PREFIX> and <backend-NS> from the backend release: helm list -A | grep -i 'backend.*zymtrace'.

4. Air-gapped / private registry

If mentioned, mirror ghcr.io/zystem-io/zymtrace-pub-profiler:<VERSION> into the customer's registry and set:

global:
  imageRegistry: "<your-registry>"
  registry:
    requirePullSecret: true   # only if registry needs auth

Full procedure: reference.md Β§ Air-gapped install.


Kubernetes install (Helm β€” recommended)

Pre-flight: verify the tools (see Pre-flight above)

Step 1: Add the Helm repo

Claude runs
helm repo add zymtrace https://helm.zystem.io   # idempotent if already added
helm repo update zymtrace
helm search repo zymtrace/profiler --versions | head -5

Version to install. helm search (above) is the source of truth for available chart versions β€” install the newest it lists unless the user pins one. If it returns nothing (repo just added and the cache is stale, or air-gapped), fall back to the changelog at https://docs.zymtrace.com/changelog β€” the top entry is the latest release. Keep the profiler on the same version as the backend. Tell the user which version you're installing before Step 3.

Step 2: Generate the canonical values file

Copy the matching template from values/ to zymtrace-profiler-values.yaml in the user's working directory. Don't ask the customer if they already have one β€” customers typically don't ship with a profiler values file (the backend often does, the profiler rarely does). Only respect a different filename if they explicitly volunteer that they have one (per shared/conventions.md).

Pick the template that fits and edit:

  • profiler.args[0] -collection-agent=... to the backend gateway endpoint.
  • Remove -disable-tls if pointing at an HTTPS endpoint.
  • For GPU: confirm nodeSelector: nvidia.com/gpu: "true" matches your cluster's GPU label.

Step 3: Confirm with the user before running

Print the exact command + resolved values (release name, namespace, target backend gateway, GPU yes/no, image tag if pinned). Wait for explicit confirmation.

Step 4: Install

Claude runs
helm upgrade --install <REL> zymtrace/profiler \
  --namespace <NS> --create-namespace \
  -f <values-file> \
  --reset-then-reuse-values \
  --atomic --debug

Default <REL> = profiler, <NS> = zymtrace (same namespace as backend works fine β€” no conflict).

ERROR: daemonset.apps/zymtrace-profiler is not ready: pods are not ready β†’ expected for ~30s while pods start. Wait. If it persists past 2 min, kubectl describe ds -n <NS> <PREFIX>-profiler.

ERROR: ImagePullBackOff β†’ registry / version mismatch. Verify image tag at https://github.com/orgs/zystem-io/packages.

ERROR: pod CrashLoopBackOff with permission denied on /sys/kernel/debug β†’ kernel doesn't support eBPF or the security context is being stripped. kubectl describe pod to confirm, and check securityContext.capabilities.add: [SYS_ADMIN] is honored.

Step 5: Verify

Claude runs
bash ${CLAUDE_PLUGIN_ROOT}/skills/install-zymtrace-profiler/scripts/verify-profiler.sh <NS> <REL>

Checks DaemonSet readiness, license validity in logs, GPU library extraction (if cudaProfiler.enabled), and connection-to-gateway evidence (no connection refused or dns lookup failed in last 50 log lines).

Step 6: Persist the canonical values file

Claude runs
helm get values <REL> -n <NS> > <values-file>

Recommend the customer commit the file: git add <values-file> && git commit -m "zymtrace: profiler install for <NS>/<REL>".

Step 7: Hand off to GPU workload setup (GPU installs only)

If GPU profiling was enabled, the agent is running but no workload is being profiled yet β€” workloads need to set CUDA_INJECTION64_PATH. The pattern is one env var; the variation is where you set it (Slurm prolog, k8s pod spec, Docker -e, ~/.bashrc).

Point the user at reference.md Β§ Profiling real workloads β€” it covers:

  • Training jobs (PyTorch / DDP / FSDP / DeepSpeed / Megatron) β€” set-and-forget env var, with bare-metal/Slurm and Kubernetes examples.
  • Inference servers (vLLM / SGLang / Triton / TGI) β€” same env var plus framework-specific tunables (hostIPC, --shm-size, VLLM_ATTENTION_BACKEND), with concrete Docker and Kubernetes manifests.

Authoritative docs: https://docs.zymtrace.com/install/profiler/cuda-gpu-profiler and https://docs.zymtrace.com/install/profiler/gpu-profiler-quick-start.

CPU-only installs are done at this point β€” profiles for every process on every node start flowing within ~30 seconds.


Other install methods

For kubectl manifest, Docker, or binary+systemd installs, see reference.md Β§ Other install methods. The same pre-flight rules apply; only Step 4 (install) differs.


Done

Exit when ALL of the following are true (substitute <NS> / <REL> / <PREFIX>):

  • helm status <REL> -n <NS> reports STATUS: deployed.
  • DaemonSet <PREFIX>-profiler has DESIRED == READY (kubectl get ds -n <NS>).
  • At least one pod has logged Your license is valid until … OR streaming connection established (means the agent reached the backend).
  • No connection refused, dns lookup failed, or forbidden in the last 50 log lines of any pod.
  • For GPU installs: ls -la /var/lib/zymtrace/profiler on a GPU node shows libzymtracecudaprofiler.so (the agent extracted it for workload mounts).

If any box fails, route by symptom:

Both have first-pass diagnostic scripts to run before going manual.

Common pitfalls

  • -collection-agent accepts only host:port, never a URL. Use zymtrace.example.com:443 β€” NOT https://zymtrace.example.com:443 or https://zymtrace.example.com/. Adding a scheme prefix makes the agent fail to parse the value and retry forever. TLS is controlled separately by presence/absence of the -disable-tls flag, not by the URL scheme.
  • Wrong -collection-agent (typo in <backend-NS>, or pointed at a non-existent service) β†’ agent retries forever, no profiles appear. Test with kubectl run -it --rm dns-test --image=busybox -- nslookup <PREFIX>-gateway.<backend-NS>.svc.cluster.local.
  • -disable-tls left on when targeting HTTPS ingress β†’ handshake fails. Remove the flag.
  • -disable-tls removed when targeting in-cluster ClusterIP β†’ connection refused (service is HTTP). Add it back.
  • GPU template applied on CPU-only nodes β†’ harmless (CUDA profiler no-ops without NVIDIA driver), but wastes pod resources via the nodeSelector mismatch. Either remove nodeSelector or scope to GPU nodes.
  • NodeSelector targets a label the cluster doesn't actually set β†’ DaemonSet schedules 0 pods. kubectl get nodes --show-labels to confirm.
  • --nvml-auto-scan left on permanently β†’ fine for first install (detects NVML path), but for production, switch to --nvml-path=<path> once the path is known (saves startup scan).

Security constraints

  • Never issue helm upgrade / helm upgrade --install for this chart without --reset-then-reuse-values. See shared/conventions.md.
  • Never include -project= / ZYMTRACE_PROJECT in profiler args, env vars, or values templates. Always use the default project β€” the agent creates it automatically.
  • Never create overlay / temporary values files alongside the canonical one β€” edit in place.
  • Never run the install without explicit user confirmation showing the resolved target gateway endpoint.
  • Never turn on PC sampling silently. It's a powerful feature β€” gives you SASS-level disassembly + stall reasons β€” but NVIDIA requires the workload to run with elevated privileges to enable it: either privileged: true on the k8s pod, or sudo when running a bare binary. That's a workload-side change that needs explicit user confirmation. Recommend it for dev/staging deep-dives or on-demand production debugging. See reference.md Β§ PC sampling.
  • Never skip Step 5 verification β€” DaemonSet "Ready" doesn't mean the agent is reaching the backend.

What ships with it: 4 files

31.9 KB alongside SKILL.md, 1 of them executable

scripts/

values/

Keep looking

Skills are one crate of 325,949. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.