Cómo Ollama maneja las solicitudes en paralelo

Configurando ollama para la ejecución de solicitudes en paralelo.

Índice

Cuando el servidor Ollama recibe dos solicitudes al mismo tiempo, su comportamiento depende de su configuración y de los recursos del sistema disponibles.

cinco llamas increíbles están de pie en el campo

Manejo de solicitudes concurrentes

  • Procesamiento paralelo: Ollama admite el procesamiento concurrente de solicitudes. Si el sistema tiene suficiente memoria disponible (RAM para la inferencia en CPU, VRAM para la inferencia en GPU), varios modelos pueden cargarse al mismo tiempo, y cada modelo cargado puede manejar varias solicitudes en paralelo. Esto se controla mediante la variable de entorno OLLAMA_NUM_PARALLEL, que establece el número máximo de solicitudes en paralelo que cada modelo puede procesar simultáneamente. Por defecto, se establece en 4 (o 1, dependiendo de la disponibilidad de memoria), pero se puede ajustar.

  • Agrupación: Cuando llegan varias solicitudes para el mismo modelo al mismo tiempo, Ollama las agrupa y las procesa juntas. Esto significa que ambas solicitudes se manejan en paralelo, y los usuarios verán las respuestas fluyendo de vuelta al mismo tiempo. El servidor no espera intencionalmente para llenar un lote; el procesamiento comienza tan pronto como estén disponibles las solicitudes.

Colas y límites

  • Colas: Si el número de solicitudes concurrentes excede la paralelización configurada (por ejemplo, más de OLLAMA_NUM_PARALLEL solicitudes para un modelo), las solicitudes adicionales se colocan en una cola. La cola opera en un orden primero entrado, primero atendido (FIFO).

  • Límites de cola: El número máximo de solicitudes en cola se controla mediante OLLAMA_MAX_QUEUE (valor predeterminado: 512). Si la cola está llena, las nuevas solicitudes recibirán un error 503 que indica que el servidor está sobrecargado.

  • Carga de modelos: El número de modelos diferentes que se pueden cargar al mismo tiempo se controla mediante OLLAMA_MAX_LOADED_MODELS. Si una solicitud requiere cargar un nuevo modelo y la memoria es insuficiente, Ollama descargará modelos inactivos para hacer espacio, y la solicitud se colocará en cola hasta que se cargue el modelo.

Escenario de ejemplo

Si dos solicitudes para el mismo modelo llegan al mismo tiempo y la paralelización del servidor se establece en al menos 2, ambas solicitudes se procesarán juntas en un lote, y ambos usuarios recibirán respuestas concurrentemente. Si la paralelización se establece en 1, una solicitud se procesará inmediatamente, y la otra se colocará en cola hasta que la primera finalice.

Si las solicitudes son para modelos diferentes y hay suficiente memoria, ambos modelos pueden cargarse y las solicitudes se manejarán en paralelo. Si no, un modelo puede necesitar descargarse, y la solicitud se colocará en cola.

Tabla de resumen

Escenario Resultado
Dos solicitudes, mismo modelo, suficiente paralelización Ambas procesadas juntas en paralelo (agrupadas)
Dos solicitudes, mismo modelo, paralelización=1 Una procesada, segunda en cola hasta que la primera finalice
Dos solicitudes, modelos diferentes, suficiente memoria Ambos modelos cargados, solicitudes procesadas en paralelo
Dos solicitudes, modelos diferentes, no suficiente memoria Una en cola hasta que haya memoria disponible o un modelo se descargue

En resumen, Ollama está diseñado para manejar múltiples solicitudes simultáneas de manera eficiente, siempre que el servidor esté configurado para la concurrencia y tenga suficientes recursos. De lo contrario, las solicitudes se colocan en cola y se procesan en orden.

Manejo de insuficiencia de memoria

Cuando Ollama encuentra una insuficiencia de memoria para manejar solicitudes entrantes, emplea una combinación de mecanismos de cola y estrategias de gestión de recursos para mantener la estabilidad:

Cola de solicitudes

  • Las nuevas solicitudes se colocan en una cola FIFO (primero en entrar, primero en salir) cuando no se puede asignar memoria inmediatamente.
  • El tamaño de la cola se controla mediante OLLAMA_MAX_QUEUE (valor predeterminado: 512 solicitudes).
  • Si la cola alcanza su capacidad, las nuevas solicitudes recibirán errores 503 “Servidor sobrecargado”.

Gestión de modelos

  • Los modelos activos pueden descargarse de la memoria cuando se vuelven inactivos para liberar recursos para las solicitudes en cola.
  • El número de modelos cargados simultáneamente se limita mediante OLLAMA_MAX_LOADED_MODELS (valor predeterminado: 3×GPU o 3 para CPU).

