Skip to main content

xpustat

GitHub Authors: Salah Eddine Bekhouche, Hichem Telli

A unified accelerator stat tool: gpustat, but for every vendor.

Supported backends

Status Vendor Device CLI tool Filter key
✅ Tested AMD Radeon RX 7900 XTX (gfx1100) amd-smi amd
✅ Tested NVIDIA NVIDIA L4 (cc8.9), TITAN V (cc7.0) nvidia-smi nvidia
🔲 Untested Intel Gaudi / Gaudi 2 / Gaudi 3 hl-smi gaudi
🔲 Untested Intel Arc / Data Center GPU xpu-smi intel
✅ Tested Huawei Ascend 910B2 ascend-dmi / npu-smi huawei
🔲 Untested Hygon DCU hy-smi hygon
🔲 Untested Cambricon MLU cnmon cambricon
🔲 Untested Moore Threads MTT GPU mthreads-gmi moorethreads
✅ Tested Apple Apple M5 (10-core GPU) IOKit (built into macOS) apple
🔲 Untested AWS Neuron (Inferentia / Trainium) neuron-ls neuron
🔲 Untested Google Cloud TPU (v4 – v6e) tpu-info tpu
🔲 Untested Tenstorrent Wormhole / Blackhole tt-smi tenstorrent

Legend: ✅ tested on real hardware; 🔲 implemented, awaiting a hardware test

Backends whose management tool is not installed are silently skipped.

Apple Silicon note: the GPU shares unified memory with the CPU, so mem_total_mb is the machine's total RAM and mem_used_mb is the slice currently held by the GPU driver. macOS exposes GPU temperature, power, and per-process usage only to root (powermetrics), so those columns show N/A on Macs. Discrete GPUs in Intel Macs report real VRAM.

Neuron / Tenstorrent note: neuron-ls and tt-smi report inventory, processes and telemetry but not live memory usage, so those backends show memory as 0 / N/A.

Running Vendor Hardware Tests

If you have access to specific hardware, you can help us verify the implementation by running the standalone test scripts found in the vendor_devices_tests/ directory:

# Example: Testing the Huawei backend on a machine with Ascend NPUs
python vendor_devices_tests/test_huawei.py

# Example: Testing the NVIDIA backend
python vendor_devices_tests/test_nvidia.py

If the test successfully outputs your hardware metrics, please let us know so we can update the backend status to ✅ Tested!

Documentation

The full documentation is in docs/: installation, command line, Python API, device selection, Prometheus, backends and contributing. mkdocs serve renders it as a site.

Install

pip

pip install xpustat

conda

conda install -c conda-forge xpustat

CLI usage

xpustat                      # coloured table of all detected devices
xpustat -pui                 # watch mode, showing processes (-p), users (-u), refreshing every 1.0s (-i)
xpustat -i 2                 # watch mode, refresh every 2 seconds
xpustat -i 1 -n 10           # 10 refreshes then exit
xpustat -a                   # show everything (util, temp, power, arch, user, pid, cmd)
xpustat -f nvidia amd        # show only NVIDIA and AMD
xpustat --no-color           # plain text, no ANSI codes
xpustat --json               # raw JSON output
xpustat --prometheus         # Prometheus text format, once
xpustat --serve-prometheus 9400   # serve http://0.0.0.0:9400/metrics (fresh query per scrape)
xpustat --version

Example output:

xpustat 0.1.0  ·  myhost  ·  Fri May 22  11:24:00  2026
──────────────────────────────────────────────────────────────────────────
[NVIDIA] #0    Tesla V100                          │   1,024 / 32,768 MB   ███░░░░░░░░░░░░░    3%
[AMD   ] #0    Radeon RX 7900 XTX                  │      26 / 24,560 MB   ░░░░░░░░░░░░░░░░    0%
[APPLE ] #0    Apple M5                            │     375 / 32,768 MB   ░░░░░░░░░░░░░░░░    1%
[HUAWEI] #0:0  Ascend 310                          │   2,703 /  8,192 MB   █████░░░░░░░░░░░   33%

Example output with processes, users, and watch mode (xpustat -pui):

xpustat 0.1.0  ·  salah-amd  ·  Fri May 29  10:07:57  2026
──────────────────────────────────────────────────────────
[AMD   ] #0    Radeon RX 7900 XTX              │  17,918 / 24,560 MB  ████████████░░░░   72%
              └─ salah/348504(17480M)
  refreshing every 1.0s  ·  Ctrl+C to quit

Python API

import xpustat

# Query everything at once (parallel by default)
stats = xpustat.query_all()

print(stats)                      # XPUStatCollection(nvidia=0, amd=1, ...)
print(stats.amd[0].name)          # "Radeon RX 7900 XTX"
print(stats.amd[0].mem_used_mb)   # 26

