TL;DR
Lancia ollama ps con un modello caricato: la colonna PROCESSOR ti dice la verità. 100% GPU significa che la GPU sta bene e puoi smettere di leggere. Uno split tipo 40%/60% CPU/GPU significa che il modello non ci stava in VRAM — usa un quant più piccolo. 100% CPU significa che Ollama non ha trovato una GPU utilizzabile: di solito è un driver datato, l’assenza dal gruppo giusto (AMD su Linux), una OLLAMA_LLM_LIBRARY bloccata, o un container avviato senza accesso alla GPU. Sistema la causa che i log nominano; sono in tutto una cinquina.
Come verificare se Ollama sta davvero usando la GPU?
Due comandi, zero supposizioni.
# In un terminale: carica un modello
ollama run llama3.2 "hello"
# In un altro: guarda dove gira
ollama ps NAME ID SIZE PROCESSOR UNTIL
llama3.2:latest a80c4de17cd9 3.3 GB 100% GPU 4 minutes from now La colonna PROCESSOR ha tre stati:
100% GPU— tutti i layer sono stati scaricati in GPU. Fatto.48%/52% CPU/GPU— offload parziale. La GPU lavora, ma modello più contesto non stavano in VRAM. Vedi la sezione sulla VRAM qui sotto.100% CPU— l’inferenza gira sulla CPU. La GPU non è stata rilevata, oppure è stata disattivata di proposito.
Poi leggi il log del server, che nomina l’hardware che Ollama ha effettivamente trovato all’avvio:
journalctl -u ollama --no-pager | grep -i "inference compute" Su una macchina NVIDIA in salute cerchi una riga tipo questa:
inference compute id=GPU-xxxx library=CUDA compute=8.9 driver=12.4 name=NVIDIA GeForce RTX 4070 Nessuna riga, oppure una che finisce con un messaggio di fallback CPU-only, e hai trovato il problema. Il resto del post sono le cinque cause, dalla più probabile.
Perché Ollama dice «no compatible GPU discovered»?
Su NVIDIA il solito colpevole è il driver, non CUDA. Ollama include le sue librerie runtime CUDA, quindi non ti serve il CUDA toolkit installato — ma il runtime incluso richiede un driver abbastanza recente per parlargli. nvidia-smi che funziona non è una prova; dimostra solo che un driver esiste, non che sia abbastanza aggiornato.
nvidia-smi --query-gpu=driver_version --format=csv,noheader Se la versione porta anni addosso, aggiornala e riavvia:
# Famiglia Debian/Ubuntu
sudo apt install nvidia-driver-570
# Famiglia Arch
sudo pacman -S nvidia Dopo un aggiornamento del driver, riavvia il servizio Ollama perché rilevi di nuovo i dispositivi — il rilevamento avviene una volta sola, all’avvio, non a ogni richiesta:
sudo systemctl restart ollama Se il log ora stampa la tua GPU con library=CUDA, hai finito. Se continua a rifiutare, controlla che OLLAMA_LLM_LIBRARY non sia impostato da qualche parte — vedi la sezione «dopo un aggiornamento».
Perché Ollama usa la GPU solo per una parte del modello?
L’offload parziale è aritmetica, non un bug: i pesi del modello più la KV cache della tua finestra di contesto devono stare in VRAM. Un modello 7B in Q4 occupa circa 4–5 GB; dagli un contesto da 8K e la cache aggiunge altro. Su una scheda da 8 GB qualcosa deve restare sulla CPU, e ollama ps mostra lo split.
Tre modi per colmare il divario, dal più economico:
- Quant più piccolo. Scendere da Q8 a Q4 dimezza la dimensione dei pesi con un costo di qualità modesto. I compromessi sono illustrati in GGUF quantization levels explained.
- Contesto più corto.
num_ctxcomanda sulla dimensione della cache. 32K di contesto su una scheda da 8 GB significa che la maggior parte dei layer resta sulla CPU. - Meno layer in GPU. L’opzione
num_gpulimita quanti layer vengono scaricati. Impostarla sotto il numero di layer garantisce lo split — se qualcuno l’ha messa in un Modelfile o in una chiamata API, togliela.
Attenzione anche alla trappola inversa: una GPU che mostra 100% GPU ma gira più lenta del previsto potrebbe star facendo swap sulla RAM di sistema. Confronta la SIZE di ollama ps con la VRAM reale.
Perché Ollama non usa la mia GPU AMD?
AMD su Linux ha bisogno di tre cose, e tutte e tre si possono verificare:
1. Supporto ROCm nella build. Lo script di installazione Linux ufficiale include una build ROCm. Conferma cosa ha rilevato il server:
journalctl -u ollama --no-pager | grep -iE "rocm|inference compute" 2. Appartenenza ai gruppi. Il runtime ROCm deve accedere a /dev/kfd e /dev/dri, il che significa i gruppi render e video:
sudo usermod -aG render,video $USER
# esci e rientra, poi:
sudo systemctl restart ollama Il singolo gruppo mancante è il motivo del più comune post «Ollama not using GPU on Ubuntu» su ogni forum, e sopravvive alle reinstallazioni del driver perché il driver non è mai stato il problema.
3. Una GPU supportata — oppure un override. Le schede consumer RDNA2 non supportate (gfx1031, gfx1032) falliscono il rilevamento anche con uno stack ROCm funzionante. La workaround standard è dichiarare un target compatibile:
sudo systemctl edit ollama [Service]
Environment="HSA_OVERRIDE_GFX_VERSION=10.3.0" Poi sudo systemctl restart ollama. È un override non ufficiale ma largamente usato; se dà problemi, toglicelo e torni nel territorio del supporto ufficiale. Se invece preferisci il controllo pieno dei backend alla lotta con l’autorilevamento, questa è la differenza di fondo trattata in llama.cpp vs Ollama.
Su Windows il supporto AMD è più ristretto — controlla la lista delle GPU supportate di Ollama per la tua scheda prima di dare per rotta l’installazione.
Perché Ollama ha smesso di usare la GPU dopo un aggiornamento?
Gli aggiornamenti cambiano una di tre cose, in quest’ordine di probabilità:
- Una libreria backend bloccata.
OLLAMA_LLM_LIBRARYforza un runner specifico (cuda_v11,rocm, o persinocpu). Serve per il debug, scavalca l’autorilevamento in silenzio, e sopravvive nei profili shell e nei service file molto dopo che il motivo è stato dimenticato. Trovala e togliela:
systemctl show ollama --property=Environment | grep -i llm_library
env | grep OLLAMA - Il driver è rimasto indietro al runtime. Gli upgrade di Ollama portano con sé un runtime CUDA più nuovo; il tuo driver non si muove finché tu non lo muovi. Stesso fix della sezione driver qui sopra.
- Il servizio è un container e i flag sono spariti. Un container ricreato senza i flag GPU è un container CPU-only. L’invocazione NVIDIA è:
docker run -d --gpus=all -v ollama:/root/.ollama -p 11434:11434 ollama/ollama Per i container AMD, l’equivalente è il device passthrough più l’aggiunta ai gruppi:
docker run -d --device=/dev/kfd --device=/dev/dri
--group-add video --group-add render
-v ollama:/root/.ollama -p 11434:11434 ollama/ollama Niente --gpus=all, niente GPU — Docker non ha motivo di essere generoso.
Ollama funziona in WSL2?
Sì, con il driver giusto nel posto giusto: installa il driver NVIDIA Windows, mai un driver Linux dentro la distro — un driver dentro WSL rompe il passthrough CUDA invece di sistemarlo. Poi aggiorna WSL stesso e conferma che il device di passthrough esista:
wsl --update # da PowerShell
ls /dev/dxg # dentro WSL — deve esistere per usare la GPU Con /dev/dxg presente e un driver Windows aggiornato, Ollama in WSL2 scarica sulla GPU come un’installazione nativa. Se preferisci saltare del tutto l’indiretta, la build Windows di Ollama gira nativa e vede la GPU senza WSL.
Ma Ollama ha davvero bisogno di una GPU?
No — un’esecuzione solo CPU è funzionalmente identica, solo più lenta, e per modelli piccoli su una CPU veloce può essere perfettamente utilizzabile. Su Apple Silicon la domanda svanisce: Metal usa la memoria unificata automaticamente, e l’unico limite è quanta RAM sei disposto a condividere col modello.
La checklist da cinque minuti
| Sintomo | Causa probabile | Fix |
|---|---|---|
100% CPU in ollama ps, scheda NVIDIA presente | Driver troppo vecchio per la CUDA inclusa | Aggiorna il driver, riavvia, restart del servizio |
100% CPU, AMD su Linux | Manca il gruppo render/video | usermod -aG render,video, nuovo login |
100% CPU, scheda AMD non supportata | ROCm rifiuta il target gfx | HSA_OVERRIDE_GFX_VERSION=10.3.0 |
Split 40%/60% CPU/GPU | Modello + contesto oltre la VRAM | Quant più piccolo o num_ctx più corto |
| GPU ieri, CPU oggi | OLLAMA_LLM_LIBRARY bloccata o driver vecchio | Trova e togli la variabile d’ambiente; aggiorna il driver |
| GPU in nativo, CPU in Docker | Container avviato senza i flag GPU | Ricrealo con --gpus=all (o i device AMD) |
Controlla in quest’ordine: ollama ps per lo stato, i log del server per la lista dei rilevamenti, poi la tabella. Nove volte su dieci la riga di log ti ha già detto in quale riga della tabella ti trovi.
— mrsaynothing
Get the next one by email
One email per post. No spam, no algorithms.
what is this?Git revert vs reset: quale salva la tua cronologia?
Ti piacciono gli articoli? È così che costruisco per lavoro. assumimi