Portada de UrsaKit para la guía de ejecutar un LLM de pesos abiertos en hardware de consumo

Ejecutar un LLM en local sobre hardware que ya tienes te da tres cosas que una API hospedada no ofrece: sin coste por token, sin datos que salen de la máquina y sin límite de tasa. El intercambio es un presupuesto de memoria que hay que planificar en lugar de una factura que se puede ignorar.

Los lanzamientos recientes de pesos abiertos han llevado esto de hobby a opción por defecto para trabajo sensible a la privacidad. Kolibri, de Aleph Alpha, es un modelo de mezcla de expertos inglés-alemán publicado bajo Apache 2.0 (Aleph Alpha), y ds4, de antirez, apunta a DeepSeek V4 Flash sobre Metal, CUDA y ROCm (ds4). Los runtimes de abajo son la capa que sostiene a ambos.

01Elige un runtime antes que un modelo

Hay tres niveles de control, y la elección correcta depende de si optimizas comodidad o rendimiento.

RuntimeIdeal paraInterfazIntercambio
App de escritorio (LM Studio y similares)Primera ejecución, explorar modelosGUIMenos automatizable
OllamaUso diario, integración con appsCLI + demonio en el puerto 11434Menos mandos de bajo nivel
llama.cppAjuste, servir, incrustarllama-cli, llama-serverConfiguración manual

Los tres ejecutan archivos GGUF, así que un modelo descargado para uno no se desperdicia en otro.

02Calcula la memoria antes de descargar

Este es el paso que la gente se salta, y la razón de que una descarga termine y luego no cargue. Importan dos costes.

Los pesos escalan con el número de parámetros y la profundidad de bits, porque la cuantización guarda menos bits por peso. Cuatro bits son medio byte, así que mil millones de parámetros ocupan unos 0,5 GB más el sobrecoste: cuenta 0,6 GB. Ocho bits duplican eso, unos 1,1 GB.

La caché KV escala con la longitud de contexto, el tamaño de lote, el número de capas y la dimensión de cabeza, y no es gratis. En un modelo de 7B, pasar de un contexto de 4K a 32K puede añadir varios gigabytes.

Tamaño (Q4)Pesos (est.)Mínimo cómodoNotas
3B~2 GB6 GBCabe en portátiles pequeños
7–8B~5 GB10 GBEl punto dulce habitual
13–14B~8 GB14 GBQuiere una GPU de 12 GB+
30–34B~20 GB32 GBMemoria unificada de Apple o doble GPU

Los pesos son el suelo, no el total

Un modelo que cabe con el contexto vacío puede quedarse sin memoria al subir la ventana de contexto. Decide primero el contexto que necesitas y luego elige el cuantizado que deje sitio para él.

03Ejecuta un modelo con Ollama

Ollama es el camino más corto de la nada a un endpoint funcional. Descarga un modelo cuantizado, lo cachea y arranca un demonio que habla HTTP.

  1. Instala y arranca el demonio. El instalador oficial cubre macOS, Windows y Linux; el demonio escucha en el puerto 11434 en cuanto está en marcha.
  2. Descarga y ejecuta un modelo. La etiqueta selecciona tamaño y cuantización; omitirla suele elegir un valor por defecto.
ollama pull gemma4
ollama run gemma4

El ejemplo descarga gemma4, la versión actual de Gemma en la biblioteca de Ollama. La etiqueta selecciona tamaño y cuantización; omitirla suele elegir un valor por defecto.

  1. Llama a la API directamente. Ollama sirve un endpoint compatible con OpenAI en 11434, así que los clientes existentes funcionan cambiando la URL base.
curl http://localhost:11434/v1/chat/completions \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "gemma4",
    "messages": [{ "role": "user", "content": "Summarize this changelog in one line." }]
  }'
  1. Comprueba qué está cargado y a qué velocidad. Ollama informa el modelo, el tamaño de contexto y los tokens por segundo, que es el número a vigilar al ajustar.

04Ejecuta el mismo modelo con llama.cpp

llama.cpp es donde controlas explícitamente la descarga a GPU y el contexto. Compílalo una vez y sirve cualquier archivo GGUF.

cmake -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build --config Release -j

Sirve un modelo con la mayoría de capas en la GPU. -ngl 99 descarga todas las capas que puede, -c fija el tamaño de contexto y --port expone un servidor compatible con OpenAI.

