Standalone · Cluster

GPU tenant inventory: knowing who owns the fleet

On a 130-node, 1000+ GPU cluster, "who owns what" is not a question you can answer from memory. It's a live inventory you regenerate from the cluster, and it changes how you do everything.

Every GPU cluster has a moment where you realize you don't actually know what's running on it. Not "what pods exist" - that's easy. But who owns the GPUs, which tenant's workload is eating the fleet, and whether the GitOps state matches reality. That's the gap a tenant inventory fills.

The numbers that matter

From a live inventory of the fleet:

The headline: 798 of 1032 GPUs are in use, and the biggest tenants are the GLM deployments (256 GPUs for panja, 208 for code) and the Dynamo disaggregated graphs.

Per-tenant, not per-pod

The insight that makes the inventory useful: roll up by tenant, not by pod. A table of 100 deployments is noise. A table of 10 tenants, each with their GPU request, their product line, and their public routes, is a decision tool.

It answers questions like:

Dynamo graphs as first-class citizens

Disaggregated serving breaks the naive "one deployment = one GPU count" model. A Dynamo graph spans multiple roles: prefill and decode, each with its own replica count and GPU-per-replica. The inventory has to roll those up too:

These are the real units of capacity, and they're invisible to a naive `kubectl get deploy`.

GitOps drift as a first-class signal

The inventory's most valuable output is the drift flag: live GPU workloads without a GitOps model match, and GitOps models with no live workload. Both directions matter.

On this fleet, the drift list was a who's-who of the biggest deployments: all the GLM-52 Dynamo graphs, the DSpark DeepSeek V4 pair, the 64-GPU gemma4 decode worker. These were the workloads that mattered most, and they were all outside the GitOps model registry.

Regenerate, don't remember

The rule that keeps the inventory honest: no living doc states a counted fact. The inventory is regenerated from live queries, not hand-maintained. Hand-maintained counts drift by 20+ nodes in a month; live queries don't.

This is the same discipline as the render-integrity check: trust the invariant, not the memory.

The takeaway

You can't manage capacity you can't see. Roll up by tenant, treat Dynamo graphs as first-class units, and let drift be a signal instead of a surprise.

Sources

Back to the blog