Do Ollama ao vLLM: quando migrar seu servidor local de LLM

Quando migrar do Ollama para o vLLM

Conteúdo da página

Ollama é uma das formas mais simples de executar um modelo de linguagem local, mas a conveniência pode mascarar o momento em que um experimento local se torna um serviço de inferência compartilhado que necessita de melhor agendamento e observabilidade.

É aí que o vLLM se torna relevante. No entanto, migrar do Ollama para o vLLM não é uma atualização automática. É uma troca: você troca parte da simplicidade do Ollama por maior controle sobre batching (loteamento contínuo), gerenciamento de memória, concorrência, inferência distribuída e operações de produção.

Migração do Ollama para o vLLM

Este guia aborda os sinais práticos que indicam quando a migração é justificada, os riscos de migrar cedo demais e uma abordagem em etapas que mantém ambos os servidores executando lado a lado durante a validação. O objetivo é ajudar você a decidir com base em medições, e não em listas de recursos. Para uma visão mais ampla das opções locais, auto-hospedadas e em nuvem, além apenas desses dois runtimes, consulte Hospedagem de LLMs em 2026: Infraestrutura Local, Auto-Hospedada e em Nuvem Comparada.

Ollama e vLLM Resolvem Problemas Diferentes

O Ollama é otimizado primariamente para o consumo conveniente de modelos. Ele oferece aos desenvolvedores uma interface de linha de comando concisa, uma API local, uma biblioteca de modelos, Modelfiles e suporte direto para configurações comuns de desktop e estações de trabalho.

O vLLM é um motor de inferência e uma plataforma de serviço (serving). Suas preocupações centrais são o agendamento de requisições de alto rendimento (throughput), o gerenciamento eficiente da cache de KV (PagedAttention), o loteamento contínuo (continuous batching), o paralelismo de modelos e a compatibilidade com aplicativos construídos para APIs no estilo OpenAI.

Essa distinção é importante porque os dois servidores podem parecer semelhantes por fora. Ambos podem expor uma API de chat, transmitir tokens em streaming, executar modelos quantizados e atender aplicativos locais. Seus modelos operacionais se tornam visivelmente diferentes apenas quando o servidor é submetido a carga sustentada ou concorrente.

Um resumo útil:

Requisito Ollama vLLM
Configuração local rápida Excelente Mais envolvida
Downloads de modelos curados Excelente Geralmente baseado no Hugging Face
Workflow GGUF Suporte de primeira classe Suportado, não é o ponto forte principal
Chat de usuário único Excelente Frequentemente desnecessário
Tráfego de API concorrente Limitado, mas configurável Caso de uso principal
Loteamento contínuo (Continuous batching) Não é o modelo primário Recurso principal
Reuso de cache de prefixo Controle operacional limitado Otimização integrada
Serviço de modelos multi-GPU Limitado em comparação com o vLLM Paralelismo de tensor e pipeline
Métricas de produção Dados básicos de tempo de resposta Endpoint de métricas Prometheus
Ajuste de implantação Mínimo Extensivo

A questão não é qual servidor é universalmente melhor. É se a sua carga de trabalho ainda corresponde ao modelo operacional que torna o Ollama atrativo. Se você quer o panorama completo entre mais do que apenas esses dois runtimes, nossa comparação do Ollama, vLLM, LocalAI, Jan, LM Studio e outras ferramentas de LLM locais cobre o campo mais amplo.

Sinais de que Você Excedeu as Capacidades do Ollama

Uma resposta lenta não justifica, por si só, uma migração. A velocidade de geração é frequentemente limitada pelo tamanho do modelo, quantização, largura de banda de memória, comprimento do prompt ou capacidade da GPU, em vez do motor de inferência. E os sinais de migração mais fortes só aparecem quando a própria forma da carga de trabalho começa a importar.

Múltiplos Usuários Causam Latência Instável

Um servidor local de LLM pode parecer rápido durante um teste isolado e depois degradar bruscamente quando vários clientes se conectam. As requisições começam a esperar atrás de gerações longas, o tempo até o primeiro token (time to first token) se torna inconsistente e um único prompt grande pode afetar todos os que compartilham o modelo.

O Ollama pode processar requisições paralelas, e OLLAMA_NUM_PARALLEL controla quantas requisições um modelo carregado pode tratar simultaneamente — veja como o Ollama lida com requisições paralelas para a mecânica de fila e memória por trás dessa configuração. Esse paralelismo não é gratuito: os requisitos de memória crescem tanto com o número configurado de requisições paralelas quanto com o comprimento do contexto.

