NVIDIA / NVIDIA/Personal-AI-Router
[Bug]: Node card header shows only the first GPU, so multi-GPU hosts are misreported as single-GPU
@ckelseynv is already working on this.
Since Sep 11, 2026.
- Dominant language
- Go
- Stars
- 1.4k
- Forks
- 250
- Avg merge
- 23h 27m
- Merged PRs (30d)
- 1
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 #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.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Assessment
This issue has not been assessed yet.