Cambiar tema

Optimización del rendimiento de Ollama: guía completa de cuantización, batch processing y ajuste de memoria

Easton editorial illustration: one compact local-model engine on a performance console

Actualización 2026-06-08: variables de entorno revisadas con la documentación oficial de Ollama — las capas GPU se ajustan con la opción de modelo num_gpu (no existe OLLAMA_GPU_LAYERS); reserva VRAM con OLLAMA_GPU_OVERHEAD (bytes); la cuantización del KV cache usa OLLAMA_KV_CACHE_TYPE. Los benchmarks son orientativos y varían según versión y hardware.

Tu modelo de 14B arranca, pero la inferencia va a 10 tokens/s. ¿O directamente falla con OOM y se cierra? El ventilador de la GPU a tope y pantalla negra.

Situación típica: descargas llama3 8B con ilusión, ejecutas ollama run y la VRAM no alcanza. O error y cierre, o tan lento que duele. Cambias a una versión Q4, funciona, pero te preguntas: ¿cuánta calidad perdiste?

Al empezar con Ollama caí en lo mismo: 8 GB de VRAM y un modelo 14B, pensando que con arrancar bastaba. Resultado: CUDA out of memory o palabra por palabra.

El problema no es el hardware. Es la configuración.

Aquí repasamos tres palancas: cuantización, batch processing y ajuste de memoria. Con estas tres claras, el rendimiento de tu LLM local puede duplicarse — no marketing, sino tokens/s reales.

1. Cuantización: equilibrio calidad/velocidad de Q4 a FP16

1.1 ¿Qué es la cuantización? ¿Por qué GGUF es el formato dominante?

En pocas palabras: cuantizar es «comprimir» el modelo.

Los parámetros originales van en FP16 (16 bits). Un modelo 7B en FP16 pide unos 14 GB solo de parámetros. Si pasas cada parámetro a 4 bits, en teoría bajas a ~3,5 GB. Menos bits, menos memoria y más velocidad.

El costo: pérdida de precisión. Como bajar una foto 4K a 720p: pierdes detalle, pero en muchos casos «sirve».

GGUF triunfa por una razón: comodidad. Lo diseñó el equipo de llama.cpp, soporta mmap y carga bajo demanda sin leer todo el modelo a RAM. Con 16 GB de RAM puedes correr 13B — con formatos clásicos, imposible.

1.2 Tipos de cuantización: Q4_0, Q4_K_M, Q5_K_M, Q8_0

Lo que confunde a muchos: Q4_0, Q4_1, Q4_K_M, Q5_K_M, Q8_0… ¿cuál elegir?

Tabla comparativa de los tipos habituales:

Tipo de cuantizaciónRatio de compresiónMemoria (modelo 7B)Pérdida de calidadEscenario
Q4_0~4,5x~4,0 GBAltaVRAM muy justa, calidad secundaria
Q4_K_M~4,5x~4,7 GBMuy bajaMejor relación calidad/costo, uso diario
Q5_K_M~3,5x~5,8 GBMínimaPrioridad calidad, VRAM suficiente
Q8_0~2x~7,2 GBCasi nulaMáxima calidad, VRAM amplia
FP161x~14 GBNingunaInvestigación, GPU potente

En resumen: Q4_K_M es la opción por defecto. La diferencia con FP16 en respuestas, salvo que busques fallos, no se nota en chat cotidiano.

Q5_K_M si tienes VRAM de sobra y te importa la calidad. Q8_0 solo con 24 GB o más — y entonces quizá conviene un modelo más grande.

1.3 Árbol de decisión para elegir cuantización

Lógica simple:

Paso 1: mira la VRAM

  • VRAM ≤ 8 GB: solo Q4_K_M; 7B justo, 14B con CPU offload
  • VRAM 12-16 GB: Q4_K_M para 14B; 7B puede ir a Q5_K_M
  • VRAM ≥ 24 GB: Q5_K_M o Q8_0, incluso modelos 70B

Paso 2: mira el uso

  • Chat y código: Q4_K_M basta
  • Traducción o escritura exigente: Q5_K_M
  • Investigación o benchmarks: Q8_0 o FP16

Datos de referencia:

  • 7B Q4_K_M: ~4,7 GB VRAM
  • 14B Q4_K_M: ~9 GB VRAM
  • 70B Q4_K_M: ~40 GB VRAM