Isso é frequentemente o primeiro aviso prático. Uma configuração que funciona para uma conversa de 8K pode se tornar impossível quando quatro clientes reservam cada um um contexto muito maior.

O vLLM é projetado para combinar o trabalho de requisições ativas através do loteamento contínuo. Em vez de tratar cada requisição como um trabalho de inferência isolado, ele atualiza continuamente o lote à medida que sequências chegam, geram tokens e terminam — um modelo de agendamento que geralmente se torna mais valioso à medida que a concorrência aumenta.

Utilização da GPU é Baixa Enquanto as Requisições Estão em Fila

Uma fila não significa necessariamente que a GPU esteja totalmente utilizada. Em um arranjo simples de serviço, o trabalho pode ser serializado mesmo que requisições adicionais pudessem contribuir com computação útil para a etapa de decodificação atual.

O agendador do vLLM é projetado para manter mais trabalho útil em execução. O PagedAttention gerencia a memória da cache de KV em blocos, enquanto o loteamento contínuo permite que sequências ativas entrem e saiam do lote de execução dinamicamente.

O resultado não é garantido em termos de menor latência para cada requisição individual. Sob carga, no entanto, pode produzir um throughput agregado substancialmente melhor e uma utilização de recursos mais previsível.

Prompts Longos Dominam o Tempo Até o Primeiro Token

Assistentes de código de contexto longo, pipelines de RAG (Recuperação Augmentada por Geração) e sessões de agentes podem enviar repetidamente grandes prompts de sistema ou prefixes de documentos compartilhados. Processar esses tokens de entrada é a etapa de pré-preenchimento (prefill), e pode dominar o tempo até o primeiro token.

O vLLM suporta pré-preenchimento em blocos (chunked prefill) e cache automático de prefixos. A cache de prefixos permite que requisições posteriores reutilizem blocos de cache de KV quando a sequência inicial de tokens coincide com um prefixo já processado.

Isso é particularmente útil quando as requisições compartilham:

  • Um prompt de sistema longo
  • As mesmas definições de ferramentas
  • Um resumo de repositório estável
  • Exemplos few-shot repetidos
  • Um prefixo de documento RAG comum
  • Um histórico de conversa compartilhado

A cache de prefixos não torna a geração de saída mais rápida. Ela reduz o cálculo repetido do prompt, portanto, seu benefício depende se as requisições realmente contêm prefixes idênticos reutilizáveis.

Você Precisa de Mais de Uma GPU

Um modelo que não cabe em uma única GPU é um motivo forte para considerar o vLLM. Ele suporta paralelismo de tensor entre GPUs e paralelismo de pipeline entre múltiplos nós ou dispositivos.

Isso não torna a inferência multi-GPU trivial. A largura de banda do interconector de GPU, topologia de PCIe, arquitetura do modelo, memória compartilhada do container e sobreposição de comunicação ainda afetam o desempenho.

Ainda assim, o vLLM fornece um caminho deliberado para inferência distribuída. O Ollama geralmente é um melhor ajuste para um único desktop ou estação de trabalho onde o modelo escolhido já cabe confortavelmente.

Você Precisa de Observabilidade de Nível de Produção

As respostas da API do Ollama expõem campos de tempo úteis, como tempo de carregamento do modelo, tempo de avaliação do prompt, contagem de tokens gerados e duração da geração. Esses valores são suficientes para benchmarking local e logs em nível de aplicativo.

O vLLM expõe métricas compatíveis com Prometheus através do seu endpoint /metrics. Isso facilita o rastreamento de volume de requisições, filas, tempo até o primeiro token, latência entre tokens, uso da cache, preemptions (interrompimentos), throughput e resultados das requisições ao longo do tempo.

Assim que os usuários dependem do serviço, a observabilidade deixa de ser opcional. Sem métricas de fila, cache e latência, é difícil distinguir entre uma GPU subdimensionada, um limite de contexto excessivo, agendamento ruim, carregamento frio do modelo ou simplesmente muitas requisições simultâneas.

Onde o vLLM Realmente Vence

A vantagem mais importante do vLLM não é que ele possa produzir uma resposta mais rápida que o Ollama em todas as máquinas. A vantagem significativa é que ele oferece ao operador mais mecanismos para usar memória e computação de aceleradores caros de forma eficiente entre muitas requisições.

