The GPU tab stops being hub-only: a remote box now shows every card it has — per-card VRAM, utilisation, power and temperature, plus the processes holding the memory (a 3×3090 rig used to read as a single idle 24 GB card). The AI-model registry goes fleet-aware. CPU & DRAM package power lands via RAPL. AMD hosts get per-process VRAM attribution. And a host added with a typo'd name can finally be renamed instead of deleted. Two of the headline features came from outside contributors — thank you @1HazyOne707 and @pehota.
Added
- Per-host GPU view — every card, not just card 0. The remote probe now ships a per-card list (index, name, utilisation, VRAM, power, temperature — the same fields the hub records for its own cards) plus nvidia-smi's compute-process list, and the GPU tab renders the real thing for a remote host: VRAM/util KPIs, per-card bars, and a Processes on the GPU table (a process sharded across several cards is pooled into one row, not listed once per card). The host-level aggregate now pools all cards the way the hub pools its own — VRAM & power summed, utilisation averaged, temperature = the hottest card — so a 3×3090 box finally reads 72 GB, not 24. Data rides the fleet payload the page already polls (no new endpoint); hosts on an older probe keep the capability notice. Per-host GPU history and service attribution need per-host storage — that's the next slice. (#252)
- The AI-model registry is fleet-aware. "Installed models" no longer collapses the same model living on two machines into one row: the registry dedupes by (model, provider, host), groups by host → provider, stays visible on remote-host tabs, and — for ollama — collects each remote's on-disk catalogue over the same SSH channel the poller already uses. A thundering-herd race in the registry cache (a burst of concurrent callers each re-fetching a stale cache) is fixed on the way, with double-checked locking. (contributed by @1HazyOne707, #236)
- CPU & DRAM package power, measured via RAPL. Hosts with Intel/AMD RAPL support export per-package CPU and DRAM wattage as Prometheus gauges (
homelab_host_cpu_power_w/homelab_host_dram_power_w) — measured silicon power next to the GPU's, not an estimate. The shipped compose file now mounts/sys/class/powercapso the counters are readable inside the container; hosts without RAPL simply omit the metrics. (contributed by @pehota, #248) - Rename a host in place. A host registered under the wrong name could only be deleted and re-added — losing its poll calibration and splitting its experiment/benchmark history. The Hosts tab now has a rename pencil next to the name (and
PATCH /api/hosts/<name>accepts{"name": ...}): the row moves with its SSH target, tags, calibration and last check; the poll cache is re-keyed so the host never shows "no data yet"; and runs/benchmarks recorded under the old name follow.localstays reserved, and a combined rename + invalid-target request changes nothing at all rather than half-applying. (#251) - AMD per-process VRAM attribution via DRM fdinfo. On AMD hosts the GPU tab knew the card's totals but not who was using them — "GPU is idle." while utilisation spiked. The collector now reads per-process VRAM/GTT straight from DRM fdinfo (kernel 5.19+, no ROCm tools), dedupes dup'd file descriptors, applies the APU-vs-discrete GTT policy per PCI device on hybrid boxes, and feeds the existing attribution pipeline — so the VRAM-allocation bar, VRAM-by-service chart, container VRAM column and GPU cost attribution all light up on AMD too. (#249)
Fixed
- The container log drawer no longer dies when logs go quiet. Following a container whose logs paused past the heartbeat window killed the stream with a traceback — Python's chunked-response reader can't resume after a socket timeout. The log stream now speaks raw HTTP/1.0 over the Docker socket, so a quiet-log heartbeat simply reads again, and a closed browser tab tears the socket down cleanly. (#250)
Upgrade: hit Update in the dashboard, or docker compose pull && docker compose up -d. Pinned image: sikamikaniko123/homelab-monitor:0.27.0.