Cómo Ollama maneja 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.

Para obtener más información sobre el throughput, la latencia, la VRAM y los benchmarks en diferentes entornos de ejecución y hardware, consulte LLM Performance: Benchmarks, Bottlenecks & Optimization.

cinco llamas asombrosas 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 inferencia en CPU, VRAM para 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 puede ajustarse.

  • Agrupamiento: 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 las solicitudes estén disponibles.

Colas y límites

  • Colas: Si el número de solicitudes concurrentes supera 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 según el principio de primer entrado, primer 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 reciben un error 503 que indica que el servidor está sobrecargado.

  • Carga de modelos: El número de modelos diferentes que pueden cargarse 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 el modelo se cargue.

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 podría 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 la memoria esté 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 cuente con 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 las 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 (First-In, First-Out) 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 reciben 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 está limitado por 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 falla

Agotamiento crítico de memoria: Cuando incluso las solicitudes en cola exceden los recursos disponibles, Ollama puede:

  • Paginar a disco (reduciendo severamente el rendimiento)
  • Devolver errores “out of memory”
  • En casos extremos, cerrar la instancia del modelo
Configuración que controla la configuración Propósito Valor predeterminado
OLLAMA_MAX_QUEUE Número 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 la memoria y ajustar estos parámetros según las capacidades del 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 de GPU con export OLLAMA_CUDA=1 y establecer hilos de CPU mediante export OLLAMA_NUM_THREADS=84. Mejoras de 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 costo de la memoria
  • Descarga automática de modelos: Permite que Ollama elimine modelos inactivos de la memoria
  • Caché de modelos utilizados con frecuencia: Mantener modelos comunes residentes en memoria

Monitoreo y solución de problemas

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

Ejemplo de flujo de trabajo de optimización:

# Usar un modelo cuantizado con aceleración de 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 juntas y procesarlas como una unidad. Esto permite un uso más eficiente de los recursos computacionales, especialmente cuando se ejecuta en hardware que beneficia de operaciones paralelizadas (como GPUs).

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

El agrupamiento es especialmente eficaz cuando las solicitudes son similares en tamaño y complejidad, ya que permite una mejor utilización 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, según 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, según la memoria disponible).

Cuando las solicitudes superan 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.

Para más benchmarks, ajustes de concurrencia y orientación sobre el rendimiento, consulte nuestro LLM Performance: Benchmarks, Bottlenecks & Optimization.

Enlaces útiles