Loteamento Contínuo (Continuous Batching)

O loteamento estático tradicional funciona melhor quando as requisições têm comprimentos de entrada e saída semelhantes. O tráfego de LLMs interativo raramente se comporta dessa forma: um usuário pede uma classificação curta, outro submete um prompt de 20K tokens e um terceiro gera vários milhares de tokens de código.

O loteamento contínuo altera o lote ativo à medida que as requisições progridem. Sequências concluídas saem, novas sequências entram e o motor tenta evitar desperdiçar capacidade do lote em requisições que já terminaram.

Isso melhora o throughput quando o tráfego é concorrente e irregular. Oferece pouco benefício quando um único usuário envia uma requisição de cada vez.

Gerenciamento de Cache de KV Paginada (Paged KV Cache)

Durante a geração, o servidor armazena as chaves e valores de atenção para tokens processados anteriormente. Esta cache de KV pode consumir uma grande quantidade de memória da GPU, especialmente com contextos longos e múltiplas sequências ativas.

O vLLM gerencia esta cache em blocos, em vez de exigir que cada sequência reserve uma única alocação contígua grande. Essa abordagem reduz a fragmentação de memória e permite que a capacidade de cache disponível seja usada de forma mais flexível.

O valor prático é uma maior concorrência dentro do mesmo orçamento de memória. Isso não remove o custo subjacente do contexto longo, mas reduz o desperdício evitável em torno desse custo. Para a aritmética por trás desse custo subjacente — quantos bytes um dado comprimento de contexto realmente precisa e como a precisão da cache (FP8, Q8_0, Q4_0) entra em trade-off com isso em um cartão de 16 GB — veja KV Cache em GPUs de 16 GB.

Cache de Prefixos

Muitas requisições de produção compartilham um início substancial. Agentes habilitados por ferramentas podem enviar esquemas de função idênticos, bots de suporte podem usar os mesmos documentos de política e assistentes de código podem incluir repetidamente as mesmas instruções do repositório.

A cache automática de prefixos pode reutilizar a cache calculada para prefixes correspondentes. É especialmente útil quando um prefixo estável e grande é seguido por um sufixo específico da requisição relativamente pequeno.

É menos útil quando templates, carimbos de tempo, ordem de documentos ou metadados gerados dinamicamente mudam no início de cada prompt. Pequenas diferenças na tokenização podem impedir o prefixo de corresponder.

Inferência Paralela e Distribuída

O vLLM suporta várias formas de paralelismo, incluindo paralelismo de tensor, pipeline, dados, especialista e contexto. Nem toda implantação precisa desses modos, mas sua disponibilidade importa quando um serviço cresce além de uma única GPU.

Para uma estação de trabalho com duas GPUs adequadas, o paralelismo de tensor pode permitir que um modelo maior seja executado em ambos os dispositivos. Para um serviço replicado, o paralelismo de dados pode criar múltiplos réplicas do motor para throughput adicional.

Esses recursos introduzem complexidade operacional. Eles devem ser adotados porque medições demonstram um problema de capacidade, e não porque a inferência distribuída parece mais sofisticada.

Controles de Produção Mais Amplos

O vLLM expõe controles para utilização de memória da GPU, comprimento máximo do modelo, sequências ativas máximas, quantização, tipos de dados da cache, decodificação especulativa}, chamadas de ferramentas (tool calling), saída estruturada, aliases de modelos, chaves de autenticação e execução distribuída.

Essa flexibilidade torna o servidor mais fácil de ajustar para uma carga de trabalho específica, mas também cria mais oportunidades para uma configuração inválida ou ineficiente. Migrar para o vLLM significa assumir a responsabilidade por essas decisões.

Onde o Ollama Ainda Vence

Um guia de migração não deve tratar o Ollama como uma ferramenta preliminar inferior. Para muitas implantações locais, ele permanece o melhor servidor.

Estações de Trabalho Pessoais

Para um único desenvolvedor usando uma interface de chat, assistente de código ou API local ocasional, as vantagens operacionais do vLLM podem nunca compensar sua configuração adicional.

O Ollama instala rapidamente, baixa modelos através de um registry simples e oculta muitos detalhes específicos do modelo. É bem adequado para experimentação e uso privado em desktop.

Coleções de Modelos GGUF