Mi consejo: empieza con Q4_K_M. Si la calidad no convence, sube a Q5_K_M. No persigas «sin pérdida» de entrada; a veces es sugestión.

1.4 Cómo descargar una versión cuantizada concreta

Ollama descarga Q4_K_M por defecto. ¿Otra versión?

# Descarga Q4_K_M por defecto
ollama run llama3

# Especificar cuantización Q5
ollama run llama3:70b-q5

# Especificar cuantización Q8
ollama run llama3:70b-q8

No todos los modelos tienen todas las variantes. Consulta la biblioteca oficial o:

# Ver modelos locales
ollama list

# Ver detalles del modelo (incluida cuantización)
ollama show llama3 --modelfile

Si eres usuario avanzado, puedes cuantizar con llama.cpp y controlar precisión y parámetros. Es juego de nivel superior; aquí no lo desarrollamos.

2. Batch processing: subir el throughput un 50-150%

2.1 ¿Por qué el batch acelera?

Muchos no lo tienen claro. Analogía: en caja del super, atender de uno en uno es lento; procesar varios carritos seguidos, el cajero rinde más.

En GPU pasa lo mismo: un token aislado deja la unidad de cómputo esperando datos. El batch agrupa tokens y mantiene la GPU ocupada.

Ojo: el batch sube el throughput, no la latencia de una sola petición. Solo tú, poco cambio. Con API y varias peticiones concurrentes, el throughput puede duplicarse o más.

2.2 Parámetro num_batch

num_batch es el parámetro central de batch en Ollama; por defecto 512.

A mayor valor, más uso de GPU y más throughput. Costo: 20-40 % más de VRAM.

Ajuste según VRAM libre:

Situación VRAMnum_batch recomendadoEfecto esperado
VRAM ajustada512 (por defecto)Seguro, algo de GPU ociosa
VRAM media1024+50-80 % throughput
VRAM holgada2048+100-150 % throughput

En mi experiencia: RTX 3080 (10 GB) con 7B Q4_K_M, num_batch 1024 va estable; 2048 a veces dispara OOM. RTX 4090 con 14B, 2048 sin problema.

2.3 num_ctx y KV Cache

num_ctx es el tamaño de ventana de contexto; por defecto 2048. Impacta la memoria del KV Cache.

El KV Cache guarda resultados previos para no recalcular. Más contexto, más caché.

Fórmula aproximada:

Memoria KV Cache ≈ 2 × capas × dimensión oculta × num_ctx × bytes de precisión

Cifras orientativas:

  • 7B, num_ctx=4096: +1-2 GB
  • 14B, num_ctx=8192: +3-4 GB

Con contextos largos (32K, 128K), la VRAM sube rápido. Muchos creen que solo los parámetros llenan la GPU; a menudo es el KV Cache.

Trampa: algunos modelos permiten num_ctx enorme (llama3 hasta 128K), pero si lo pones al máximo, revienta la VRAM. Para el día a día, 4096 u 8192 bastan.

2.4 Configuración de batch en la práctica

Ejemplos directos.

Opción 1: Modelfile

# Crear desde modelo base
FROM llama3

# Tamaño de batch
PARAMETER num_batch 1024

# Ventana de contexto
PARAMETER num_ctx 4096

# Conservar system prompt
PARAMETER num_keep 128

Guarda como Modelfile y crea el modelo:

ollama create my-llama3 -f Modelfile
ollama run my-llama3

Opción 2: API options

curl http://localhost:11434/api/generate -d '{
  "model": "llama3",
  "prompt": "Explica la computación cuántica",
  "options": {
    "num_batch": 1024,
    "num_ctx": 4096
  }
}'

Comparativa de rendimiento (RTX 3080, 7B Q4_K_M):

num_batchThroughput (tokens/s)Uso VRAM
512455,2 GB
1024726,1 GB
2048987,4 GB

De 512 a 1024, +60 % throughput con menos de 1 GB extra. Buen trato.

3. Ajuste de memoria: tres estrategias contra OOM

3.1 Asignación de memoria GPU

Ollama gestiona la VRAM con cierta inteligencia:

  1. ¿Cabe el modelo entero?
  2. Si sí, todo a GPU
  3. Si no, offload parcial a CPU

«Inteligente» no es perfecto: a veces falla el cálculo o un caso límite y aparece OOM.

Parámetro clave: num_gpu. Controla cuántas capas van a GPU. -1 = automático. Manual, p. ej. num_gpu: 20: 20 capas en GPU, el resto en CPU.

