Guía Llama.cpp: Capítulo 5 — Integración y resolución de problemas
Último capítulo de la serie: conectamos llama-server con el resto del ecosistema (Ollama, Open WebUI, agentes como Continue o OpenCode) y cerramos con una guía de resolución de problemas que cubre las averías clásicas del día a día.
1. Integración con Open WebUI
Open WebUI es el panel de chat más popular del ecosistema local y habla el dialecto OpenAI de fábrica.
# Con Docker, apuntando al servidor llama.cpp
docker run -d -p 3000:8080 \
-e OPENAI_API_BASE_URL=http://host.docker.internal:8081/v1 \
-e OPENAI_API_KEY=sk-mi-clave-local \
--add-host=host.docker.internal:host-gateway \
-v open-webui:/app/backend/data \
--name open-webui ghcr.io/open-webui/open-webui:main
Pasos:
- Levanta
llama-servercon la configuración del capítulo 3 (puerto 8081 y--api-key). - Arranca Open WebUI y crea tu cuenta local.
- En Ajustes → Conexiones, verifica que aparece tu endpoint y el modelo listado.
- Comienza a chatear: el resto (historial, RAG con documentos, modelos) lo gestiona la UI.
2. ¿llama.cpp u Ollama: cuándo usar cada uno?
No son enemigos: son capas distintas.
| Criterio | llama.cpp puro | Ollama |
|---|---|---|
| Control fino de flags | Total (cada parámetro) | Limitado (via modelfile) |
| Actualización del motor | Inmediata (git/release) | Ritmo del release de Ollama |
| Gestión de modelos | Manual (tus ficheros GGUF) | Automática (pull/push) |
| API | OpenAI-compatible + extendida | OpenAI-compatible + nativa |
| Recomendado para | Servidores afinados, producción, benchmarking | Uso individual y arranque exprés |
Trucos de convivencia:
- Ollama empaqueta llama.cpp por debajo: los GGUF que usa son los mismos.
- Ambos pueden coexistir en puertos distintos (Ollama por defecto
11434, llama.cpp en8081). - Un GGUF descargado para Ollama (
~/.ollama/models) puede moverse manualmente a tu carpeta de llama.cpp, y viceversa con cualquier GGUF de HuggingFace.
3. Integración con editores y agentes
3.1 Continue (VS Code)
{
"models": [
{
"title": "llama.cpp local",
"provider": "openai",
"model": "local-model",
"apiBase": "http://127.0.0.1:8081/v1",
"apiKey": "sk-mi-clave-local"
}
]
}
3.2 OpenCode y otros agentes estilo CLI
Configura el proveedor tipo OpenAI-compatible:
{
"providers": {
"llamacpp": {
"npm": "@ai-sdk/openai-compatible",
"options": {
"baseURL": "http://127.0.0.1:8081/v1",
"apiKey": "sk-mi-clave-local"
},
"models": {
"qwen2.5-coder-14b": {}
}
}
}
}
💡 Para agentes de código, precedencia de calidad: modelos instruct de código (
Qwen2.5-Coder,DeepSeek-Coder) y contexto ≥ 16K. Herramientas (tool calling) requiere que el modelo lo soporte y que el endpoint tenga habilitado el soporte de tools (activado por defecto en versiones recientes dellama-server).
4. Resolución de problemas (guía de supervivencia)
4.1 Carga y memoria
| Error / síntoma | Causa | Solución |
|---|---|---|
CUDA error: out of memory |
Modelo + KV-cache > VRAM | Cuantización menor, -c menor, KV q8_0, o -ngl menor |
Failed to allocate tensor |
Fragmentación/reserva en GPU | Reiniciar el servidor (no solo la generación) |
| Sistema se congela y RAM se llena | Capas desbordadas a memoria compartida | Baja -ngl hasta que el uso de RAM se estabilice |
unable to load model en Windows |
Ruta con espacios sin comillas o DLL faltantes | Rutas entre comillas; copia las CUDA DLL junto al exe |
| Modelo cargado pero vacío en respuestas | GGUF corrupto por descarga incompleta | Verifica SHA256 y re-descarga |
4.2 Rendimiento
| Síntoma | Diagnóstico | Remedios (en orden) |
|---|---|---|
| 2-3 tok/s en GPU moderna | Capas en CPU o swap a RAM | -ngl 99; comprobar en el log offloaded |
| Prompt processing lento | -ub/-b bajos |
-b 512 -ub 256 o superiores |
| tg/s cae con el contexto lleno | KV-cache sin sitio en VRAM | KV q8_0, -fa, contexto menor |
| Picos de latencia cada N tokens | Disco lento leyendo mmap | Copiar el GGUF a SSD/NVMe local |
| CPU al 100 % con GPU al 40 % | Demasiado trabajo en CPU | Menos -t, revisar backend compilado (CUDA vs CPU) |
4.3 API y red
| Síntoma | Causa | Solución |
|---|---|---|
Connection refused |
Servidor no levantado o puerto erróneo | Comprobar /health y el log de arranque |
401 Unauthorized |
--api-key pero cliente sin Bearer |
Enviar cabecera Authorization: Bearer <key> |
| El stream se corta a los ~30 s | Proxy/timeout intermedio (nginx) | proxy_read_timeout ampliado o conexión directa |
| CORS al llamar desde navegador | Origen no permitido | Servir el front del mismo host o proxy inverso |
| Contexto truncado en respuestas | -c (o slots con -np) insuficiente |
Ampliar contexto o reducir slots |
4.4 Depuración con logs
Elevar la verbosidad para el diagnóstico fino:
./llama-server -m models/modelo.gguf -ngl 99 --verbose 2> server.log
Y para verificar el dispositivo cuantizado en cada tensor, verás en los logs líneas tipo CUDA0 buffer size = ... seguidas del mapa de tensores por dispositivo. Búsqueda útil en el log: offloaded, KV buffer, compute buffer.
5. Buenas prácticas de despliegue
- Realiza persistencia del modelo:
mmapconfigurado por defecto evita recargar; si prefieres liberar RAM,--no-mmap(a costa de tiempo de carga). - Benchmark antes y después de cada cambio con
llama-bench, como vimos en el capítulo 4. - Aísla los servicios: un servidor por modelo (máquina/contenedor) es lo más limpio; si el presupuesto de VRAM no da, usa varios slots con el mismo modelo en vez de dos servidores.
- Autenticación siempre:
--api-keyincluso en red local;--host 127.0.0.1si no hay motivo para exponer. - Actualiza con cabeza: llama.cpp avanza rápido; tras cada actualización re-ejecuta tu benchmark mínimo (pp y tg) antes de dar por buena la nueva versión.
- Salud automatizada: un cron/scheduler que pida
/healthcada minuto y avise si el servicio está down.
6. Cierre de la serie
Recorrido completado: instalación y GGUF (cap. 1), GPU con CUDA y Vulkan (cap. 2), server afinado con flags y API OpenAI-compatible (cap. 3), optimización avanzada con cuantización e speculative decoding (cap. 4) e integración + troubleshooting (cap. 5).
Con esto tienes el conocimiento para montar un servicio de inferencia local competitivo, tanto en velocidad como en coste. El siguiente paso natural: automatizar el despliegue (Docker, Quadlets/podman, CI) y experimentar con modelos MoE y contextos largos. Nos leemos.