Como o Ollama Processa Requisições Paralelas

Compreenda a concorrência do Ollama, o enfileiramento e como ajustar OLLAMA_NUM_PARALLEL para solicitações paralelas estáveis.

Conteúdo da página

Este guia explica como o Ollama gerencia solicitações paralelas (concorrência, filas e limites de recursos) e como ajustá-lo usando a variável de ambiente OLLAMA_NUM_PARALLEL (e parâmetros relacionados).

Links de navegação: O que é OLLAMA_NUM_PARALLEL? · Receitas rápidas de ajuste · Como funciona a fila · Solução de problemas · Relacionado: Folha de dicas dos comandos do CLI do Ollama

Para mais informações sobre taxa de transferência, latência, VRAM e benchmarks entre tempos de execução e hardwares, veja Desempenho de LLM: Benchmarks, Gargalos & Otimização.

Agentes de várias etapas multiplicam as tentativas quando a amostragem é instável; para configurações padrão de temperatura, top_p e penalidades em modelos da classe Qwen e Gemma, veja parâmetros de inferência agêntica para Qwen e Gemma.

cinco lhamas incríveis estão de pé no campo

Processamento de Solicitações Concorrentes

  • Processamento Paralelo: O Ollama suporta o processamento concorrente de solicitações. Se o sistema tiver memória disponível suficiente (RAM para inferência de CPU, VRAM para inferência de GPU), vários modelos podem ser carregados ao mesmo tempo, e cada modelo carregado pode lidar com várias solicitações em paralelo. Isso é controlado pela variável de ambiente OLLAMA_NUM_PARALLEL, que define o número máximo de solicitações paralelas que cada modelo pode processar simultaneamente. Por padrão, isso é definido como 4 (ou 1, dependendo da disponibilidade de memória), mas pode ser ajustado.

  • Agrupamento (Batching): Quando várias solicitações para o mesmo modelo chegam simultaneamente, o Ollama as agrupa (batch) e as processa juntas. Isso significa que ambas as solicitações são processadas em paralelo e os usuários verão as respostas sendo transmitidas ao mesmo tempo. O servidor não espera intencionalmente para preencher um lote; o processamento começa assim que as solicitações estão disponíveis.

Filas e Limites

  • Fila de Espera: Se o número de solicitações concorrentes exceder a paralelismo configurado (por exemplo, mais do que OLLAMA_NUM_PARALLEL solicitações para um modelo), as solicitações adicionais são colocadas em fila. A fila opera de maneira primeira a entrar, primeira a sair (FIFO).

  • Limites da Fila: O número máximo de solicitações em fila é controlado por OLLAMA_MAX_QUEUE (padrão: 512). Se a fila estiver cheia, novas solicitações recebem um erro 503 indicando que o servidor está sobrecarregado.

  • Carregamento de Modelos: O número de modelos diferentes que podem ser carregados ao mesmo tempo é controlado por OLLAMA_MAX_LOADED_MODELS. Se uma solicitação exigir o carregamento de um novo modelo e a memória for insuficiente, o Ollama descarregará modelos ociosos para liberar espaço, e a solicitação ficará em fila até que o modelo seja carregado.

Cenário de Exemplo

Se duas solicitações para o mesmo modelo chegarem ao mesmo tempo e o paralelismo do servidor estiver definido para pelo menos 2, ambas as solicitações serão processadas juntas em um lote (batch), e ambos os usuários receberão respostas simultaneamente. Se o paralelismo estiver definido como 1, uma solicitação será processada imediatamente e a outra ficará em fila até que a primeira termine.

Se as solicitações forem para modelos diferentes e houver memória suficiente, ambos os modelos podem ser carregados e as solicitações processadas em paralelo. Caso contrário, um modelo pode precisar ser descarregado e a solicitação ficará em fila.

Tabela Resumida

Cenário Resultado
Duas solicitações, mesmo modelo, paralelismo suficiente Ambas processadas juntas em paralelo (agrupadas)
Duas solicitações, mesmo modelo, paralelismo=1 Uma processada, a segunda em fila até a primeira completar
Duas solicitações, modelos diferentes, memória suficiente Ambos os modelos carregados, solicitações processadas em paralelo
Duas solicitações, modelos diferentes, memória insuficiente Uma fica em fila até que a memória esteja disponível ou um modelo seja descarregado

Em resumo, o Ollama é projetado para lidar com múltiplas solicitações simultâneas de forma eficiente, desde que o servidor esteja configurado para concorrência e tenha recursos suficientes. Caso contrário, as solicitações ficam em fila e são processadas em ordem.

Se aumentar o OLLAMA_NUM_PARALLEL não mantiver mais a latência estável e a fila continuar crescendo sob tráfego real, esse é um dos sinais mais claros que deve ser pesado contra a migração para um motor de serviço de propósito específico. Ollama para vLLM: Quando migrar seu servidor de LLM local examina essa decisão, incluindo continuous batching e PagedAttention como os mecanismos que o vLLM usa para impedir que solicitações concorrentes se degradem mutuamente.

