xpustat
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 | 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_mbis the machine's total RAM andmem_used_mbis the slice currently held by the GPU driver. macOS exposes GPU temperature, power, and per-process usage only to root (powermetrics), so those columns showN/Aon Macs. Discrete GPUs in Intel Macs report real VRAM.Neuron / Tenstorrent note:
neuron-lsandtt-smireport inventory, processes and telemetry but not live memory usage, so those backends show memory as0/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 (
applebackend) read in-process from IOKit (~2 ms,ioregfallback), no root required; tested on Apple M5 -Ashows 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-smiandamd-smiinvocations now run concurrently - Watch mode no longer swallows errors silently
- Fix: process lines now render as
user:command/pidinstead of running user and command together - The
nvidia/fastextras now pullnvidia-ml-py(the official NVML bindings) instead of the deprecatedpynvmlpackage - 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, andxpustat.to_prometheus()
0.2.0
- Fix AMD GPUs not being detected when
amd-smireports"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)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| xpustat-0.3.0.tar.gz | 52.7 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| 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.