O Ollama tem um fluxo de trabalho natural em torno de modelos GGUF e Modelfiles. Usuários existentes podem ter quantizações curadas, adaptadores, templates, prompts de sistema e parâmetros que funcionam de forma confiável com seu hardware.

O vLLM suporta GGUF, mas seu caminho mais forte é geralmente através de repositórios de modelos do Hugging Face suportados e formatos de quantização como AWQ, GPTQ, BitsAndBytes, FP8 ou formatos específicos de fornecedores. Migrar uma implantação existente de GGUF para o vLLM sem avaliar um formato de checkpoint mais nativo pode preservar a inconveniência da migração enquanto perde algumas das vantagens de desempenho.

Descarga Mista para CPU e GPU

A inferência em desktop às vezes depende da descarga parcial para GPU porque o modelo inteiro não cabe na VRAM. Isso pode ser prático para uso ocasional, particularmente quando a latência não é crítica.

O vLLM é geralmente mais atraente quando o modelo e a capacidade de cache de KV necessária podem ser atendidos efetivamente pela configuração de aceleradores disponível. Uma carga de trabalho que depende fortemente da RAM do sistema e da descarga para CPU pode ser mais adequada ao Ollama ou llama.cpp.

Troca Rápida de Modelos

O Ollama torna fácil baixar, executar, parar e alternar entre muitos modelos locais. Isso é útil para avaliação, escrita, codificação, embeddings, visão e experimentação ad hoc.

Uma implantação do vLLM é mais comumente construída em torno de um modelo selecionado deliberadamente que permanece carregado como um serviço. A implantação de múltiplos modelos é possível, mas requer mais planejamento explícito de recursos.

Administração Mínima

O Ollama é intencionalmente opinativo. Isso pode ser uma limitação sob carga, mas é uma vantagem quando ninguém quer manter uma plataforma de inferência, e se o servidor local tiver um único usuário, latência aceitável e nenhuma fila significativa, a migração provavelmente criará trabalho em vez de removê-lo.

Não Migre Baseado Apenas em Tokens por Segundo

A velocidade de geração de tokens para uma única requisição é um benchmark incompleto. Dois servidores podem produzir throughput de decodificação semelhante para uma sequência, mas se comportar de forma muito diferente com oito clientes concorrentes.

Uma avaliação útil deve medir pelo menos:

  • Tempo até o primeiro token
  • Latência entre tokens
  • Latência da requisição de ponta a ponta
  • Throughput de processamento do prompt
  • Throughput de tokens de saída
  • Requisições concluídas por minuto
  • Tempo de espera na fila
  • Consumo de memória da GPU
  • Utilização da GPU
  • Taxa de falha e timeout

Execute a mesma família de modelos, precisão, comprimento do contexto, conjunto de prompts, limite de saída e nível de concorrência em ambos os servidores. Caso contrário, o teste tem mais probabilidade de comparar o empacotamento do modelo e a configuração do que os motores de inferência.

A comparação mais útil é um pequeno teste de carga que represente seu tráfego real. Para um assistente de código compartilhado, isso pode incluir prompts de sistema longos, prefixes repetidos, respostas em streaming e duas a oito sessões simultâneas.

Planeje a Migração do Modelo Primeiro

Os nomes dos modelos do Ollama não mapeiam automaticamente para identificadores de modelo equivalentes do vLLM. Um pacote do Ollama pode conter uma quantização GGUF específica, template de prompt, configuração de tokens de parada e parâmetros padrão.

Antes de mudar o servidor, identifique:

  1. A família de modelos original e a versão
  2. Se é um modelo base ou instruído (instruction-tuned)
  3. A quantização atual e a precisão efetiva
  4. O template de prompt ou chat
  5. O comprimento do contexto configurado
  6. Tokens de parada e padrões de geração
  7. Requisitos de chamadas de ferramentas ou saída estruturada
  8. Quaisquer adaptadores LoRA ou prompts de sistema personalizados

Em seguida, escolha um checkpoint suportado pelo vLLM que corresponda ao comportamento pretendido. Não assuma que um checkpoint AWQ ou FP8 se comportará identicamente ao build GGUF usado anteriormente no Ollama — a migração do modelo é frequentemente mais significativa do que a migração da API.

Verifique a VRAM Antes de Iniciar o vLLM

Um modelo cabendo na memória da GPU não significa que ele pode atender à carga de trabalho necessária. A VRAM deve cobrir mais do que apenas os pesos do modelo.

O orçamento de memória prático inclui:

