Modo Enrutador de Llama-Server: Cambio Dinámico de Modelos Sin Reinicios

Sirva e intercambie LLMs sin reinicios.

Índice

Durante mucho tiempo, llama.cpp tenía una limitación evidente: solo se podía servir un modelo por proceso, y cambiar de modelo implicaba un reinicio.

Esa época ha terminado.

Las actualizaciones recientes introdujeron el modo router en llama-server, aportando algo mucho más cercano a lo que la gente espera de los entornos de ejecución locales de LLM modernos:

  • carga dinámica de modelos
  • descarga bajo demanda
  • cambio por solicitud
  • sin reinicio del proceso

llm router on the table

En otras palabras: comportamiento similar a Ollama, pero sin las rueditas de entrenamiento.

Si aún está decidiendo entre entornos de ejecución locales, APIs en la nube e infraestructura autoalojada, la guía general sobre alojamiento de LLM es un buen punto de partida.


Prerrequisitos

El modo router requiere una versión reciente de llama-server — aproximadamente posterior a mediados de 2024. Las versiones anteriores no tienen las banderas --models-preset o --models-dir.

Para opciones de instalación (gestor de paquetes, binarios precompilados o compilación completa desde el código fuente con CUDA), consulte la guía de inicio rápido de llama.cpp.

Una vez que tenga llama-server, confirme que su compilación admite el modo router:

llama-server --help | grep -i models

Si aparece --models-preset o --models-dir, está listo. Si están ausentes, actualice a una compilación más nueva.

Mi salida actual de ayuda relacionada con modelos:

-cl,   --cache-list                     show list of models in cache
                                        Prefix/Suffix/Middle) as some models prefer this. (default: disabled)
                                        models with dynamic resolution (default: read from model)
                                        models with dynamic resolution (default: read from model)
                                        embedding models (default: disabled)
--models-dir PATH                       directory containing models for the router server (default: disabled)
                                        (env: LLAMA_ARG_MODELS_DIR)
--models-preset PATH                    path to INI file containing model presets for the router server
                                        (env: LLAMA_ARG_MODELS_PRESET)
--models-max N                          for router server, maximum number of models to load simultaneously
                                        (env: LLAMA_ARG_MODELS_MAX)
