NVIDIA / NVIDIA/Personal-AI-Router

[Bug]: Node card header shows only the first GPU, so multi-GPU hosts are misreported as single-GPU

Offen
#33 1 Kommentar 0 Reaktionen 1 zugewiesene Person Auf GitHub ansehen

@ckelseynv arbeitet bereits daran.

Seit 11.9.2026.

Vorherrschende Sprache
Go
Sterne
1.4k
Forks
250
Ø Merge
23 Std. 27 Min.
Gemergte PRs (30 T.)
1

Beschreibung

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
  1. Run PAIR on a host with two or more GPUs.
  2. Pair it into a cluster and open the desktop application's Overview.
  3. Look at that node's card header.
  4. 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-info returns 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."
  • inferenceHardwareIds is absent from the payload, which by the contract in src/ui/utils/gpu-inference.ts means "show every GPU" — so nothing is being filtered as un-ready.

Only the header label drops them.

Causedesktop/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.

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Bewertung

Dieses Issue wurde noch nicht bewertet.

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.