-
Notifications
You must be signed in to change notification settings - Fork 188
[Bug]: Node card header shows only the first GPU, so multi-GPU hosts are misreported as single-GPU #33
Description
PAIR version or commit
0.1.1 (13b68115fa2c9c1d94f1ead1358f8d5a527cfecf), installed from NVPAIR-Setup-0.1.1-arm64.dmg and reproduced against a source build of the same commit.
Affected component
Desktop application
Environment
OS: macOS 26.6.2 (viewing node), Rocky Linux 9.8 (affected node)
Architecture: arm64 (viewer), x86_64 (affected node)
GPU and driver: affected node has TWO GPUs -
Tesla P100-PCIE-16GB + NVIDIA GeForce RTX 3060,
driver 580.159.04, CUDA 13.0
Engine and version: Ollama (PAIR-managed)
Model: qwen3:1.7b
Cluster size: 4 nodes
Steps to reproduce
- Run PAIR on a host with two or more GPUs.
- Pair it into a cluster and open the desktop application's Overview.
- Look at that node's card header.
- For comparison, read the same node's raw inventory:
curl http://<node>:14318/v1/node-info.
Expected behavior
The node card header identifies the host's GPUs. A machine with a P100 and a 3060 should not be indistinguishable from a machine with only a 3060.
Actual behavior
The header shows exactly one GPU name. The second card is absent, with no +1, no count, and no other indication that more GPUs exist — so a multi-GPU host is silently misreported as single-GPU in the summary view.
The data is correct at every other layer:
/v1/node-inforeturns both GPUs with correct VRAM totals.- The detailed performance view charts both, per its own comment: "The detailed performance view intentionally charts EVERY detected GPU."
inferenceHardwareIdsis absent from the payload, which by the contract insrc/ui/utils/gpu-inference.tsmeans "show every GPU" — so nothing is being filtered as un-ready.
Only the header label drops them.
Cause — desktop/src/ui/components/NodeList/NodeCardDetails.tsx:276 passes only the first element:
gpuLabel={gpuInfo.length > 0 ? gpuInfo[0].name : undefined}
NodeLabel accepts a single gpuLabel: string | undefined and pushes one gpu segment, so every GPU after the first is unrepresentable by construction.
Worth noting the fix is not simply joining the names into one string: NodeLabel applies wrapping, · separators and truncation per segment, so a joined string is a single segment that truncates after the first name on a narrow card — the same blind spot in a different form. One segment per GPU preserves the existing layout behavior.
This matters more on larger hosts: an 8-GPU server currently presents as a 1-GPU server in the node list.
Sanitized logs or screenshots
# /v1/node-info from the affected node - both GPUs present and correct. # Host/cluster identifiers and addresses removed per the template. { "GPUs": [ { "name": "Tesla P100-PCIE-16GB", "vram_bytes": 17179869184, "vram_used_bytes": 16077815808 }, { "name": "NVIDIA GeForce RTX 3060", "vram_bytes": 12884901888, "vram_used_bytes": 12120489984 } ], "cpu": { "name": "AMD Ryzen 5 5600X 6-Core Processor", "cores": 6, "utilization_percent": 1 }, "memory": { "total_bytes": 139586437120, "used_bytes": 14764740608 }, "telemetryValid": true } # Desktop node card header for that same node: # <NODE> - <address> - NVIDIA GeForce RTX 3060 # The Tesla P100 does not appear.
Confirmations
- I searched existing issues for duplicates. The closest is Local node's GPU/CPU/memory enrichment is never refreshed after startup #4 (local node's GPU/CPU/memory enrichment never refreshed), which concerns stale discovery data and explicitly notes the UI is unaffected; this is a rendering defect with fresh, correct data.
- This is not a security vulnerability.
- I agree to follow the Code of Conduct.