--models-autoload, --no-models-autoload
                                        for router server, whether to automatically load models (default:
                                        (env: LLAMA_ARG_MODELS_AUTOLOAD)

Qué hace realmente el modo router

El modo router convierte a llama-server en un dispachador de modelos.

En lugar de vincularse a un solo modelo mediante -m, el servidor:

  • inicia sin ningún modelo cargado
  • recibe una solicitud que nombra un modelo
  • carga ese modelo si aún no está en memoria
  • ejecuta la inferencia
  • opcionalmente descarga el modelo después de la respuesta, o lo mantiene en memoria para la siguiente solicitud

La idea clave

Ya no está ejecutando:

./llama-server -m model.gguf

Está ejecutando:

./llama-server --models-preset models.ini --port 8080

Y dejando que el servidor decida qué cargar y cuándo, basándose en lo que el cliente realmente solicita.

Esto es importante porque significa que un proceso persistente puede servir una flota entera de modelos, con clientes seleccionando el adecuado por tarea — un modelo de código, un modelo de chat, un modelo de resumen — sin ninguna sobrecarga de coordinación en su lado.


Configuración: definiendo sus modelos

Aquí es donde las cosas aún están un poco crudas.

No existe un formato oficial completamente estable todavía, pero las compilaciones actuales admiten definiciones de modelos estilo INI mediante un archivo de configuración.

Ejemplo de models.ini

[llama3]
model = /opt/models/llama-3-8b-instruct.Q5_K_M.gguf
ctx-size = 8192
ngl = 35
threads = 8

[mistral]
model = /opt/models/mistral-7b-instruct-v0.3.Q4_K_M.gguf
ctx-size = 4096
ngl = 20
threads = 8

[qwen]
model = /opt/models/qwen2.5-coder-7b-instruct.Q5_K_M.gguf
ctx-size = 16384
ngl = 35
threads = 8

Cada nombre de sección se convierte en el identificador del modelo que los clientes utilizan en el campo "model" de sus solicitudes de API.

Parámetros clave de configuración

Parámetro Qué controla
model Ruta absoluta al archivo GGUF
ctx-size Tamaño de la ventana de contexto en tokens. Los valores más grandes usan más VRAM.
ngl Número de capas de GPU descargadas. Establezca en 0 para solo CPU; aumente hasta alcanzar los límites de VRAM.
threads Hilos de CPU para las capas que permanecen en la CPU.

Elegir el valor correcto de ngl depende de la VRAM disponible de su GPU — para la selección de GPU y economía de hardware, la guía de hardware de computación es una referencia útil. Para observar el consumo de VRAM en vivo mientras ajusta, consulte las herramientas de monitoreo de GPU para Linux.

Iniciando el servidor con configuración

./llama-server --models-preset /opt/llama.cpp/models.ini --port 8080

Confirme que el servidor inició correctamente:

curl http://localhost:8080/v1/models | jq '.data[].id'

Debería ver cada nombre de sección de su models.ini listado como un ID de modelo.

Una nota sobre estabilidad

La interfaz de configuración INI aún está evolucionando:

  • las banderas pueden cambiar entre commits
  • algunos parámetros solo son reconocidos por configuraciones de compilación específicas
  • la documentación se retrasa respecto a la implementación

Fije a un commit específico de llama.cpp si necesita reproducibilidad entre reinicios.


Uso de la API: cambiando modelos por solicitud

Una vez que el servidor está en ejecución, el cambio de modelos ocurre a través de la API estándar compatible con OpenAI. Simplemente establezca el campo "model".

Listar modelos registrados

curl http://localhost:8080/v1/models

Solicitud de completado — primer modelo

curl http://localhost:8080/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "llama3",
    "messages": [
      {"role": "user", "content": "Explain router mode in one paragraph"}
    ]
  }'

Cambiar a un modelo diferente — mismo endpoint, mismo puerto

curl http://localhost:8080/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "qwen",
    "messages": [
      {"role": "user", "content": "Write a Python function that reads a CSV file"}
    ]
  }'

El servidor maneja el ciclo de descarga/carga de manera transparente. Su código cliente no cambia — solo el campo model.

Ejemplo en Python

Si está usando el cliente Python openai:

from openai import OpenAI

client = OpenAI(base_url="http://localhost:8080/v1", api_key="not-needed")

# Use the coding model
response = client.chat.completions.create(
    model="qwen",
    messages=[{"role": "user", "content": "Write a Go HTTP handler"}],
)
print(response.choices[0].message.content)

# Switch to the chat model — same client, different model name
response = client.chat.completions.create(
    model="llama3",
    messages=[{"role": "user", "content": "What is the capital of Australia?"}],
)
print(response.choices[0].message.content)

Qué sucede internamente

Cuando llega una solicitud para qwen y llama3 está actualmente cargado:

  1. llama3 se descarga de la VRAM
  2. los pesos de qwen se leen desde el disco y se cargan en la VRAM
  3. se ejecuta la inferencia
  4. la siguiente solicitud determina si mantener qwen cargado o intercambiar de nuevo

Esto responde directamente a la pregunta común:

¿Cómo puede un servidor local de LLM cambiar de modelos sin reiniciar?

Cargando modelos dinámicamente por solicitud, no vinculándose en el inicio.


Servicio Systemd: configuración lista para producción

Crear un usuario dedicado y directorios

sudo useradd --system --shell /usr/sbin/nologin --home-dir /opt/llama.cpp llm
sudo mkdir -p /opt/llama.cpp/models
sudo chown -R llm:llm /opt/llama.cpp

Copie su binario y la configuración del modelo en su lugar:

sudo cp build/bin/llama-server /opt/llama.cpp/
sudo cp models.ini /opt/llama.cpp/