pesos do modelo
+ KV cache
+ grafos CUDA e alocações de runtime
+ espaço de trabalho temporário
+ caches do processador multimodal, se usados
+ margem de segurança

Contextos longos e sequências concorrentes expandem primariamente o requisito de KV cache. Portanto, aumentar o comprimento máximo do contexto reduz o número de requisições simultâneas que podem caber, mesmo se a maioria das requisições nunca usar o limite total.

Comece com um valor realista de --max-model-len, em vez do maior valor anunciado pelo modelo, e evite definir a utilização da memória da GPU agressivamente ao ponto de variações menores da carga de trabalho causem falhas de memória insuficiente (out-of-memory). Um serviço estável com capacidade teórica ligeiramente menor é mais útil do que um que falha no primeiro pico de tráfego.

Uma Implantação Mínima do vLLM com Docker Compose

O exemplo a seguir inicia um servidor vLLM compatível com a OpenAI na porta 8000:

services:
  vllm:
    image: vllm/vllm-openai:latest
    container_name: vllm
    restart: unless-stopped
    ports:
      - "8000:8000"
    ipc: host
    gpus: all
    volumes:
      - ${HOME}/.cache/huggingface:/root/.cache/huggingface
    environment:
      HF_TOKEN: ${HF_TOKEN:-}
    command:
      - --model
      - Qwen/Qwen3-8B
      - --served-model-name
      - local-model
      - --max-model-len
      - "16384"
      - --gpu-memory-utilization
      - "0.90"
      - --api-key
      - ${VLLM_API_KEY:-change-me}

Crie um arquivo de ambiente:

cat > .env <<'EOF'
HF_TOKEN=
VLLM_API_KEY=replace-with-a-long-random-value
EOF

Inicie o servidor:

docker compose up -d

Verifique os logs:

docker compose logs -f vllm

Teste o endpoint de modelos:

curl http://localhost:8000/v1/models \
  -H "Authorization: Bearer replace-with-a-long-random-value"

Envie uma requisição de chat:

curl http://localhost:8000/v1/chat/completions \
  -H "Authorization: Bearer replace-with-a-long-random-value" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "local-model",
    "messages": [
      {
        "role": "user",
        "content": "Explain continuous batching in two paragraphs."
      }
    ],
    "temperature": 0.2,
    "max_tokens": 300,
    "stream": false
  }'

Para uma implantação mantida, fixe a imagem para uma release de vLLM testada, em vez de mantê-la em latest. Revise as notas de release antes de atualizar, pois opções de linha de comando, implementações de modelos, métricas e comportamento do motor podem evoluir. Este arquivo Compose é intencionalmente mínimo; para o guia de configuração mais completo — compatibilidade com a API da OpenAI, ajuste do PagedAttention e uma comparação mais profunda do vLLM com o Ollama — veja o Início Rápido do vLLM.

A Compatibilidade com a API da OpenAI Não É Intercambiabilidade Completa

Tanto o Ollama quanto o vLLM fornecem endpoints compatíveis com a OpenAI, o que pode tornar a migração do aplicativo relativamente pequena. Em muitos clientes, mudar a URL base, a chave de API e o nome do modelo é suficiente para estabelecer uma conexão.

Por exemplo:

from openai import OpenAI

client = OpenAI(
    base_url="http://localhost:8000/v1",
    api_key="replace-with-a-long-random-value",
)

response = client.chat.completions.create(
    model="local-model",
    messages=[
        {
            "role": "user",
            "content": "What should I monitor on an LLM server?",
        }
    ],
    temperature=0.2,
)

print(response.choices[0].message.content)

A compatibilidade ainda deve ser testada em nível de recurso. Examine:

  • Comportamento de eventos em streaming
  • Parâmetros de requisição suportados
  • Seleção de template de chat
  • Análise de chamadas de ferramentas (tool-call parsing)
  • Tratamento de saída de raciocínio (reasoning)
  • Saída com restrições de JSON ou schema
  • Endpoints de embeddings
  • Entradas multimodais
  • Relatórios de uso de tokens
  • Formatos de resposta de erro
  • Descoberta de nomes de modelos
  • Aplicação de limites de comprimento de contexto

Um cliente que apenas envia completamentos de chat comuns geralmente será mais fácil de migrar do que um framework de agente que depende de um analisador de chamadas de ferramentas específico ou de uma extensão não padrão.

Templates de Chat são uma Falha Comum na Migração

