zaclanzon.dev

The dashboard showed only one GPU

The collectors could return multiple GPUs, but the dashboard selected the first entry from the snapshot and rendered a single GPU widget. That was an inadequate view of a machine with more than one card: the additional device’s utilization, temperature, and memory use were not separately visible.

The patch replaces the first-device view with a list of per-device views. Each has its own name, utilization, temperature, VRAM figures, and graph. Existing power, clock, and fan readings remain part of that view. Public implementation.

Identity has to survive reordering

Array position describes the current snapshot’s ordering, not a durable device identity. If graph state followed position alone, reordering devices could associate history with the wrong card.

The collectors now include UUID and index fields. The browser keeps its device views in a map keyed by UUID, with an index-and-name fallback when UUID is unavailable. When a snapshot arrives, the renderer reuses the matching view and moves its existing element to the requested order.

Snapshot AGPU A · GPU B
Snapshot BGPU B · GPU A
The order changes; UUID-keyed views keep their own graph state. Letters are illustrative device labels, not hardware measurements.

Devices no longer present in a snapshot have their views removed. A reconnected device gets a new view after removal; the patch does not preserve its graph indefinitely across a disconnect. The fallback also cannot offer the same identity guarantee as a stable UUID when indexes change.

Missing is not zero

The NVML collector isolates unsupported readings rather than allowing one failed sensor call to discard every GPU’s data. If a device handle is lost, the collector skips that device and continues collecting the others.

Unknown power, clock, fan, and memory values display as unavailable. Memory stays local to each GPU: the interface does not add the cards’ capacities together and present them as a shared VRAM pool.

The nvidia-smi fallback also uses CSV parsing rather than manually splitting each line on commas. Legacy records without the new identity fields still receive fallback identities. Collector and renderer changes.

Regression coverage

Scenario Expected behavior
Two devices Separate names, readings, and VRAM figures.
Devices reorder Existing device views follow their identities.
One device disappears Its view is removed without discarding the other.
A device returns A new view is created.
A reading is unsupported The value remains unavailable.
Only one GPU is present The single-device case still works.

The PR records 68 passing Python tests and isolated Chromium regression checks. The browser tests include an RTX 5090/T400 fixture. Those are simulated inputs, not utilization measurements from a running workload. Live hardware validation remained pending in the published validation note.

What this changes—and what it does not

The change improves the visibility and correctness of the dashboard. It does not select a GPU for an application, move display workloads, redistribute a model, or establish an inference speedup.

This distinction matters: a monitoring interface should make the system easier to inspect without suggesting it controls behavior that it only observes.

Source and current state

HYTE panel PR #11 was open and unmerged when checked on September 15, 2026. The source and tests are linked there.

Read the shorter note on device identity →