./build/bin/llama-server \
  -m ./models/qwen3-8b-q4_k_m.gguf \
  -c 8192 \
  -ngl 99 \
  --host 127.0.0.1 --port 8080
curl http://127.0.0.1:8080/v1/chat/completions \
  -H 'Content-Type: application/json' \
  -d '{"model": "local", "messages": [{"role": "user", "content": "Hello"}]}'

-ngl es el flag más útil. Si el modelo no cabe, bajarlo mueve capas a la RAM del sistema: seguirá funcionando, pero mucho más lento, porque cada token cruza el bus PCIe.

05Ajusta los tres valores que deciden el rendimiento

La cuantización fija el techo de calidad (llama.cpp quantize). Q4_K_M es el equilibrio estándar, Q5_K_M conserva más calidad por un aumento moderado de tamaño y Q8_0 se acerca al original con el doble de peso. Baja solo cuando no quepa nada mayor.

El contexto es el valor con más probabilidad de pasarse de memoria en silencio. Empieza por la longitud que de verdad necesitas para la tarea, no por el máximo anunciado del modelo, y súbela paso a paso vigilando la memoria.

La descarga a GPU decide si la inferencia es rápida o solo posible. Descarga tantas capas como quepan en VRAM y reserva un poco de margen para la caché KV y el sistema operativo.

Un cuantizado que cabe por pesos puede fallar por contexto

Si el servidor se cae tras cargar el modelo, o se arrastra a mitad de conversación, baja -ngl o reduce -c. Las conversaciones largas hacen crecer la caché hasta que la máquina empieza a hacer swap.

06Errores comunes y soluciones

SíntomaCausaSolución
El modelo carga y falla con el primer prompt largoLa caché KV superó la memoria disponibleBaja el contexto o el cuantizado
Tokens por segundo muy lentosHay capas ejecutándose en CPUSube -ngl o libera VRAM
Salida corrupta o repetitivaCuantizado demasiado agresivo para la tareaSube a Q5 o Q8
Conexión rechazada en el puerto 11434El demonio de Ollama no está corriendoArranca el servicio y reintenta
El cliente habla con la API pero no encuentra el modeloEl nombre no coincide con la etiquetaUsa la etiqueta exacta de ollama list

El flujo que funciona: calcula la memoria, elige el cuantizado más pequeño que cumpla tu nivel de calidad, sírvelo con un endpoint compatible con OpenAI y apunta tus herramientas a localhost. Cuando ese endpoint sea estable, podrás entregárselo a un agente de código o a una herramienta interna sin enviar un solo token fuera de la máquina.

07Fuentes

Preguntas frecuentes

¿Cuánta RAM o VRAM necesito para ejecutar un modelo localmente?

Presupuesta unos 0,6 GB por cada mil millones de parámetros en un cuantizado de 4 bits para los pesos, y añade memoria para la caché KV. Un modelo de 7B en Q4 necesita unos 4–5 GB antes del contexto; un contexto largo puede añadir varios gigabytes más.

¿Cuál es la diferencia entre Ollama y llama.cpp?

Ollama envuelve llama.cpp con gestión de modelos, un demonio y una API compatible con OpenAI en el puerto 11434. llama.cpp ofrece los binarios crudos y control total sobre cada flag, que es lo que quieres al ajustar rendimiento.

¿Qué sacrifica realmente la cuantización?

Precisión. Los cuantizados de menos bits reducen el archivo y aceleran la inferencia pero pierden exactitud, sobre todo en razonamiento y contextos largos. Q4_K_M es el equilibrio habitual; Q8_0 se acerca al original con el doble de tamaño.

¿Por qué mi modelo va más lento que los benchmarks?

Casi todos los benchmarks asumen que el modelo completo cabe en VRAM. Si las capas se derraman a la RAM del sistema, el rendimiento cae en picado. Reduce el contexto, usa un cuantizado menor o descarga menos capas y acepta el intercambio.

¿Puedo usar el modelo local con mi cliente OpenAI actual?

Sí. Tanto Ollama como llama-server exponen un endpoint compatible con OpenAI, así que cambias la URL base y el nombre del modelo en lugar de reescribir las llamadas del SDK.

Volver a los artículos

Artículos relacionados

Herramientas relacionadas