NVIDIA / NVIDIA/Personal-AI-Router

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

Open
#33 1 comment 0 reactions 1 assignee View on GitHub

@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
  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.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.