Open source · Apache-2.0 · one static binary
Fifteen vendors: NVIDIA, AMD, Intel, Apple silicon, Huawei Ascend, AWS Neuron and nine more. It shows which process holds each device, how hot it runs, and what it was doing ten minutes ago.
01 Why
Six questions that come up when a job is slow or a device sits idle. Each one names the tab that answers it.
Which device is idle while a pod still holds it?
Fleet totals and per-device state land on one screen. Idle-allocated devices get flagged there too.
Which workload is wasting spend?
Set your own price per hour, and siltide turns held devices into a spend and waste figure per workload.
Which pod, and which Slurm job, owns this device?
A process traces back through its container to the pod and the workload. Slurm jobs get the same treatment.
Is this device isolated on the fabric?
PCIe width, NVLink state, and a topology matrix show who shares a switch with whom.
What happened 15 minutes ago?
Every metric can be scrubbed back through the window it kept. Events sit right on the timeline.
Is this reading real, or a guess?
A health score comes with the reasons behind it. What siltide could not measure shows up as N/A, never as zero.
02 The interface
Tabs with no data are hidden. Links needs link data, Kubernetes needs a pod source.
03 Keys
Every action is rebindable in the config. The mouse works too: click a tab, a row, or a header.
| Key | Action |
|---|---|
| 1…0 | jump to a tab |
| tab shift+tab | next or previous tab |
| / | search |
| : | command bar, with Tab completion |
| h , . | open history, scrub back or forward |
| s S | sort by column, reverse the sort |
| d l | describe the pod, show its logs |
| ctrl+n ctrl+p | next or previous node |
| p | pause the display |
| x X | mark a row, or every row in view |
| y Y | copy the marked ids, or the command for them |
| ctrl+e | export the table to CSV |
| ? | help |
04 Hardware
NVIDIA and Apple silicon run on real hardware today. The rest are built against each vendor's own tool output, one fixture per parser. The full table, with sources, is in the README.
A ● marks a vendor confirmed on real hardware. The rest are built against the vendor’s own documented tool output, with a captured fixture behind every parser.
| Vendor | Source |
|---|---|
| NVIDIA | NVML, dlopen, no cgo |
| Apple silicon | ioreg, IOReport, SMC |
| AMD | sysfs, DRM fdinfo |
| Intel | sysfs, DRM fdinfo |
| Huawei Ascend | npu-smi |
| AWS Neuron | neuron-ls, neuron-monitor |
| Cambricon | cnmon |
| Enflame | efsmi |
| Hygon | hy-smi |
| Iluvatar CoreX | ixsmi |
| Kunlunxin | xpu_smi |
| MetaX | mx-smi |
| Moore Threads | mthreads-gmi |
| Biren | brsmi |
| VastAI | PCI sysfs |
05 Measured
Measured on one machine, named below the table. Each row says how to repeat it. No comparison against other tools.
| Measurement | Result | How |
|---|---|---|
| First rendered snapshot, simulated fleet | 0.03 s | time siltide --demo --once, 20 runs, median |
| First rendered snapshot, the machine below | 0.52 s | time siltide --once, 20 runs, median; 0.43 s of it is probing 15 vendors |
| Memory at rest, the interface | 19 MB | resident size sampled every 2 s for 24 s, median, 17 devices in view |
| Memory at rest, the headless collector | 25 MB | same sampling over 30 s, serving the API and /metrics |
| One keystroke in the filter | 11 µs | go test -bench Filter -count=5, mean; parses the query and matches every device and process in view |
| Redrawing the Overview | 0.38 ms | go test -bench Render -count=5, mean, 200 by 60 cells |
| Redrawing the Dashboard | 0.51 ms | go test -bench RenderDashboard -count=5, mean |
| One collection pass, 64 devices | 0.60 ms | go test -bench Collect/64 -count=5, mean, excluding what the vendor tool costs |
| Writing one history point | 7.5 µs | go test -bench Record -count=5, mean |
Measured on an Apple M5 with 10 cores and 24 GB, macOS 26.6.2, Go 1.26.5, siltide v0.0.37-main.1-4-g16fd798. The interface figures use the simulated fleet of 17 devices; the hardware figure is this machine and its single Apple GPU, where one vendor probe takes most of the startup. A Linux host with eight NVIDIA cards will not reproduce these numbers, and the startup figure in particular moves with how many vendors are present. Run make bench for the last four rows.
06 The name
Silicon and tide: the rise and fall of load across a room full of silicon. There is no vendor in the name on purpose. No GPU, no CUDA, no NPU. Fifteen accelerator families are read the same way here, and the name should not pick one of them.
07 Install
One binary. Nothing to run first, nothing to point it at.
curl -fsSLO https://raw.githubusercontent.com/mesutoezdil/siltide/main/packaging/install/install.sh
sh install.sh
Two steps rather than curl | sh, so you can read the script before you run it. It picks the build for this machine, verifies it against the published checksums, and installs into /usr/local/bin.
brew install mesutoezdil/tap/siltide
go install github.com/mesutoezdil/siltide@latest
nix run github:mesutoezdil/siltide -- --demo
docker run --rm -p 9800:9800 --gpus all --pid=host \
-e NVIDIA_DRIVER_CAPABILITIES=utility \
ghcr.io/mesutoezdil/siltide:latest
Then: siltide --demo to explore without hardware, or siltide to probe what is on the machine.
Issues and pull requests are welcome. A missing vendor, a wrong number or a rough edge is worth reporting, whether or not you fix it yourself.
Star on GitHub →