3.2 Estrategia 1: bajar de cuantización

Lo más directo: OOM → cuantización más agresiva.

Ruta de degradación:

Q8_0 → Q5_K_M → Q4_K_M → Q4_0

Cada paso ahorra ~20-25 % VRAM.

Ejemplo: 14B Q5_K_M pide ~11 GB y falla. Q4_K_M ~9 GB (-18 % VRAM); en chat diario la calidad casi no se nota.

En 8 GB corrí 7B Q4_K_M sin drama. 14B Q4_K_M justo; contexto largo → OOM. Compromiso: 14B Q4_0, algo peor pero usable.

3.3 Estrategia 2: inferencia híbrida con CPU offload

VRAM insuficiente: reparte carga con CPU.

num_gpu fija capas en GPU. Modelo de 32 capas con num_gpu: 24: 8 capas en CPU.

Costo: más lento. CPU puede ser 10× más lenta que GPU. Mejor que no arrancar.

Configuración:

# Modelfile
FROM llama3
PARAMETER num_gpu 24

O vía API:

curl http://localhost:11434/api/generate -d '{
  "model": "llama3",
  "prompt": "Hola",
  "options": {
    "num_gpu": 24
  }
}'

Velocidad híbrida (14B Q4_K_M, RTX 3080 10 GB + i7-12700K):

num_gpuVelocidadVRAM
40 (todo GPU)OOM12 GB (excedido)
3018 tokens/s9,2 GB
2012 tokens/s6,5 GB
0 (solo CPU)4 tokens/s0,5 GB

Con num_gpu=30 la velocidad es aceptable y no revienta VRAM. Ahí está el valor del híbrido.

3.4 Estrategia 3: optimizar KV Cache

El KV Cache se ignora a menudo y puede ser el mayor consumidor.

Método 1: Flash Attention

Atención optimizada que reduce mucho el uso de VRAM.

# Variable de entorno
export OLLAMA_FLASH_ATTENTION=1

# O al arrancar Docker
docker run -e OLLAMA_FLASH_ATTENTION=1 ollama/ollama

Efecto: -30-50 % VRAM en KV Cache. Muy recomendable activarlo.

Método 2: reducir num_ctx

Más contexto, más caché. Si no necesitas 32K:

PARAMETER num_ctx 2048  # Por defecto; suficiente para chat

Método 3: num_keep para el system prompt

num_keep fija cuántos tokens no se recortan al deslizar contexto. Igual a la longitud del system prompt evita que se pierda.

PARAMETER num_keep 128

3.5 Flujo práctico ante OOM

Ante OOM, sigue este orden:

Paso 1: revisar VRAM

nvidia-smi

Paso 2: revisar parámetros del modelo

ollama show llama3 --modelfile

Comprueba num_ctx, num_batch, etc.

Paso 3: degradar paso a paso

  • Bajar num_batch: 1024 → 512
  • Bajar num_ctx: 4096 → 2048
  • Bajar cuantización: Q5_K_M → Q4_K_M

Paso 4: CPU offload
num_gpu al 70-80 % del total de capas.

Paso 5: solo CPU
Sin VRAM, CPU. Lento pero funciona.

# Forzar CPU puro con la opción de modelo num_gpu=0 (API o Modelfile)
curl http://localhost:11434/api/generate -d '{"model":"llama3","prompt":"hola","options":{"num_gpu":0}}'

Inferencia solo CPU ronda 1/10 de la GPU. Para uso ocasional o batch offline, puede valer.

4. Benchmarks y referencia de hardware

4.1 Velocidad de inferencia por hardware

Tabla orientativa para comparar con tu equipo:

NVIDIA (7B Q4_K_M)

GPUVRAMtokens/sNota
RTX 306012 GB52Buena relación precio/rendimiento
RTX 308010 GB68Opción estable
RTX 309024 GB95Puede 14B Q4
RTX 4070 Ti12 GB78Ventaja arquitectura nueva
RTX 409024 GB120Configuración top

NVIDIA (14B Q4_K_M)

GPUVRAMtokens/sNota
RTX 306012 GB28Justo
RTX 308010 GBOOMRequiere CPU offload
RTX 309024 GB55Cómodo
RTX 409024 GB72Muy rápido

Apple Silicon (Metal)

DispositivoRAM7B tokens/s14B tokens/s
M2 Air 8 GB8 GB35OOM
M2 Pro 16 GB16 GB4822
M2 Max 32 GB32 GB5832
M2 Ultra 64 GB64 GB6545