Modelos instruídos esperam que as conversas sejam serializadas usando um template de chat específico. O template insere marcadores de papel (role markers), separadores, tokens de controle e prompts de geração no formato usado durante o treinamento.

O Ollama empacota muito desse comportamento dentro de sua definição de modelo. Com o vLLM, o template é normalmente obtido da configuração do tokenizador do modelo, embora um operador possa fornecer um explicitamente.

Um servidor pode iniciar com sucesso mesmo quando o template selecionado está errado. Os sintomas aparecem no comportamento do modelo:

  • O modelo repete rótulos de papel (role labels)
  • As respostas contêm tokens especiais
  • As instruções do sistema são ignoradas
  • As chamadas de ferramentas estão malformadas
  • O modelo continua a mensagem do usuário
  • A qualidade da saída é muito pior do que o esperado

Antes de culpar o motor de inferência, compare o prompt totalmente renderizado usado por cada implantação.

Use uma Migração em Etapas

Substituir um servidor local que funciona em uma única etapa cria risco desnecessário. O Ollama e o vLLM podem executar lado a lado em portas diferentes enquanto você valida a nova implantação.

Etapa 1: Reprodzir Um Modelo

Escolha o modelo responsável pela maior parte do tráfego de API e corresponda seu ajuste de instrução, requisito de contexto, parâmetros de geração e comportamento de chat o mais próximo possível. Não comece movendo todos os modelos experimentais.

Etapa 2: Validar o Comportamento da API

Execute os testes de integração existentes contra o endpoint do vLLM, incluindo streaming, cancelamento, timeouts, chamadas de ferramentas, requisições malformadas, estouro de contexto e acesso concorrente. Registre diferenças de comportamento em vez de escondê-las atrás de novas tentativas do cliente (client retries).

Etapa 3: Estabelecer uma Linha de Base

Meça primeiro o desempenho de uma única requisição. Isso confirma que o modelo está carregado corretamente e fornece uma referência para testes posteriores.

Registre tokens de prompt por segundo, tokens de saída por segundo, tempo até o primeiro token, latência total e uso de memória da GPU.

Etapa 4: Adicionar Concorrência Realista

Teste o número de requisições simultâneas esperado na operação normal e durante um pico plausível, usando comprimentos representativos de prompt e saída em vez de requisições sintéticas idênticas. Observe filas, uso da cache, preemptions (interrompimentos), tempo até o primeiro token e latência de cauda (tail latency).

Etapa 5: Mover Um Cliente

Direcione um aplicativo não crítico ou uma pequena porcentagem do tráfego para o vLLM. Mantenha o Ollama disponível como fallback até que o novo servidor tenha operado de forma confiável sob uso real.

Etapa 6: Ajustar a Partir de Medições

Ajuste o comprimento do modelo, utilização de memória, sequências ativas máximas, cache de prefixos, paralelismo e quantização apenas após identificar uma restrição medida. Alterar vários parâmetros de uma vez torna as regressões de desempenho difíceis de explicar.

Uma Lista de Verificação Prática de Migração

Antes de mudar os clientes, verifique o seguinte:

[ ] O modelo de destino é suportado pelo vLLM
[ ] O checkpoint e a quantização selecionados cabem na VRAM
[ ] Suficiente VRAM permanece para a KV cache necessária
[ ] O comprimento máximo do contexto reflete o uso real
[ ] O template de chat correto está disponível
[ ] Tokens de parada e padrões de geração são testados
[ ] O streaming funciona com clientes existentes
[ ] Chamadas de ferramentas e saída estruturada são validadas
[ ] O alias público do modelo permanece estável
[ ] A autenticação está habilitada
[ ] O servidor não está exposto diretamente à internet
[ ] As métricas Prometheus são coletadas
[ ] As métricas de GPU são coletadas separadamente
[ ] Os testes de carga incluem concorrência realista
[ ] Timeouts e cancelamentos são tratados
[ ] Um caminho de retorno (rollback) para o Ollama existe

Esta lista é intencionalmente operacional. Instalar o vLLM é geralmente mais fácil do que provar que ele se comporta corretamente para um aplicativo existente.

Segurança e Exposição de Rede

Nem um endpoint local do Ollama nem um endpoint do vLLM devem ser expostos casualmente à internet pública. Um servidor de inferência não autenticado pode consumir capacidade de GPU cara, revelar o comportamento do modelo e se tornar uma rota para ataques de negação de serviço através de prompts ou saídas muito longas.

