Prueba: Cómo Ollama está utilizando el rendimiento de la CPU de Intel y los núcleos eficientes

Ollama en CPU de Intel: núcleos eficientes vs. núcleos de rendimiento

Índice

Tengo una teoría para probar: ¿si utilizamos todos los núcleos en una CPU de Intel aumentaría la velocidad de los LLMs? Me molesta que el nuevo modelo gemma3 de 27 bits (gemma3:27b, 17 GB en ollama) no se ajuste a los 16 GB de VRAM de mi GPU, y se ejecute parcialmente en la CPU.

Para ser más preciso

ollama ps

muestra

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

Aunque no parece terrible, es la división de capas. La carga real es: GPU:28%, CPU: 560%. Sí, varios núcleos se están utilizando.

El retrato de Llama y CPUs volando

Y aquí está la idea:

¿Qué pasa si forzamos a ollama a utilizar TODOS los núcleos de la CPU de Intel, tanto los de rendimiento como los eficientes?

Parámetro de configuración OLLAMA_NUM_THREADS

Ollama tiene un parámetro de configuración de variable de entorno OLLAMA_NUM_THREADS que se supone que le dice a ollama cuántos hilos y núcleos debe utilizar.

Primero intenté restringirlo a 3 núcleos:

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

# poner OLLAMA_NUM_THREADS=3 como
# Environment="OLLAMA_NUM_THREADS=3"

sudo systemctl daemon-reload
sudo systemctl restart ollama

pero no funcionó.

Ollama aún estaba utilizando ~560% de CPU al ejecutar el LLM Gemma 3 27B.

Mala suerte.

Opción de llamada num_thread

Vamos a intentar llamar

curl http://localhost:11434/api/generate -d '
{  
"model": "gemma3:27b",  
"prompt": "¿Por qué es azul el cielo?",  
"stream": false,
"options":{
  "num_thread": 8
}
}'  | jq .

El resultado:

  • Uso de CPU: 585%
  • Uso de GPU: 25%
  • Potencia de GPU: 67w
  • Evaluación de rendimiento: 6.5 tokens/sec

Ahora intentemos duplicar los núcleos. Le diremos a ollama que utilice una mezcla de núcleos de rendimiento y eficientes:

curl http://localhost:11434/api/generate -d '
{  
"model": "gemma3:27b",  
"prompt": "¿Por qué es azul el cielo?",  
"stream": false,
"options":{
  "num_thread": 16
}
}'  | jq .

El resultado:

  • Uso de CPU: 1030%
  • Uso de GPU: 26%
  • Potencia de GPU: 70w
  • Evaluación de rendimiento: 7.4 t/s

¡Bueno! El rendimiento aumentó aproximadamente un 14%.

Ahora vayamos al extremo. ¡Utilicemos todos los núcleos físicos!

curl http://localhost:11434/api/generate -d '
{  
"model": "gemma3:27b",  
"prompt": "¿Por qué es azul el cielo?",  
"stream": false,
"options":{
  "num_thread": 20
}
}'  | jq .

El resultado:

  • Uso de CPU: 1250%
  • Uso de GPU: 10-26% (inestable)
  • Potencia de GPU: 67w
  • Evaluación de rendimiento: 6.9 t/s

Bien. Ahora vemos una caída de rendimiento. Intentemos algunos 8 de rendimiento + 4 eficientes:

curl http://localhost:11434/api/generate -d '
{  
"model": "gemma3:27b",  
"prompt": "¿Por qué es azul el cielo?",  
"stream": false,
"options":{
  "num_thread": 12
}
}'  | jq .

El resultado:

  • Uso de CPU: 801%
  • Uso de GPU: 27% (inestable)
  • Potencia de GPU: 70w
  • Evaluación de rendimiento: 7.1 t/s

Aquí y allá.

Para comparación - al ejecutar Gemma 3 14b, es menos inteligente en comparación con Gemma 27b, pero se ajusta bien a la VRAM de la GPU.

curl http://localhost:11434/api/generate -d '
{  
"model": "gemma3:12b-it-qat",  
"prompt": "¿Por qué es azul el cielo?",  
"stream": false
}'  | jq .

El resultado:

  • Uso de CPU: 106%
  • Uso de GPU: 94% (inestable)
  • Potencia de GPU: 225w
  • Evaluación de rendimiento: 61.1 t/s

Eso es lo que llamamos rendimiento. Aunque Gemma 3 27b es más inteligente que 14b, no es 10 veces más.

Conclusión

Si el LLM no cabe en la VRAM de la GPU y algunas capas se transfieren a la CPU por parte de Ollama

  • Podemos aumentar el rendimiento del LLM en un 10-14% proporcionando el parámetro num_thread
  • La caída de rendimiento debido a la transferencia es mucho mayor y no se compensa con este aumento.
  • Tener una GPU más potente con más VRAM. La RTX 3090 es mejor que la RTX 5080, aunque no tengo ninguna de estas

Enlaces útiles