/etc/systemd/system/llama-server.service

[Unit]
Description=Llama.cpp Router Server
After=network.target

[Service]
Type=simple
User=llm
WorkingDirectory=/opt/llama.cpp
ExecStart=/opt/llama.cpp/llama-server --models-preset /opt/llama.cpp/models.ini --port 8080
Restart=always
RestartSec=5

Environment=LLAMA_LOG_LEVEL=info

[Install]
WantedBy=multi-user.target

Habilitar e iniciar

sudo systemctl daemon-reload
sudo systemctl enable llama-server
sudo systemctl start llama-server

Verificar e inspeccionar registros

sudo systemctl status llama-server
journalctl -u llama-server -f

En un inicio exitoso, verá líneas indicando que el servidor está escuchando y que el registro de modelos ha sido cargado. Una verificación rápida de sentido común:

curl -s http://localhost:8080/v1/models | jq '.data[].id'

Ahora tiene un servicio persistente con reinicio automático y cambio centralizado de modelos — sin necesidad de gestión manual de procesos. Si desea aplicar el mismo patrón a otros binarios, alojar cualquier ejecutable como un servicio en Linux recorre el enfoque general.

La bandera --metrics de llama-server expone un endpoint compatible con Prometheus. Para paneles específicos de llama.cpp, consultas PromQL y reglas de alerta, consulte la guía de monitoreo de inferencia de LLM. Para la configuración de observabilidad más amplia, la guía de observabilidad cubre la pila completa.


Limitaciones que necesita entender

El modo router es genuinamente útil, pero viene con compensaciones que debe tener claras antes de confiar en él en producción.

Solo un modelo en memoria a la vez

Aunque múltiples modelos están definidos en models.ini, solo uno reside en la VRAM por trabajador en cualquier momento dado. Cambiar significa un ciclo completo de descarga y recarga.

  • cambiar implica recargar
  • el pico de latencia es inevitable
  • en un modelo típico de 7B en Q5, una recarga puede tomar de 3 a 10 segundos dependiendo de la velocidad del disco y el ancho de banda de la VRAM

Esto responde a otra pregunta clave:

¿llama.cpp admite servir múltiples modelos a la vez?

No realmente. Admite múltiples definiciones, no residencia simultánea. Si necesita dos modelos genuinamente cargados en paralelo, necesita dos procesos en dos GPUs separadas.

Para consumo de VRAM medido y tokens por segundo a través de tamaños de modelo, los benchmarks de rendimiento de LLM cubren el panorama completo. Para números específicos de llama.cpp en una GPU de 16 GB — modelos densos y MoE en múltiples tamaños de contexto — consulte los benchmarks de llama.cpp para VRAM de 16 GB.

Sin caché inteligente

A diferencia de Ollama, que mantiene un pool cálido y descarta modelos basándose en la recencia:

  • no existe una estrategia automática de eliminación de modelos
  • no hay precalentamiento en segundo plano
  • no hay cola de prioridad para modelos usados con frecuencia

Si envía solicitudes alternadas para llama3 y mistral, cada sola solicitud desencadena una recarga. Este es el costo fundamental de estar más cerca del metal.

La latencia es impredecible para cargas de trabajo mixtas

Una carga de trabajo bien comportada que use un modelo consistentemente será rápida. Una carga de trabajo que intercale múltiples modelos será lenta. Planifique su lógica de enrutamiento de cliente en consecuencia — agrupe solicitudes por modelo cuando sea posible.

La configuración no es estable

El soporte INI existe y funciona en la mayoría de las compilaciones recientes, pero no está totalmente estandarizado. Las banderas y nombres de parámetros han cambiado entre versiones. Si actualiza llama-server, pruebe su models.ini contra la nueva compilación antes de desplegar.


Llama.cpp vs Ollama: comparación honesta