O vLLM pode exigir uma chave de API para seus endpoints compatíveis com a OpenAI, mas uma chave de API não é um limite de segurança completo. Para acesso compartilhado ou remoto, coloque o serviço atrás de um proxy reverso ou gateway de API que forneça TLS, restrições de rede, limites de tamanho de requisição, limites de taxa, logs de acesso e autenticação apropriada — o mesmo padrão coberto em Ollama atrás de um proxy reverso com Caddy ou Nginx aplica-se igualmente na frente do vLLM.

Considere também riscos específicos do modelo. Carregamento de URLs multimodais, código de modelo personalizado, arquivos remotos e execução de ferramentas irrestrita podem expandir a superfície de ataque além da geração de texto comum.

Quando Não Migrar

Fique com o Ollama quando:

  • Um ou dois usuários acessam o servidor
  • As requisições são majoritariamente sequenciais
  • O modelo já entrega latência aceitável
  • A gestão fácil de GGUF é importante
  • A descarga para CPU ou GPU parcial é necessária
  • Os modelos mudam frequentemente
  • Ninguém quer operar infraestrutura adicional
  • Não há um problema medido de concorrência ou throughput

Uma mudança para o vLLM deve resolver uma limitação concreta. “Produção” não é um limiar mágico que invalida o Ollama, especialmente para um serviço interno com tráfego modesto.

Pelo contrário, não mantenha o Ollama apenas porque ele foi mais fácil de instalar. Se os usuários esperam regularmente em uma fila, prefixes repetidos consomem tempo significativo de pré-preenchimento ou um modelo maior deve ser distribuído entre GPUs, o servidor mais simples pode ter se tornado a escolha mais cara operacionalmente.

Mantenha o Ollama para Desenvolvimento e Adicione o vLLM para Serviço Compartilhado

A arquitetura mais prática muitas vezes não é uma substituição completa. Os desenvolvedores podem manter o [Ollama executando em Docker Compose](https://www.glukhov.org/pt/llm-hosting/ollama/ollama-in-docker-compose/ “Execute Ollama em Docker Compose”}) em suas estações de trabalho para exploração de modelos, testes de GGUF e uso interativo privado, enquanto uma instância compartilhada do vLLM serve um modelo estável para aplicativos e equipes. Essa divisão também importa para a Soberania de IA — manter ambos os runtimes auto-hospedados significa que prompts, pesos e logs de inferência permanecem sob seu controle, independentemente de qual servidor trata uma dada requisição.

Isso separa dois fluxos de trabalho diferentes:

Ollama:
experimentação -> troca de modelos -> ferramentas pessoais -> chat local

vLLM:
modelo selecionado -> endpoint compartilhado -> tráfego concorrente -> monitoramento

O arranjo também reduz o risco de migração. Modelos podem ser testados localmente antes que um checkpoint adequado seja promovido para a implantação compartilhada do vLLM.

Fluxo de Decisão de Migração

O diagrama a seguir resume os pontos de decisão principais:

flowchart TD A[Serviço de LLM com Ollama] --> B{Múltiplos usuários
com latência instável?} B -->|Não| C[Ficar com Ollama] B -->|Sim| D{Prefixos
compartilhados longos?} D -->|Sim| E[Sinal forte para vLLM] D -->|Não| F{Precisa de multi-GPU
ou observabilidade?} F -->|Sim| E F -->|Não| G{Problema de
concorrência medido?} G -->|Não| C G -->|Sim| E E --> H[Planejar migração em etapas] H --> I[Validar lado a lado] I --> J[Mudar clientes gradualmente]

Conclusão

O Ollama é difícil de superar como um executor local de modelos. Ele remove suficiente trabalho de empacotamento e configuração para que os desenvolvedores possam se concentrar no modelo e no aplicativo, em vez da pilha de inferência.

O vLLM se torna a escolha mais forte quando o próprio servidor é o problema a ser projetado. Tráfego concorrente, filas, prefixes longos repetidos, modelos multi-GPU, planejamento de capacidade e observabilidade de produção são os sinais de migração que importam.

Não migre porque o vLLM tem uma lista de recursos mais longa. Migre quando medições mostrarem que o modelo operacional mais simples do Ollama não corresponde mais à carga de trabalho. Até esse ponto, a simplicidade não é uma fraqueza técnica; é uma otimização.

Subscrever

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