Optimización de memoria

  • Se intenta procesar en lotes las solicitudes para el mismo modelo para maximizar la eficiencia de la memoria.
  • Para la inferencia en GPU, se requiere una asignación completa de VRAM por modelo; no se admiten cargas parciales.

Escenarios de fallo

Exhaustión crítica de memoria: Cuando incluso las solicitudes en cola exceden los recursos disponibles, Ollama puede:

  • Paginar a disco (reduciendo severamente el rendimiento)
  • Devolver errores “sin memoria disponible”
  • En casos extremos, cerrar la instancia del modelo
Configuración de control Propósito Valor predeterminado
OLLAMA_MAX_QUEUE Máximo de solicitudes en cola 512
OLLAMA_NUM_PARALLEL Solicitudes paralelas por modelo cargado 4 (o 1 si limitado)
OLLAMA_MAX_LOADED_MODELS Máximo de modelos cargados simultáneamente 3×GPU o 3 para CPU

Los administradores deben monitorear el uso de memoria y ajustar estos parámetros según las capacidades de su hardware. El manejo de la insuficiencia de memoria se vuelve crucial al ejecutar modelos más grandes (7B+ parámetros) o al procesar múltiples solicitudes concurrentes.

Estrategias de optimización de Ollama

Habilitar aceleración en GPU con export OLLAMA_CUDA=1 y establecer hilos en CPU con export OLLAMA_NUM_THREADS=84. Mejoras en hardware

  • RAM: 32GB+ para modelos de 13B, 64GB+ para modelos de 70B
  • Almacenamiento: SSD NVMe para una carga y cambio de modelos más rápido
  • GPU: NVIDIA RTX 3080/4090 con 16GB+ VRAM para modelos más grandes

Estrategias operativas

  • Agrupar solicitudes: Procesar múltiples consultas simultáneamente para amortizar el sobrecosto de memoria
  • Descarga automática de modelos: Permite que Ollama elimine modelos inactivos de la memoria
  • Caché de modelos frecuentemente utilizados: Mantener modelos comunes residentes en memoria

Monitoreo y solución de problemas

  • Usar nvidia-smi (GPU) y htop (CPU/RAM) para identificar cuellos de botella
  • Para errores de memoria:
  • Subir a modelos cuantizados
  • Reducir solicitudes concurrentes
  • Aumentar espacio de intercambio

Ejemplo de flujo de trabajo de optimización:

# Usar modelo cuantizado con aceleración en GPU
export OLLAMA_CUDA=1
ollama run llama2:7b-q4_0 --context-size 2048

# Limitar modelos cargados y solicitudes paralelas
export OLLAMA_MAX_LOADED_MODELS=2
export OLLAMA_NUM_PARALLEL=4

Estos ajustes pueden reducir el uso de memoria en un 30-60% manteniendo la calidad de las respuestas, especialmente beneficioso al ejecutar múltiples modelos o manejar altos volúmenes de solicitudes.

Ollama: Agrupamiento de solicitudes vs. Ejecución paralela

El agrupamiento en Ollama se refiere a la práctica de agrupar múltiples solicitudes entrantes y procesarlas como una unidad. Esto permite un uso más eficiente de los recursos computacionales, especialmente cuando se ejecuta en hardware que se beneficia de operaciones paralelizadas (como GPUs).

Cuando llegan múltiples solicitudes para el mismo modelo al mismo tiempo, Ollama puede procesarlas juntas en un lote si hay memoria disponible. Esto aumenta el throughput y puede reducir la latencia de cada solicitud, ya que el modelo puede aprovechar operaciones de matriz optimizadas sobre el lote.

El agrupamiento es especialmente efectivo cuando las solicitudes son similares en tamaño y complejidad, ya que esto permite un mejor aprovechamiento del hardware.

La ejecución paralela en Ollama significa manejar múltiples solicitudes al mismo tiempo, ya sea para el mismo modelo o para modelos diferentes, dependiendo de la memoria disponible y la configuración.

Ollama admite dos niveles de paralelismo:

  • Carga de múltiples modelos: Si hay suficiente memoria disponible, varios modelos pueden cargarse y servir solicitudes simultáneamente.
  • Solicitudes paralelas por modelo: Cada modelo cargado puede procesar varias solicitudes en paralelo, controlado por la configuración OLLAMA_NUM_PARALLEL (el valor predeterminado es 1 o 4, dependiendo de la memoria).

Cuando las solicitudes exceden el límite de paralelismo, se colocan en cola (FIFO) hasta OLLAMA_MAX_QUEUE.

Conclusión

Ollama aprovecha tanto el agrupamiento como la ejecución paralela para procesar múltiples solicitudes de manera eficiente. El agrupamiento agrupa las solicitudes para su procesamiento simultáneo, mientras que la ejecución paralela permite que múltiples solicitudes (o modelos) se ejecuten concurrentemente. Ambos métodos dependen de la memoria del sistema y son configurables para un rendimiento óptimo.

Enlaces útiles