VRAM monitoring, crash early-warning and per-run analytics for AMD / ROCm GPUs in ComfyUI — the numbers NVML-based monitors can never show you.
It isn't that the data is missing. It's that nobody was reading it.
Crystools and most resource monitors read GPU statistics through pynvml,
NVIDIA's management library. There is no AMD equivalent to fall back on, so on a
Radeon card the GPU section simply stays empty — CPU and RAM, nothing else.
But ComfyUI's own /system_stats endpoint reports AMD VRAM correctly,
because it goes through PyTorch's HIP backend rather than NVML. Every ComfyUI crash
report on an AMD machine already contains it:
Name: cuda:0 AMD Radeon RX 9070 XT
VRAM Total: 17095983104
VRAM Free: 16937648128
This extension displays what was always there — and then goes considerably further.
A draggable, resizable panel with 21 independently switchable rows.
Works on ROCm, multi-GPU aware. Integrated GPUs hidden by default — their “VRAM” is shared system RAM and reads 100% for reasons unrelated to ComfyUI.
The high-water mark, colour-coded, reset at the start of every job. The number that predicts a crash.
A sparkline of the run with guides at the warning thresholds — load spikes and decode plateaus become visible.
Watches ComfyUI's own log and warns the instant a model loads partially, which on ROCm is the last thing you see before the process aborts.
Critical warnings are written to disk and shown again after a restart — the explanation outlives the crash it was warning about.
Step k of n with a live estimate, plus the name of the node currently executing.
A measured breakdown of where a run's time actually went, so a slow generation points at its own bottleneck.
Model, LoRAs, size, sampler, steps, seed, outputs, errors, load state and peak usage — persisted, exportable as CSV.
Swap, CPU, output-disk free space and disk/network throughput, via psutil.
On a card without headroom, ComfyUI doesn't fail politely.
A model that doesn't fit gets partially offloaded to system RAM, and ROCm then aborts the entire process:
loaded partially; 9008.59 MB usable, 8420.02 MB loaded, 8896.00 MB offloaded
Fatal Python error: Aborted
No traceback. No out-of-memory error. ComfyUI simply dies. Watching the peak tells you a workflow is unsafe before it takes the process down.
| Bar colour | Peak | Meaning |
|---|---|---|
| green | < 80% | comfortable |
| amber | 80–92% | tight; a larger model or resolution won't fit |
| red ⚠ | > 92% | offload risk — expect a crash |
| Model | Size | Load | Result |
|---|---|---|---|
| Krea2 | 12.5 GB | completely | works |
| Z-Image Turbo | 11.7 GB | completely | works |
| Flux2 Klein fp8 | 8.78 GB | completely | 4.6 s/step |
| Flux2 Klein bf16 | 16.9 GB | partially | aborts |
usable consistently reports 9.8–10.6 GB, never the full 15.9 GB. The
difference is headroom for activations. The practical weight budget is roughly
10 GB, not the sticker figure.Measured from ComfyUI's node transitions — never inferred from log text.
Every run records a breakdown. Click any row in H → Runs to see it:
SamplerCustomAdvanced 6:58 89%
RemoteTextEncoderSwitch 28s 6%
UNETLoader 11s 2%
VAEDecode 8s 2%
SaveImage 1s 0%
Nodes that execute more than once are summed and marked ×2.
Seconds-per-step is reported as a median, so a single stall doesn't distort
the figure. Timings are the one thing that has to be trustworthy, so they are
measured rather than parsed.
Search for AMD Monitor and install, or:
comfy node install comfyui-amdmonitor
cd ComfyUI/custom_nodes
git clone https://github.com/the-Macro-Man/ComfyUI-AMDMonitor
Restart ComfyUI. A panel appears top-right — drag it anywhere, drag its right edge to resize, click ▾ to collapse. Position, width and every setting persist.
Nothing leaves your machine.
| Source | Provides |
|---|---|
/system_stats | VRAM per device, system RAM |
| websocket events | progress, node transitions, queue, run start/end |
/queue | the executing node's real name, run settings |
/internal/logs/raw | partial-load and OOM detection |
/amdmonitor/stats | swap, CPU, disk, network — via psutil |
Run records and per-run logs go to ComfyUI/user/amdmonitor/ — never the
extension folder, which ComfyUI Manager replaces on update:
user/amdmonitor/
runs.csv one row per run
runs/2026-08-24_1147_<promptid>.json full record
runs/2026-08-24_1147_<promptid>.log ComfyUI's log for that run
alerts.log
The log is appended as the run progresses and flushed every line. That is the whole point: when ROCm aborts there is no clean shutdown, so anything buffered is lost. Writing as it happens leaves a file ending at the exact moment things went wrong.
The last 50 runs are kept; older ones are pruned. One toggle disables disk writing entirely, and history still works in the browser.
ComfyUI's errors are precise and unhelpful. A built-in pattern table turns the common ones into plain English, using the context already recorded for that run — no network, no configuration, works for everyone:
RuntimeError: mat1 and mat2 shapes cannot be multiplied (512x30720 and 12288x4096)
becomes
flux2.An optional layer over a local Ollama endpoint, or an API provider such as OpenRouter. It interprets the measurements — it never produces them:
Open H → Runs and expand any row:
| Button | Where | What it does |
|---|---|---|
| Analyse this run | expanded row, successful runs | where the time went, memory- or compute-bound |
| Explain this failure | expanded row, failed runs | the cause in plain language, and the fix |
| Compare with previous | expanded row, when another run of the same model exists | what changed and what it cost |
| Session summary | bottom of the Runs tab | trends, grouped per model, failures excluded |
| Provider | Endpoint | Key |
|---|---|---|
| Ollama (local / LAN) | http://192.168.1.182:11434 | none |
| LM Studio | http://localhost:1234/v1 | none |
| OpenRouter | https://openrouter.ai/api/v1 | required |
| OpenAI | https://api.openai.com/v1 | required |
Sent: model, size, steps, sampler, LoRAs, durations, per-node timings, peak VRAM and RAM, load state, and the error if there was one — plus up to six previous successful runs of the same model. Prompt text is excluded unless you opt in. The API key is stored server-side and never reaches the browser.