Ventaja de Apple: memoria unificada amplia. Rendimiento por núcleo menor que GPU dedicada alta gama.

Solo CPU

CPURAM7B tokens/s14B tokens/s
i7-12700K32 GB63
Ryzen 9 7950X64 GB84
M2 Max (solo CPU)32 GB126

Funciona, lento. Mejor para batch que chat en tiempo real.

4.2 Datos de mejora de throughput con batch

Efecto de num_batch (RTX 3080, 7B Q4_K_M, varias peticiones concurrentes):

num_batchLatencia por peticiónThroughput concurrenteVRAM
51222 ms/token45 tokens/s5,2 GB
102422 ms/token72 tokens/s6,1 GB
204822 ms/token98 tokens/s7,4 GB

Hallazgos:

  • Latencia por petición casi igual: el batch no penaliza una sola solicitud
  • Throughput casi duplicado: 2048 vs 512, +118 % en concurrencia
  • Costo VRAM controlado: +118 % throughput por +2,2 GB

4.3 Variables de entorno útiles

# Flash Attention (muy recomendado)
export OLLAMA_FLASH_ATTENTION=1

# Cuantización del KV cache: f16(def)/q8_0(~mitad)/q4_0(~cuarto), requiere Flash Attention
export OLLAMA_KV_CACHE_TYPE=q8_0

# Reservar VRAM para el sistema/otras apps (bytes, por defecto 0)
export OLLAMA_GPU_OVERHEAD=1073741824  # reservar 1 GB

# Tiempo de vida del modelo (por defecto 5 min)
export OLLAMA_KEEP_ALIVE=24h

# Longitud de contexto por defecto (sobrescribe la del modelo)
export OLLAMA_CONTEXT_LENGTH=4096

# Límite de peticiones concurrentes
export OLLAMA_MAX_QUEUE=512

# Nivel de log
export OLLAMA_DEBUG=1

Ejemplo Docker Compose completo:

version: '3'
services:
  ollama:
    image: ollama/ollama
    container_name: ollama
    restart: unless-stopped
    environment:
      - OLLAMA_FLASH_ATTENTION=1
      - OLLAMA_KEEP_ALIVE=24h
      - OLLAMA_MAX_QUEUE=512
    volumes:
      - ollama_data:/root/.ollama
    ports:
      - "11434:11434"
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]

volumes:
  ollama_data:

Guarda como docker-compose.yml y:

docker-compose up -d

Lectura relacionada

Resumen

Tres pasos de optimización:

Paso 1: elige cuantización
Según VRAM. Q4_K_M es el equilibrio habitual. Con margen, Q5_K_M.

Paso 2: ajusta batch
Si sobra VRAM, sube num_batch a 1024 o 2048. Throughput al doble, poco más de memoria.

Paso 3: resuelve OOM
Flash Attention, num_ctx menor o CPU offload. Prueba en orden hasta equilibrio.

La optimización es iterativa: hardware, tamaño de modelo y uso cambian. Empieza por cuantización, confirma que arranca, luego batch, y al final variables avanzadas.

Si tienes un caso concreto — modelo, error, configuración — comenta o revisa la documentación oficial de Ollama. La comunidad aporta mucha experiencia práctica, más que la teoría sola.

FAQ

¿Qué quantification Ollama choisir pour un usage courant ?
Q4_K_M offre généralement el meilleur compromis entre qualité, vitesse y mémoire. Q5_K_M convient si vous disposez de davantage de VRAM y privilégiez la qualité, tandis que Q8_0 vise surtout los GPU dotés d'una grande capacité.
¿Cómo réduire les erreurs de mémoire insuffisante avec Ollama ?
Commencez por un modèel o una quantification plus légère, puis vérifiez la taille del contexte, el batch y el nombre de couches envoyées au GPU. Gardez aussi una marge de VRAM au lieu de remplir entièrement la carte.
¿Augmenter num_batch rend-il toujours Ollama plus rapide ?
No. Un batch plus élevé peut améliorer el débit, mais il augmente aussi la consommation mémoire. Il faut el tester progressivement y revenir à una valeur plus faible dès que la latence o los erreurs OOM augmentent.

10 min de lectura · Publicado el: 10 abr 2026 · Actualizado el: 21 ago 2026

Comentarios

Inicia sesión con GitHub para dejar un comentario

Easton BlogEaston Blog