# As a dict (JSON-serialisable)
import json
print(json.dumps(stats.to_dict(), indent=2))

# Query a single vendor
from xpustat import NvidiaGPUStatCollection
gpus = NvidiaGPUStatCollection.new_query()

Picking a device for training / inference

Every device object carries vendor-neutral fields on top of the vendor ones:

Field Meaning
vendor vendor key, e.g. "nvidia"
device_index physical index as the vendor tool reports it
mem_free_mb free memory (for Apple unified memory: what the OS can still give the GPU)
framework_index index the ML framework will see after CUDA_VISIBLE_DEVICES / HIP_VISIBLE_DEVICES / ASCEND_RT_VISIBLE_DEVICES / … (None if hidden)
torch_device torch.device string: cuda:N (NVIDIA, AMD, Hygon), mps, npu:N, hpu:N, xpu:N, mlu:N, musa:N, xla:N
import xpustat

dev = xpustat.pick_device()[0]            # most free memory first, honours *_VISIBLE_DEVICES
model.to(dev.torch_device)                # "cuda:2", "npu:0", "mps", ...

xpustat.pick_device(n=2, by="util")       # two least-busy devices
xpustat.pick_device(vendor="amd", min_free_mb=8000)
xpustat.visible_indices("nvidia")         # parsed CUDA_VISIBLE_DEVICES, or None when unset

Prometheus / Grafana

xpustat --serve-prometheus 9400           # then scrape http://host:9400/metrics

Exposes xpustat_memory_{used,total,free}_bytes, xpustat_utilization_percent, xpustat_temperature_celsius, xpustat_power_watts, xpustat_process_memory_bytes and xpustat_device_info (with arch and torch_device labels) for every vendor from one process. xpustat.to_prometheus(stats) returns the same text for embedding in your own exporter.

Version history

0.3.0

  • Apple Silicon GPU support (apple backend) read in-process from IOKit (~2 ms, ioreg fallback), no root required; tested on Apple M5
  • -A shows the GPU core count for Apple devices (e.g. 10-core)
  • Fix: vendor collections now support index access (stats.amd[0]), as documented
  • Faster subprocess fallbacks: the nvidia-smi and amd-smi invocations now run concurrently
  • Watch mode no longer swallows errors silently
  • Fix: process lines now render as user:command/pid instead of running user and command together
  • The nvidia / fast extras now pull nvidia-ml-py (the official NVML bindings) instead of the deprecated pynvml package
  • New backends: AWS Neuron (neuron-ls), Google Cloud TPU (tpu-info), Tenstorrent (tt-smi)
  • Vendor-neutral device fields: vendor, device_index, mem_free_mb, framework_index, torch_device
  • xpustat.pick_device() picks the least-loaded device(s), honouring *_VISIBLE_DEVICES
  • Prometheus export: --prometheus, --serve-prometheus PORT, and xpustat.to_prometheus()

0.2.0

  • Fix AMD GPUs not being detected when amd-smi reports "N/A" sections or idle GPUs (e.g. ROCm 10 with an iGPU present)
  • Flicker-free watch mode: frames are redrawn in place on the alternate screen

0.1.0

  • Initial release
  • Support for NVIDIA, AMD, Intel Gaudi, Intel Arc/GPU, Huawei Ascend, Hygon DCU, Cambricon MLU, Moore Threads

Metadata

Release files for xpustat 0.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for xpustat 0.3.0
File Size Uploaded Provenance
xpustat-0.3.0.tar.gz 52.7 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for xpustat 0.3.0
File Interpreter ABI Platform
xpustat-0.3.0-py3-none-any.whl Python 3 none any Details

Total release size: 105.3 kB

Release files / xpustat-0.3.0.tar.gz

Download URL xpustat-0.3.0.tar.gz
Size 52.7 kB
Tags Source
SHA-256 checksum
How to use checksums
af1fe36d36e76fd9c11b9f58caf8eb1b1c5eaf8d5e703f40e2bf4e104bd57f3f
BLAKE2b-256 checksum
How to use checksums
3a22e67e4b8281d554807ddc127ebdcc5cfaf2d0cebfe9f2f346a700d350e081
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.15.1

Release files / xpustat-0.3.0-py3-none-any.whl

Download URL xpustat-0.3.0-py3-none-any.whl
Size 52.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
0e7cb6bab8a2270c5b1fe897774d20dcf04cd310f76e018a8b60c16567957d70
BLAKE2b-256 checksum
How to use checksums
809a1bd319d629b1139cd8924598a1dc0ba9710e7b3b2f370fc7e50e8446c010
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.15.1

Security for xpustat 0.3.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page