Tratamento de Memória Insuficiente

Quando o Ollama encontra memória insuficiente para lidar com solicitações recebidas, ele emprega uma combinação de mecanismos de fila e estratégias de gerenciamento de recursos para manter a estabilidade:

Fila de Solicitações

  • Novas solicitações são colocadas em uma fila FIFO (Primeiro a Entrar, Primeiro a Sair) quando a memória não pode ser alocada imediatamente.
  • O tamanho da fila é controlado por OLLAMA_MAX_QUEUE (padrão: 512 solicitações).
  • Se a fila atingir a capacidade, novas solicitações recebem erros 503 “Servidor Sobrecarregado”.

Gestão de Modelos

  • Modelos ativos podem ser descarregados da memória quando ficarem ociosos para liberar recursos para solicitações em fila.
  • O número de modelos carregados simultaneamente é limitado por OLLAMA_MAX_LOADED_MODELS (padrão: 3× quantidade de GPUs ou 3 para CPU).

Otimização de Memória

  • Tenta processar solicitações em lote (batch) para o mesmo modelo para maximizar a eficiência de memória.
  • Para inferência de GPU, requer alocação total de VRAM por modelo - carregamentos parciais não são suportados.

Cenários de Falha

Esgotamento Crítico de Memória: Quando até mesmo solicitações em fila excedem os recursos disponíveis, o Ollama pode:

  • Fazer paginação para o disco (degradando severamente o desempenho)
  • Retornar erros de “memória insuficiente” (out of memory)
  • Causar a falha (crash) da instância do modelo em casos extremos
Controle de Configuração Propósito Valor Padrão
OLLAMA_MAX_QUEUE Máximo de solicitações em fila 512
OLLAMA_NUM_PARALLEL Solicitações paralelas por modelo carregado 4 (ou 1 se limitado)
OLLAMA_MAX_LOADED_MODELS Máximo de modelos carregados simultaneamente 3× quantidade de GPUs ou 3

Administradores devem monitorar o uso de memória e ajustar esses parâmetros com base nas capacidades de seus hardwares. O tratamento de memória insuficiente torna-se crucial ao executar modelos maiores (7B+ parâmetros) ou processar múltiplas solicitações concorrentes.

Estratégias de otimização do Ollama

Ative a aceleração de GPU com export OLLAMA_CUDA=1 e defina as threads da CPU via export OLLAMA_NUM_THREADS=84. Melhorias de Hardware

  • RAM: 32GB+ para modelos de 13B, 64GB+ para modelos de 70B
  • Armazenamento: SSDs NVMe para carregamento/alternância de modelos mais rápidos
  • GPU: NVIDIA RTX 3080/4090 com 16GB+ de VRAM para modelos maiores

Estratégias Operacionais

  • Agrupamento de Solicitações: Processa múltiplas consultas simultaneamente para amortizar o sobrecusto de memória
  • Descarregamento Automático de Modelos: Permite que o Ollama limpe modelos ociosos da memória
  • Cache de Modelos Frequentemente Usados: Mantém modelos comuns residentes na memória

Monitoramento e Solução de Problemas

  • Use nvidia-smi (GPU) e htop (CPU/RAM) para identificar gargalos
  • Para erros de memória:
  • Faça upgrade para modelos quantizados
  • Reduza as solicitações concorrentes
  • Aumente o espaço de swap (espaço de troca)

Exemplo de fluxo de otimização:

### Use modelo quantizado com aceleração de GPU
export OLLAMA_CUDA=1
ollama run llama2:7b-q4_0 --context-size 2048

### Limite modelos carregados e solicitações paralelas
export OLLAMA_MAX_LOADED_MODELS=2
export OLLAMA_NUM_PARALLEL=4

Esses ajustes podem reduzir o uso de memória em 30-60%, mantendo a qualidade da resposta, o que é particularmente benéfico ao executar múltiplos modelos ou lidar com volumes altos de solicitações.

Variável de ambiente OLLAMA_NUM_PARALLEL

OLLAMA_NUM_PARALLEL controla quantas solicitações o Ollama executará em paralelo. Se você enviar várias solicitações ao mesmo servidor Ollama, esta configuração determina em grande parte se elas serão executadas simultaneamente ou colocadas em fila.

  • Valores maiores podem aumentar a taxa de transferência se você tiver CPU/GPU/VRAM suficiente, mas podem aumentar a latência e a pressão sobre a memória.
  • Valores menores reduzem a disputa por recursos (contention) e podem melhorar a estabilidade, mas as solicitações ficarão em fila com mais frequência.