Característica router llama.cpp Ollama
Carga dinámica
Cambio de modelo
Registro integrado Parcial (INI) Sí (basado en pull)
Gestión de memoria Básica Avanzada
Eliminación de modelo Ninguna Basada en TTL
Pulido de UX Bajo Alto
Compatibilidad API OpenAI
Control Máximo Opinión propia
Estabilidad de configuración Experimental Estable

Perspectiva opiniones

Elija el modo router de llama.cpp cuando quiera:

  • control máximo sobre parámetros de tiempo de ejecución por modelo
  • sobrecarga de proceso mínima
  • acceso directo a banderas de llama.cpp sin capas de abstracción
  • una base hackeable para herramientas personalizadas

Elija Ollama cuando quiera:

  • una experiencia estable y pulida
  • descarga y versionado automático de modelos
  • mantenimiento en vida y eliminación inteligente sin configuración
  • todo incluido desde el día uno

Ninguno está equivocado. La elección depende de cuánto quiera gestionar usted mismo.

Si va con Ollama, la hoja de trucos de CLI de Ollama cubre comandos del día a día. Para una comparación más amplia que también incluye vLLM, LM Studio y LocalAI, consulte cómo se comparan los diferentes entornos de ejecución locales en 2026.


Llama.cpp vs llama-swap

llama-swap es un orquestador externo que se sitúa frente a una o más instancias de llama-server:

  • intercepta solicitudes e inspecciona el campo model
  • inicia el proceso llama-server apropiado para ese modelo
  • apaga instancias inactivas después de un tiempo de espera configurable
  • hace proxy de la solicitud una vez que el modelo está listo

Para una configuración práctica, consulte la guía de inicio rápido de llama-swap.

Diferencia clave

Aspecto modo router llama-swap
Integrado No (binario separado)
Madurez Experimental Más estable
Flexibilidad Limitada Alta
Capa de control Interna Proxy externo
Configuración por modelo Archivo INI Archivo YAML
Modelo de proceso Proceso único Un proceso por modelo

Cuándo usar llama-swap

llama-swap le da aislamiento a nivel de proceso por modelo, lo que significa que un error en una instancia de modelo no afecta a las otras. También permite que cada modelo se ejecute con banderas llama-server completamente independientes.

Úselo si necesita:

  • mejor control de ciclo de vida y aislamiento
  • lógica de cambio más inteligente con tiempos de espera inactivos configurables
  • latencia más predecible (cada modelo tiene un proceso cálido después de la primera carga)
  • estabilidad de producción hoy, no eventualmente

Cuándo el modo router nativo es suficiente

Use el router integrado si quiere:

  • cero dependencias externas
  • un solo proceso para gestionar
  • despliegue más simple (un binario, un archivo de configuración)
  • pila mínima para desarrollo o configuraciones de un solo usuario

Reflexiones finales

El modo router es un paso significativo hacia adelante para llama-server.

Responde a la demanda de larga data:

¿Qué es el modo router en el servidor llama.cpp?

Es la capa faltante que convierte un binario estático en un servicio de inferencia dinámico — un proceso que puede atender solicitudes para un catálogo entero de modelos.

Pero no está terminado.

Hoy es:

  • suficientemente potente para cargas de trabajo reales
  • prometedor como base para enrutamiento más sofisticado
  • ligeramente áspero en los bordes de configuración y estabilidad

Si su carga de trabajo es predecible y puede agrupar solicitudes por modelo, el modo router funciona bien hoy. Si necesita fiabilidad de grado de producción y aislamiento por modelo, opte por llama-swap mientras la implementación nativa madura.

Cuando necesite liberar VRAM sin reiniciar — para una ejecución de benchmark, una ventana de mantenimiento o un reinicio limpio de desarrollo — el enfoque scriptable es listar los modelos cargados y llamar al endpoint de descarga para cada uno. El patrón completo de curl y jq se cubre en Descargar Todos los Modelos del Router de llama.cpp Sin Reiniciar.

De cualquier manera, obtiene comportamiento similar a Ollama, sin ocultar la maquinaria.

Suscribirse

Recibe nuevas publicaciones sobre sistemas, infraestructura e ingeniería de IA.