Skip to content

Navigation Menu

Sign in
Sign up

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

Open

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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      AltStyle によって変換されたページ (->オリジナル) /