A memória, especificamente, escala com OLLAMA_NUM_PARALLEL * OLLAMA_CONTEXT_LENGTH: quatro slots paralelos com uma configuração de contexto de 32K reservam o cache KV como se uma única sequência de 128K estivesse carregada, mesmo antes que qualquer solicitação o use. Em um cartão de 16 GB, essa matemática de orçamento geralmente importa mais do que o comportamento da fila — veja Cache KV em GPUs de 16 GB para o orçamento completo de VRAM e por que OLLAMA_NUM_PARALLEL=1 é geralmente o ponto de partida correto para uma única sessão de contexto longo.

Como definir OLLAMA_NUM_PARALLEL

Linux / macOS (serviço systemd ou shell):

export OLLAMA_NUM_PARALLEL=2
ollama serve

Execução única (prefixo apenas para este comando):

OLLAMA_NUM_PARALLEL=2 ollama serve

Docker (exemplo):

docker run --rm -e OLLAMA_NUM_PARALLEL=2 -p 11434:11434 ollama/ollama

Como escolher um valor

Comece com 1–2 para uma GPU única / VRAM limitada, e depois aumente gradualmente monitorando:

  • Uso de VRAM da GPU (OOM / evições)
  • Uso de CPU e média de carga (load average)
  • Latência p95 das suas solicitações típicas
  • Taxa de erro / timeouts

Se você estiver otimizando uma página específica para uso de CLI, veja a seção Ollama CLI na folha de dicas, além de exemplos de comandos para ollama serve, ollama ps e ollama run.

Receitas rápidas de ajuste

Foco em Estabilidade

  • OLLAMA_NUM_PARALLEL=1
  • Use modelos menores / quantizados
  • Prefira tamanhos de contexto menores

Foco em Taxa de Transferência

  • OLLAMA_NUM_PARALLEL=2 (ou maior se você tiver folga)
  • Considere o agrupamento de solicitações na camada do cliente
  • Garanta VRAM e threads de CPU suficientes

“Estou sem VRAM quando duas solicitações chegam”

  • Reduza o OLLAMA_NUM_PARALLEL
  • Use um modelo mais agressivamente quantizado
  • Reduza o comprimento do contexto / tokens máximos

Solução de Problemas

Sinais de que OLLAMA_NUM_PARALLEL é alto demais

  • Solicitações falham intermitentemente sob carga
  • OOM de GPU / descarregamento de modelo ocorre com frequência
  • Picos de latência quando a segunda solicitação chega

Sinais de que OLLAMA_NUM_PARALLEL é baixo demais

  • CPU/GPU está subutilizada
  • Atrasos da fila dominam o tempo total de resposta

Dica: Se você também controla seu cliente, adicione retries com jitter e conexões keep-alive. Muitos problemas de “Ollama é lento” são realmente fila + sobrecarga de conexão.

Ollama: Agrupamento de Solicitações vs Execução Paralela

Agrupamento (Batching) no Ollama refere-se à prática de agrupar várias solicitações recebidas e processá-las como uma unidade. Isso permite um uso mais eficiente dos recursos computacionais, especialmente quando executado em hardware que se beneficia de operações paralelizadas (como GPUs).

Quando várias solicitações para o mesmo modelo chegam simultaneamente, o Ollama pode processá-las juntas em um lote (batch) se a memória permitir. Isso aumenta a taxa de transferência e pode reduzir a latência para cada solicitação, pois o modelo pode aproveitar operações de matriz otimizadas sobre o lote.

O agrupamento é particularmente eficaz quando as solicitações são semelhantes em tamanho e complexidade, pois isso permite uma melhor utilização do hardware.

Execução paralela no Ollama significa lidar com múltiplas solicitações ao mesmo tempo, seja para o mesmo modelo ou para modelos diferentes, dependendo da memória disponível e da configuração.

O Ollama suporta dois níveis de paralelismo:

  • Carregamento de Vários Modelos: Se houver memória suficiente, vários modelos podem ser carregados e atender solicitações simultaneamente.
  • Solicitações Paralelas por Modelo: Cada modelo carregado pode processar várias solicitações em paralelo, controlado pela configuração OLLAMA_NUM_PARALLEL (padrão é 1 ou 4, dependendo da memória).

Quando as solicitações excedem o limite de paralelismo, elas são colocadas em fila (FIFO) até OLLAMA_MAX_QUEUE.

Conclusão

O Ollama utiliza tanto o agrupamento (batching) quanto a execução paralela para processar várias solicitações de forma eficiente. O agrupamento agrupa solicitações para processamento simultâneo, enquanto a execução paralela permite que múltiplas solicitações (ou modelos) sejam executadas concorrentemente. Ambos os métodos dependem da memória do sistema e são configuráveis para desempenho ótimo.

Para mais benchmarks, ajustes de concorrência e orientações de desempenho, verifique nosso hub Desempenho de LLM: Benchmarks, Gargalos & Otimização.

Subscrever

Receba novos artigos sobre sistemas, infraestrutura e engenharia de IA.