Ollama doesn't fail when it can't use your GPU. It quietly runs the model on the CPU instead, and replies that took a second now take a minute. Here's how to spot it, and how to get an alert when it happens.
ollama psWith a model loaded, run ollama ps and look at the PROCESSOR column:
NAME ID SIZE PROCESSOR UNTIL
llama3.1:8b 46e0c10c039e 6.2 GB 100% GPU 4 minutes from now
qwen2.5:14b 7cdf5a0187d5 11 GB 48%/52% CPU/GPU 4 minutes from now
100% GPU is what you want. A CPU/GPU split means part of the model didn't fit in GPU memory;
100% CPU means the GPU isn't being used at all.
The same numbers come from the API. GET /api/ps lists each loaded model with size
(bytes in memory) and size_vram (bytes on the GPU):
curl -s http://127.0.0.1:11434/api/ps | jq '.models[] | {name, gpu_pct: (100 * .size_vram / .size | floor)}'
num_ctx) all need more memory; Ollama offloads what doesn't fit to the CPU.Paw Pulse is a free, push-based monitor for home LLM servers. Its client script
runs from cron on the Ollama box, reads /api/ps and reports the lowest GPU share across loaded models
as gpu_offload_pct. Set a floor and you get one "slow" alert when it drops below, and one more when it recovers.
jq on the box (apt install jq); the GPU check needs it.curl -X PATCH https://pulse.dougalpaw.com/v1/monitors/<id> \
-H 'authorization: Bearer <manage_token>' -H 'content-type: application/json' \
-d '{"min_gpu_pct":90}'The alert in Discord, Slack, Teams, Telegram or Google Chat reads like:
🟠 home-ollama is SLOW: only 48% of the model is on the GPU (your floor is 90%). It has probably fallen back to CPU.
MEASURE_TPS=1 MEASURE_MODEL=…) to load a model on every beat; the GPU check runs after it.