Test: Come Ollama utilizza le prestazioni del processore Intel e i core efficienti

Ollama su CPU Intel: efficienza vs prestazioni

Indice

Ho un’idea da testare: se l’utilizzo di tutti i core su un processore Intel aumenterebbe la velocità degli LLM? Mi sta infastidendo il fatto che il nuovo modello gemma3 27 bit (gemma3:27b, 17 GB su ollama) non entra nei 16 GB di VRAM della mia GPU e viene eseguito parzialmente sul CPU.

Per essere precisi

ollama ps

mostra

gemma3:27b    a418f5838eaf    22 GB    29%/71% CPU/GPU

Sebbene non sembri terribile, i layer sono divisi. Il carico effettivo è: GPU:28%, CPU: 560%. Sì, vengono utilizzati diversi core.

Il ritratto di Llama e CPU volanti

Ecco l’idea:

Cosa succederebbe se spingessimo ollama a utilizzare TUTTI i core del processore Intel, sia quelli di Prestazione che quelli Efficienti?

Parametro di configurazione OLLAMA_NUM_THREADS

Ollama ha un parametro di configurazione dell’ambiente OLLAMA_NUM_THREADS che dovrebbe indicare a ollama quanti thread e core dovrebbe utilizzare.

Ho provato prima a limitarlo a 3 core:

sudo xed /etc/systemd/system/ollama.service

# inserisci OLLAMA_NUM_THREADS=3 come
# Environment="OLLAMA_NUM_THREADS=3"

sudo systemctl daemon-reload
sudo systemctl restart ollama

ma non ha funzionato.

Ollama continuava comunque a utilizzare ~560% del CPU quando eseguiva il modello LLM Gemma 3 27B.

Sfortunatamente.

Opzione num_thread

Proviamo a chiamare

curl http://localhost:11434/api/generate -d '
{  
"model": "gemma3:27b",  
"prompt": "Perché il cielo è blu?",  
"stream": false,
"options":{
  "num_thread": 8
}
}'  | jq .

Il risultato:

  • Utilizzo CPU: 585%
  • Utilizzo GPU: 25%
  • Potenza GPU: 67w
  • Valutazione delle prestazioni: 6,5 token/sec

Ora proviamo a raddoppiare i core. Diciamo a ollama di utilizzare una combinazione di core di prestazione e efficienti:

curl http://localhost:11434/api/generate -d '
{  
"model": "gemma3:27b",  
"prompt": "Perché il cielo è blu?",  
"stream": false,
"options":{
  "num_thread": 16
}
}'  | jq .

Il risultato:

  • Utilizzo CPU: 1030%
  • Utilizzo GPU: 26%
  • Potenza GPU: 70w
  • Valutazione delle prestazioni: 7,4 t/s

Bene! Le prestazioni sono aumentate del ~14%.

Ora andiamo all’estremo! Utilizziamo tutti i core fisici!

curl http://localhost:11434/api/generate -d '
{  
"model": "gemma3:27b",  
"prompt": "Perché il cielo è blu?",  
"stream": false,
"options":{
  "num_thread": 20
}
}'  | jq .

Il risultato:

  • Utilizzo CPU: 1250%
  • Utilizzo GPU: 10-26% (instabile)
  • Potenza GPU: 67w
  • Valutazione delle prestazioni: 6,9 t/s

Okay. Ora vediamo un calo delle prestazioni. Proviamo con 8 core di prestazione + 4 efficienti:

curl http://localhost:11434/api/generate -d '
{  
"model": "gemma3:27b",  
"prompt": "Perché il cielo è blu?",  
"stream": false,
"options":{
  "num_thread": 12
}
}'  | jq .

Il risultato:

  • Utilizzo CPU: 801%
  • Utilizzo GPU: 27% (instabile)
  • Potenza GPU: 70w
  • Valutazione delle prestazioni: 7,1 t/s

Qui e là.

Per confronto - eseguendo Gemma 3 14b, è meno intelligente rispetto a Gemma 27b, ma si adatta bene alla VRAM della GPU.

curl http://localhost:11434/api/generate -d '
{  
"model": "gemma3:12b-it-qat",  
"prompt": "Perché il cielo è blu?",  
"stream": false
}'  | jq .

Il risultato:

  • Utilizzo CPU: 106%
  • Utilizzo GPU: 94% (instabile)
  • Potenza GPU: 225w
  • Valutazione delle prestazioni: 61,1 t/s

Questo è ciò che chiamiamo prestazioni. Anche se Gemma 3 27b è più intelligente del 14b, non è 10 volte migliore!

Conclusione

Se l’LLM non entra nella VRAM della GPU e alcuni strati vengono scaricati da Ollama sul CPU

  • Possiamo aumentare le prestazioni dell’LLM del 10-14% fornendo il parametro num_thread
  • Il calo di prestazioni dovuto allo scaricamento è molto più alto e non è compensato da questo aumento.
  • Meglio avere una GPU più potente con più VRAM. L’RTX 3090 è migliore dell’RTX 5080, anche se non ho nessuno di questi