O mascote urso-polar da NordBastion sentado em um banco de pedra esculpida em um cofre nórdico escuro, com um laptop no colo, uma treliça neural ciano brilhante selada dentro de um recipiente de vidro hexagonal acima do rack de servidores ao lado dele, e um pequeno fluxo de tokens ciano escorrendo do recipiente até a tela dele, atrás de uma porta rúnica fechada
Tutorial · Agentes de IA·17 min de leitura · 30 min prático

Hospede um LLM em um VPS.
Sem GPU. Sem chave de API. Nenhum prompt sai daqui.

Seis passos até um modelo de linguagem respondendo no seu próprio hardware — a conta que prevê seus tokens por segundo antes de comprar a máquina, qual modelo cabe em 4, 8, 16 ou 32 GB, a autenticação que o Ollama não traz, e uma lista honesta dos trabalhos que não cabem. Testado em Debian 12.

As seis etapas
  1. 01

    Tamanho

    Banda, não núcleos

  2. 02

    Instalar

    Ollama

  3. 03

    Medir

    Seus próprios tokens/s

  4. 04

    Proteger

    TLS + um token

  5. 05

    Conectar

    Uma base URL

  6. 06

    Limitar

    Contexto, RAM, disco

Antes de começar · A conta

Uma conta te diz o que a máquina consegue fazer. Faça-a antes de comprar a máquina.

Quase tudo que se escreve sobre rodar modelos de linguagem localmente fala de placas de vídeo, o que não ajuda muito se o que você tem é uma máquina virtual. O modelo mental útil é mais simples do que o discurso sobre GPU sugere, e cabe em uma frase: para produzir um único token, um modelo denso precisa ler cada um de seus pesos a partir da memória. Não alguns deles — todos, uma vez por token.

Esse único fato resolve toda a questão de desempenho. A velocidade de geração não é decidida por quantos núcleos você aluga; é decidida por quão rápido a máquina consegue transferir o modelo para fora da RAM. O que te dá um teto que você pode calcular de cabeça antes de gastar qualquer coisa:

tokens per second  ≈  memory bandwidth (GB/s)  ÷  model size (GB)

Um modelo de 8B quantizado ocupa cerca de 5 GB. Em um host virtualizado onde você consegue, na prática, transferir algo em torno de 20 GB/s, o teto é de cerca de quatro tokens por segundo, e o número que você realmente observa será talvez de metade a dois terços disso. Aproximadamente três palavras por segundo. Leia isso como um fato sobre a carga de trabalho, não como uma decepção: é lento para uma janela de chat e perfeitamente adequado para uma tarefa que classifica um documento e devolve uma linha de JSON.

Núcleos ainda importam, só que não pelo motivo que as pessoas imaginam. Mais threads ajudam até saturarem o caminho da memória, o que nessas máquinas acontece cedo — geralmente entre quatro e oito threads. Depois desse ponto, os núcleos extras ficam ociosos enquanto tudo espera pela RAM. É por isso que uma máquina de dezesseis núcleos não é quatro vezes mais rápida que uma de quatro núcleos para gerar texto, e por que pagar por núcleos na esperança de velocidade é a forma mais comum de comprar o plano errado.

Ler é rápido, escrever é lento. Há duas fases em cada requisição, e elas se comportam de forma completamente diferente. Processar o prompt — o prefill — é uma operação matricial limitada por computação sobre toda a entrada de uma vez, e roda muitas vezes mais rápido que a geração. Produzir a resposta é a parte limitada por memória descrita acima, um token de cada vez. Então entregar ao modelo um documento de duas mil palavras e pedir três frases de volta é uma carga de trabalho confortável, enquanto pedir a ele um ensaio de duas mil palavras não é. Desenhe seus prompts em torno dessa assimetria, e uma máquina de CPU parece bem melhor do que a sua taxa de tokens sugere.

Nível Memória Maior modelo confortável Ordem de grandeza Para que serve
Sentinel · $3.904 GB3B em Q4 (~2 GB)uma frase por segundoClassificação, marcação, roteamento, embeddings
Garrison · $7.908 GB8B em Q4 (~5 GB)algumas palavras por segundoO padrão. Resumos, extração de JSON, respostas de RAG
Ravelin · $16.9016 GB14B em Q4 (~9 GB)cerca de metade do anteriorRaciocínio mais difícil, contexto longo, pipelines em lote
Bulwark · $32.9032 GB32B em Q4 (~20 GB)menos de uma palavra por segundoQualidade acima de velocidade. Só trabalho assíncrono
Citadel · $62.9064 GB70B em Q4 (~40 GB)minutos por respostaCabe. Não é interativo. Trabalhos noturnos

Os tamanhos de modelo são as quantizações Q4_K_M de sempre, que trocam uma quantidade pequena e geralmente imperceptível de qualidade por menos da metade da memória. A coluna de velocidade é uma ordem de grandeza derivada da conta acima, não um benchmark — o objetivo do passo 03 é que você meça a sua própria máquina em vez de confiar em uma tabela, incluindo esta.

Antes de começar · Ajuste

O que genuinamente cabe em uma CPU. E o que não cabe, dito sem rodeios.

A versão honesta desta seção vale mais do que uma entusiasmada, porque a forma mais rápida de abandonar um modelo auto-hospedado é apontá-lo para a única tarefa em que ele é pior e concluir que a ideia toda era boba.

Cabe com folga. Qualquer coisa em que a saída seja curta e o valor esteja no julgamento, não na prosa. Classificar uma mensagem em uma entre algumas categorias. Decidir se um chamado de suporte é urgente. Extrair cinco campos de uma fatura como JSON. Resumir uma conversa em três frases. Marcar um documento. Reescrever a descrição de um produto. Traduzir uma string curta. Detectar se dois registros descrevem a mesma pessoa. Remover nomes de um parágrafo antes que ele vá para qualquer outro lugar. Cada uma dessas tarefas consome uma entrada longa e produz uma saída curta, que é exatamente a assimetria que uma CPU lida bem.

Cabe, com paciência. Trabalho sem nenhum humano esperando por ele. Lotes noturnos, workers de fila, uma passagem noturna pelos documentos do dia, um relatório agendado. Se nada fica bloqueado esperando a resposta, uma taxa de tokens que seria intolerável em uma janela de chat deixa de importar por completo — uma tarefa que roda por seis minutos às três da manhã é simplesmente uma tarefa que rodou.

Não cabe. Um assistente interativo que as pessoas realmente gostem de usar: nessas taxas, o cursor rasteja e a experiência é pior do que não ter assistente nenhum. Geração de textos longos — escreva-me duas mil palavras — em que toda a saída é a parte lenta. Agentes de codificação que iteram sobre um repositório grande, em que tanto o contexto quanto o nível de qualidade exigido superam o que um modelo pequeno consegue sustentar. Qualquer coisa que precise de um contexto de cem mil tokens, em que só o cache já ultrapassa a máquina. E modelos de imagem ou vídeo, que são uma disciplina completamente diferente e realmente precisam de uma GPU.

Se a sua carga de trabalho vive nesse último grupo, a resposta sensata não é comprar uma máquina de CPU maior — é um híbrido. Mantenha um modelo local para a maior parte das chamadas e direcione as poucas que precisam de raciocínio de ponta para uma API hospedada, que é exatamente o formato que o guia sobre rodar um agente de IA 24/7 descreve para o lado do runtime. Aquele guia deixou o modelo em si deliberadamente fora do escopo. Este é a metade que faltava.

Passo 01 · Tamanho

Compre pensando no modelo, não nos núcleos. E deixe folga.

Trabalhe de trás para frente a partir da tarefa. Decida o que o modelo precisa fazer, escolha o menor tamanho que resolve isso, veja o que esse tamanho ocupa em Q4_K_M, depois some os overheads:

RAM needed  =  model file  +  KV cache  +  ~2 GB for the system

  3B  Q4_K_M  ≈  2.0 GB        KV cache at 8k context   ≈  0.5–1 GB
  8B  Q4_K_M  ≈  4.9 GB        KV cache at 32k context  ≈  2–4 GB
 14B  Q4_K_M  ≈  9.0 GB
 32B  Q4_K_M  ≈ 20.0 GB
 70B  Q4_K_M  ≈ 40.0 GB

O cache de chave-valor é o overhead que as pessoas esquecem. Todo token já presente na conversa é mantido na memória para que o modelo não precise recalculá-lo, e esse armazenamento cresce com o contexto que você permite. Dobrar o contexto praticamente dobra esse armazenamento. Um modelo que cabe com um contexto de 4k pode deixar de caber com 32k, e isso vai falhar na décima requisição, não na primeira, o que faz parecer um mistério em vez de um erro de conta.

Não há degradação graciosa aqui. Quando o total ultrapassa a RAM, o kernel não desacelera educadamente: ele começa a paginar os pesos do modelo de e para o disco, a cada token. Uma geração de quatro segundos vira quatro minutos, o load average sobe para as dezenas, e tudo o mais na máquina — o banco de dados, o servidor web, a sua sessão SSH — sofre junto. Caber na memória não é uma otimização. É o requisito.

No painel: Pedido → VPS → o plano que a conta indicou, imagem Debian 12. Nenhum endereço de e-mail é exigido para abrir a conta, nenhum documento de identidade é pedido em momento algum, e a fatura é quitada em Monero, Bitcoin, Lightning ou qualquer um dos outros ativos aceitos — o que importa mais aqui do que em um servidor web comum, pelos motivos que o guia principal sobre hospedagem de VPS anônimo explica, e que o capítulo de privacidade abaixo aplica especificamente a prompts.

Passo 02 · Instalar

Um comando, um serviço. Vinculado ao loopback, e deixado lá.

Primeiro reforce a segurança da máquina — SSH só com chave, um firewall que não permite nada que você não pediu, atualizações de segurança automáticas. A checklist da primeira hora leva cerca de uma hora, e esta é uma máquina que em breve vai guardar cada pergunta que você fizer a ela.

Depois instale o executor. O Ollama é o llama.cpp com um registro de modelos, uma API REST e uma unidade systemd embrulhados ao redor, e o instalador de uma linha configura os três:

apt update && apt install -y curl
curl -fsSL https://ollama.com/install.sh | sh

systemctl status ollama --no-pager
ss -ltnp | grep 11434
# → 127.0.0.1:11434 — loopback only. Leave it that way.

Essa última linha é a que vale a pena ler duas vezes. Por padrão, o serviço escuta na interface de loopback, o que está exatamente certo, e o erro mais comum cometido nos dez minutos seguintes é definir OLLAMA_HOST como 0.0.0.0 porque algo em outra máquina não conseguia alcançá-lo. O passo 04 mostra a forma correta de alcançá-lo; não existe versão disso em que a porta 11434 fica voltada diretamente para a internet.

Duas configurações valem a pena ser feitas agora em vez de descobertas depois. Os modelos são armazenados por padrão em /usr/share/ollama, e eles são grandes, então aponte isso para onde você tiver espaço. E o padrão mantém um modelo residente na RAM por cinco minutos após a última requisição, o que é generoso em uma máquina que também está fazendo outro trabalho:

systemctl edit ollama
[Service]
Environment="OLLAMA_MODELS=/var/lib/ollama/models"
Environment="OLLAMA_KEEP_ALIVE=30m"
Environment="OLLAMA_NUM_PARALLEL=1"
Environment="OLLAMA_MAX_LOADED_MODELS=1"
systemctl daemon-reload && systemctl restart ollama

Requisições paralelas e múltiplos modelos carregados multiplicam o uso de memória, e em uma máquina dimensionada para segurar exatamente um modelo não sobra um gigabyte para uma segunda cópia. Serializar a fila não é uma limitação deste hardware; é a única configuração que não derruba tudo.

Passo 03 · Medir

Tenha o seu próprio número. O benchmark de ninguém mais é sobre a sua máquina.

Baixe um modelo. Qualquer um dos modelos de instrução atuais da classe 8B serve para uma primeira medição — eles são próximos o suficiente em tamanho para que o tempo medido fale sobre o hardware, não sobre o modelo:

ollama pull llama3.1:8b        # ~4.9 GB at Q4_K_M
ollama list
ollama ps                      # nothing resident yet

Agora rode uma geração com os tempos ativados. O número que importa é a taxa de eval — tokens produzidos por segundo, depois que o prompt foi lido:

ollama run llama3.1:8b --verbose "Reply with exactly one sentence about the Baltic Sea."
total duration:        14.2s
load duration:          3.1s
prompt eval count:        24 token(s)
prompt eval rate:      92.11 tokens/s      ← reading: fast
eval count:               38 token(s)
eval rate:              3.42 tokens/s      ← writing: the real ceiling

Duas linhas, dois mundos diferentes. A leitura rodou a uns noventa e poucos tokens por segundo; a escrita, a três e meio. Essa proporção é a assimetria do capítulo da conta, medida na sua própria máquina, e é o fato mais útil que você vai coletar hoje. Ela diz: dê a esta máquina entradas longas e peça saídas curtas.

A mesma medição através da API, que é o que você realmente quer se pretende automatizar a comparação entre dois ou três tamanhos de modelo:

apt install -y jq

curl -s http://127.0.0.1:11434/api/generate -d '{
  "model":  "llama3.1:8b",
  "prompt": "List three Nordic capitals.",
  "stream": false
}' | jq '{
  tokens: .eval_count,
  seconds: (.eval_duration / 1000000000),
  rate: (.eval_count / (.eval_duration / 1000000000))
}'

Meça o tamanho abaixo e o tamanho acima, depois pare. Baixe um 3B e um 14B, rode o mesmo prompt em cada um, e anote as três taxas. Agora você sabe exatamente quanto essa troca custa nesta máquina — geralmente algo perto de dobrar em cada direção — e pode escolher por tarefa em vez de por opinião. Depois remova os modelos que não vai manter, porque cada um deles são vários gigabytes.

Uma ressalva sobre a primeira execução de qualquer modelo: a load duration nessa saída é o tempo gasto lendo os pesos do disco para a RAM. Ela só é paga quando o modelo ainda não está residente, o que é controlado por OLLAMA_KEEP_ALIVE. Não a inclua ao comparar taxas, e não se alarme com ela — em NVMe são segundos, e acontece uma vez só.

Passo 04 · Proteger

O Ollama não tem autenticação. Nenhuma. Não uma fraca — nenhuma.

Esta é a parte do guia que impede algo ruim de acontecer, então ela é dita sem meias palavras: a API do Ollama não tem senha, não tem token, não tem modelo de usuário e não tem sistema de permissões. O que quer que consiga abrir uma conexão TCP na porta 11434 pode gerar texto na sua CPU, enumerar os modelos que você baixou, baixar novos e apagar os que você usa. Não há configuração para ativar, porque não há mecanismo para ativar.

A porta 11434 é escaneada continuamente, pelo motivo óbvio: um executor de modelo aberto é computação gratuita pertencente a outra pessoa. O sintoma não é um alerta. É uma máquina que parece lenta por duas semanas e um gráfico de banda que não corresponde a nada que você fez. Mantenha o serviço no loopback, e coloque algo na frente dele que pergunte quem está chamando.

Se nada fora desta máquina precisa do modelo, pare por aqui — você já terminou. Loopback mais um firewall já é uma resposta completa, e um agente, uma stack de automação ou uma aplicação web rodando no mesmo VPS acessa o modelo via 127.0.0.1 sem nada do que vem a seguir. Só continue se algo em outra máquina precisar chamá-lo.

O proxy, e o token. Gere um token longo e aleatório, aponte um registro A para a máquina, e deixe o Caddy cuidar tanto do certificado quanto da porta:

openssl rand -hex 32      # → the bearer token, store it in a password manager
apt install -y caddy

/etc/caddy/Caddyfile

llm.example.com {
    @unauthorised not header Authorization "Bearer PASTE_THE_HEX_TOKEN_HERE"
    respond @unauthorised "unauthorised" 401

    reverse_proxy 127.0.0.1:11434 {
        # Generation is slow by nature — do not let the proxy give up first.
        transport http {
            read_timeout 10m
        }
    }
}
systemctl reload caddy
ufw allow 80,443/tcp
ufw status                # 11434 must appear nowhere

Há uma pequena elegância em escolher um token Bearer em vez de autenticação básica. O Ollama expõe uma API compatível com OpenAI, todo cliente OpenAI envia sua chave exatamente nesse header, e assim o token que você acabou de gerar se torna a chave de API que suas aplicações já sabem carregar. Nada precisa de um header personalizado, e girar o acesso é uma linha no Caddyfile e uma variável de ambiente em quem chama.

Verifique a partir de uma máquina que não seja o servidor. A primeira chamada deve ser recusada e a segunda deve responder:

curl -s -o /dev/null -w '%{http_code}\n' https://llm.example.com/api/tags
# → 401

curl -s https://llm.example.com/api/tags -H "Authorization: Bearer THE_TOKEN" | jq '.models[].name'
# → the list of models you pulled

Se o modelo vai ser chamado por agentes em vez de por você, a questão da exposição merece o tratamento mais completo do guia sobre hospedar um servidor MCP remoto — o mesmo raciocínio sobre TLS, tokens e o que deve ser alcançável de onde, aplicado a um serviço que entrega ferramentas em vez de tokens.

Passo 05 · Conectar

Uma base URL, e tudo já fala essa língua. Você troca uma string.

O Ollama expõe uma superfície compatível com OpenAI em /v1 além da sua própria API. Essa é toda a história da integração: qualquer coisa construída para a OpenAI — os SDKs oficiais, os wrappers de framework, os nós de automação — funciona trocando a base URL e a chave, e nada mais muda.

curl -s https://llm.example.com/v1/chat/completions \
  -H "Authorization: Bearer THE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "llama3.1:8b",
    "messages": [{"role":"user","content":"Reply with the word OK."}]
  }' | jq -r '.choices[0].message.content'

Em Python, as únicas linhas que diferem de uma configuração hospedada são as duas do topo:

from openai import OpenAI

client = OpenAI(
    base_url="https://llm.example.com/v1",
    api_key="THE_TOKEN",
)

r = client.chat.completions.create(
    model="llama3.1:8b",
    messages=[{"role": "user", "content": "Classify: 'the invoice is overdue'"}],
)
print(r.choices[0].message.content)

Peça JSON, e receba JSON. O recurso mais útil de todos para automação é a saída restrita. O Ollama pode forçar a resposta a ser um JSON válido em vez de torcer para o modelo se comportar, o que transforma um modelo pequeno de um narrador pouco confiável em um parser confiável — e é a diferença entre um workflow que roda sem supervisão e um que quebra a cada quarenta itens:

curl -s http://127.0.0.1:11434/api/generate -d '{
  "model":  "llama3.1:8b",
  "prompt": "Extract the total and the currency: Invoice 4021, 1 249,90 EUR due 30 days.",
  "format": "json",
  "stream": false
}' | jq -r .response
# → {"total": 1249.90, "currency": "EUR"}

Em uma stack de automação vale o mesmo: o n8n traz um nó dedicado para o Ollama, e seu nó OpenAI aceita uma base URL personalizada, então um workflow existente migra para inferência local editando uma única credencial. O guia de auto-hospedagem do n8n cobre o motor de automação em si; rode os dois em máquinas separadas se puder, porque um motor que fica ocioso em 700 MB e um modelo que quer cinco gigabytes são vizinhos infelizes em uma máquina de oito gigabytes.

E o endpoint de embeddings, onde esta máquina realmente se paga. Modelos de embeddings são duas ordens de grandeza menores que os modelos de geração e fazem uma passagem por trecho sem nada para gerar, então uma CPU lida com eles a uma velocidade que parece instantânea:

ollama pull nomic-embed-text      # ~275 MB

curl -s http://127.0.0.1:11434/api/embed -d '{
  "model": "nomic-embed-text",
  "input": ["the first chunk of a document", "the second chunk"]
}' | jq '.embeddings | length'
Passo 06 · Limitar

Um executor de modelo sem limites vai usar tudo o que você tem. Dê a ele limites.

Limite o contexto. O tamanho do contexto é o principal controle sobre o uso de memória, e o padrão é mais generoso do que uma máquina pequena quer. Defina-o globalmente para o que o seu prompt mais longo realmente precisa — a maior parte do trabalho de classificação e extração é confortável dentro de quatro mil tokens — e aumente por requisição nas raras chamadas que precisam de mais:

Environment="OLLAMA_CONTEXT_LENGTH=4096"
curl -s http://127.0.0.1:11434/api/generate -d '{
  "model": "llama3.1:8b",
  "prompt": "…a long document…",
  "options": { "num_ctx": 16384 },
  "stream": false
}'

Decida por quanto tempo o modelo fica na memória. Um modelo residente responde instantaneamente e mantém vários gigabytes reféns. Em uma máquina dedicada à inferência, mantenha-o carregado para sempre; em uma compartilhada, deixe-o descarregar depois de um tempo. O valor também pode ser definido por requisição, então um lote noturno pode fixar o modelo durante sua execução e liberá-lo no final:

OLLAMA_KEEP_ALIVE=-1     # resident until the service restarts
OLLAMA_KEEP_ALIVE=30m    # a sensible default on a shared box
OLLAMA_KEEP_ALIVE=0      # unload immediately after each request

ollama ps                # what is resident right now, and how much it holds

Serialize a fila. Duas requisições simultâneas contra um modelo não vão duas vezes mais rápido; elas disputam o mesmo caminho de memória saturado e cada uma fica mais lenta, e se o Ollama decidir carregar uma segunda cópia para atendê-las, a máquina fica sem RAM. Nesta classe de hardware, uma requisição de cada vez, com uma fila na frente, é ao mesmo tempo a configuração mais rápida e a única segura — por isso OLLAMA_NUM_PARALLEL e OLLAMA_MAX_LOADED_MODELS foram fixados em um lá no passo 02.

Fique de olho no disco. Comparar quatro modelos deixa quatro modelos para trás, e a cinco gigabytes cada, isso é um disco enchendo silenciosamente enquanto nada reclama. Torne a limpeza parte da comparação, não uma tarefa para depois:

ollama list
du -sh /var/lib/ollama/models
ollama rm mistral:7b qwen2.5:14b

Por fim, faça backup do que não é reproduzível. Os pesos do modelo não são — um pull os traz de volta. O que vale um repositório é a configuração, o Caddyfile, o token, os prompts que você refinou ao longo de três semanas e, se você construiu um, o índice vetorial por trás da sua recuperação. O guia de backups criptografados cobre a mecânica; a lista de inclusão para esta máquina é curta e vale a pena anotar.

A parte boa · Recuperação

Onde uma CPU vence o argumento. Embeddings não são lentos.

Tudo até aqui foi sobre geração, que é a parte que uma CPU faz devagar. A recuperação é a outra metade da maioria dos sistemas úteis, e ela inverte completamente o quadro — por isso o plano mais barato desta página pode fazer algo genuinamente valioso mesmo que você nunca gere um token nele.

Um modelo de embeddings transforma um trecho de texto em um vetor. Ele é medido em centenas de megabytes em vez de gigabytes, faz exatamente uma passagem direta por trecho, e não há um loop token a token para ficar limitado pela banda de memória. Na mesma máquina onde um modelo de 8B escreve três palavras por segundo, um modelo de embeddings percorre uma biblioteca de documentos a uma velocidade que parece cópia de arquivos.

O formato disso. Divida seus documentos em trechos de algumas centenas de palavras. Gere o embedding de cada trecho uma vez e armazene o vetor. Na hora da pergunta, gere o embedding da pergunta, encontre a meia dúzia de trechos mais próximos, e entregue-os a um modelo junto com a pergunta. O armazenamento não precisa de nada exótico: um banco SQLite com uma extensão vetorial já basta para dezenas de milhares de trechos em um único VPS, e o PostgreSQL com pgvector cobre bem além disso. Um banco de dados vetorial dedicado é algo legítimo para querer mais tarde e uma dependência desnecessária no primeiro dia.

Por que isso importa mais do que a velocidade. Veja o que cada metade toca. A etapa de geração vê uma pergunta e alguns parágrafos. A etapa de embeddings vê <em>todo documento que você possui</em> — o arquivo inteiro, cada contrato, cada nota, cada mensagem, passados pelo modelo um trecho de cada vez. Se essa etapa roda contra um endpoint hospedado, todo o seu corpus foi transmitido a terceiros para ser indexado. Se roda na sua própria máquina, nada disso se moveu.

Isso dá um híbrido genuinamente bom para quem não quer abrir mão da qualidade de ponta: indexe localmente, recupere localmente, e envie apenas a pergunta e os três trechos recuperados para um modelo hospedado quando a resposta precisar ser excelente. O corpus fica em casa; só uma fatia fina dele viaja, e apenas sob demanda.

Dois vizinhos deste site tornam o padrão concreto. Um SearXNG auto-hospedado dá à camada de recuperação um front-end privado para a web aberta em vez de um corpus; um repositório de documentos auto-hospedado dá a ela o corpus. Os dois, mais o modelo, cabem em planos que custam menos por mês do que um único assento hospedado.

A camada abaixo do modelo

Os prompts são a parte sensível. Não as respostas — as perguntas.

As pessoas pensam sobre a privacidade de modelos como se o risco estivesse na saída. Não está. A saída é texto genérico; mil outras pessoas receberam algo parecido. O artefato revelador é a entrada — e um ano de entradas é um retrato surpreendentemente completo de uma organização.

Pense no que um log de requisições realmente contém. O contrato que você colou para ser resumido. O e-mail do cliente que você pediu para classificar, com o cliente lá dentro. A carta médica, o valor do salário, a carta de demissão que você estava rascunhando, o código de um repositório que não é público. Depois os metadados ao redor disso: quais perguntas, em que ordem, a que horas, de qual endereço, ao longo de quantos meses. Ninguém assina um documento dizendo "aqui está nossa estratégia" — mas a sequência de perguntas é esse documento, montado honestamente, por você, uma chamada de cada vez.

Camada um — o que o endpoint guarda. Provedores sérios publicam políticas sérias, e os bons realmente não treinam com o tráfego da API de negócios. Isso não é a mesma promessa que não reter os dados. As requisições costumam ficar armazenadas por um período para monitoramento de abuso, são acessíveis pela equipe sob condições definidas, e podem ser produzidas sob processo legal — o que é exatamente a forma certa de operar uma plataforma grande e exatamente o lugar errado para um texto que você não mandaria por e-mail a um estranho. Um modelo na sua própria máquina não tem esse log, a menos que você crie um.

Camada dois — a identidade à qual o log está associado. A retenção sozinha é só metade da exposição. A outra metade é a chave à qual ela se junta: uma conta, um nome de empresa, um endereço de cobrança, um cartão. Essa junção é o que transforma "alguém perguntou sobre adquirir um concorrente" em "esta empresa perguntou, naquela terça-feira". Remover o modelo da equação remove a retenção; remover a identidade da máquina remove a junção. Um VPS aberto sem endereço de e-mail nem documento de identidade, em uma jurisdição nórdica, quitado em Monero, é a segunda metade do mesmo movimento.

Camada três — os logs que você mesmo escreve. A auto-hospedagem move o risco em vez de eliminá-lo, e vale a pena ter clareza sobre onde ele pousa. Sua aplicação provavelmente registra os próprios prompts. Seu proxy reverso registra cada linha de requisição. Uma sessão de depuração de dois meses atrás deixou saída detalhada no journal. O modelo em si não guarda nada entre chamadas, mas a maquinaria ao redor dele pode guardar tudo — então decida deliberadamente o que fica registrado, defina uma retenção para isso, e cobre desse log o mesmo padrão que você não estava disposto a aceitar de outra pessoa.

Nada disso faz de um modelo local uma garantia de privacidade por si só. Faz dele a única arquitetura em que a garantia é sua para dar: o texto fica em um hardware que você aluga, sob uma jurisdição que você escolheu, atrás de um token que você emitiu, e não presta contas a mais nada.

Notas de campo · Seis armadilhas

Seis formas como isso decepciona as pessoas. Cinco delas são evitáveis.

Armadilha 01 · Memória

A máquina travou em vez de ficar mais lenta

O modelo mais o seu cache de contexto ultrapassou a RAM, e o kernel começou a paginar pesos a cada token. Caiba na memória ou desça um tamanho — não há meio-termo.

Armadilha 02 · Exposição

Outra pessoa estava usando a sua CPU

OLLAMA_HOST foi definido como 0.0.0.0 para fazer um cliente funcionar. A API não tem autenticação nenhuma, e a porta 11434 é escaneada. Loopback mais um proxy que verifica um token.

Armadilha 03 · Expectativa

Funciona, e digita como um fax

Um modelo de 32B foi escolhido para um assistente interativo. Combine o tamanho com o tipo de interação: o interativo quer pequeno, a qualidade quer assíncrono.

Armadilha 04 · Contexto

A primeira requisição foi tranquila, a décima se arrastou

Uma conversa que cresce faz o cache crescer junto, e todo o histórico é relido a cada turno. Limite o contexto, e comece uma nova conversa em vez de acrescentar para sempre.

Armadilha 05 · Residência

Cinco gigabytes se foram e nada está rodando

O modelo permanece residente após a última chamada por padrão de projeto. Defina OLLAMA_KEEP_ALIVE de acordo com a máquina, e leia o ollama ps antes de culpar qualquer outra coisa.

Armadilha 06 · Disco

O disco se encheu de modelos que você comparou uma vez

Quatro candidatos a cinco gigabytes cada, nenhum removido. Torne o ollama rm parte da comparação, e verifique o diretório de modelos quando os alertas de disco dispararem.

FAQ · Modelos locais

Perguntas, respondidas.

Dez perguntas que decidem se um modelo só de CPU é a ferramenta certa para a tarefa que você tem em mente.

Dá para rodar um LLM sem GPU mesmo?

Sim, com uma ressalva honesta sobre velocidade. Um modelo quantizado roda perfeitamente bem em CPUs de servidor comuns — os pesos ficam na RAM, a conta está bem ao alcance, e nada no processo precisa de uma placa de vídeo. O que uma GPU compra é banda de memória, e é a banda que define a velocidade de geração. Então uma máquina só de CPU vai responder, correta e completamente, em algo entre algumas e algumas dezenas de palavras por segundo, dependendo do modelo. Isso é lento para uma janela de chat e perfeitamente adequado para o trabalho que a maioria das pessoas de fato automatiza: classificar uma mensagem, extrair JSON estruturado de um documento, resumir uma página, gerar embeddings de texto para busca, reescrever um parágrafo. A pergunta nunca é "consegue" — é "a que taxa, e essa taxa importa para essa tarefa".

Quantos tokens por segundo devo esperar?

Faça a conta em vez de confiar no benchmark de qualquer um, incluindo o nosso. Um modelo denso lê cada um dos seus pesos a partir da memória para produzir um token, então o teto é, grosso modo, a banda de memória dividida pelo tamanho do modelo. Um modelo de 3B quantizado para cerca de 2 GB, em uma máquina com 20 GB/s efetivos, tem um teto perto de 10 tokens por segundo; um 7B com 4.4 GB fica perto de 4.5; um 32B com 20 GB fica abaixo de 1. Os números reais ficam abaixo do teto — considere de 50 a 70 por cento — e variam conforme o host, os vizinhos e a quantidade de threads. O processamento do prompt é uma questão completamente diferente: é limitado por computação, roda muitas vezes mais rápido, e é por isso que resumir um documento longo é tranquilo enquanto conversar com um modelo grande não é.

Com qual modelo devo começar em 8 GB?

Um modelo de instrução da classe 8B em Q4_K_M, que fica em torno de 4.5 a 5 GB e deixa espaço para o sistema operacional e o cache de contexto. Esse tamanho é o ponto ideal atual: bom o suficiente para seguir instruções com confiabilidade, produzir JSON válido quando solicitado, resumir, classificar e reescrever; pequeno o suficiente para continuar responsivo. Abaixo disso, um modelo de 3B é genuinamente útil para classificação, marcação e roteamento, e cerca de duas vezes mais rápido. Acima disso, um 14B é visivelmente melhor em raciocínio de múltiplas etapas e cerca de metade da velocidade, o que é uma troca justa para trabalho em lote e ruim para qualquer coisa interativa. Comece com 8B, meça, e depois se mova na direção que a medição indicar.

De quanta RAM um modelo realmente precisa?

O tamanho do arquivo quantizado, mais o cache de contexto, mais espaço para o sistema — e o total precisa caber, porque o modo de falha não é lentidão, é colapso. Quando o modelo não cabe, o kernel começa a trocar pesos do modelo para o disco, e uma geração que deveria levar quatro segundos passa a levar quatro minutos enquanto o load average sobe para as dezenas. Como regra prática em Q4_K_M: um modelo de 3B tem cerca de 2 GB, um 8B cerca de 5 GB, um 14B cerca de 9 GB, um 32B cerca de 20 GB, um 70B cerca de 40 GB. Some dois gigabytes para o Debian e seus serviços, e de um a quatro a mais para o cache de chave-valor, dependendo de quão longo é o contexto que você permite. Depois compre o plano acima da resposta, não o plano que combina exatamente com ela.

Ollama ou llama.cpp?

O Ollama é o llama.cpp, com um registro de modelos, uma API REST e um serviço systemd embrulhados ao redor. Use o Ollama a menos que tenha um motivo específico para não usar: um único comando de instalação, ollama pull em vez de caçar arquivos GGUF, um endpoint compatível com OpenAI, e padrões sensatos para número de threads e memória. Recorra ao llama.cpp diretamente quando quiser uma flag que o Ollama não expõe, quando quiser fixar uma build exata para reprodutibilidade, ou quando estiver rodando um único modelo com uma única configuração para sempre e preferir não ter um daemon gerenciando nada. Os dois rodam os mesmos pesos na mesma velocidade; a diferença está inteiramente na operação.

Um modelo auto-hospedado é tão bom quanto os grandes serviços na nuvem?

Não, e fingir o contrário desperdiça a sua tarde. Um modelo de ponta atrás de uma API é maior do que qualquer coisa que caiba em uma máquina virtual, e vai ser melhor em raciocínio difícil, contexto longo e código. Onde um modelo local pequeno é genuinamente competitivo é no enorme meio-campo do trabalho real: decidir a qual das seis categorias um e-mail pertence, extrair cinco campos de uma fatura, resumir uma conversa de suporte, reescrever uma descrição, marcar um documento, julgar se dois registros descrevem a mesma pessoa. Para essa classe de tarefa, a diferença entre um 8B e um modelo de ponta é pequena, a diferença de custo é total, e a diferença de privacidade é absoluta. A postura produtiva não é "substituir a API", e sim "parar de mandar para ela os noventa por cento que nunca precisaram sair".

O Ollama tem autenticação?

Não — nenhuma mesmo, e este é o fato operacional mais importante deste guia. Não há senha, não há token, não há modelo de usuário. Qualquer coisa que consiga abrir uma conexão TCP na porta 11434 pode gerar texto, listar seus modelos, baixar novos e apagar os existentes. Essa porta é escaneada rotineiramente, e instâncias desprotegidas são encontradas e usadas como computação gratuita por estranhos, o que aparece primeiro como um load average misterioso e, mais tarde, como uma conta de banda mais alta. Mantenha o Ollama vinculado a 127.0.0.1, coloque um proxy reverso na frente dele, termine o TLS ali, e exija um token Bearer ou certificado de cliente no proxy. Se nada fora da máquina precisa do modelo, não o exponha de forma alguma.

O n8n ou meu agente pode usar um modelo local?

Sim, e geralmente basta um campo. O Ollama expõe uma API compatível com OpenAI em /v1, então qualquer cliente que permita definir uma base URL — os SDKs da OpenAI, o LangChain, o nó OpenAI do n8n, a maioria dos frameworks de agentes — vai se comunicar com ele apontando para https://your-host/v1 e enviando qualquer string não vazia como chave. O n8n também traz um nó dedicado para o Ollama. O padrão que funciona bem na prática é híbrido: direcione as chamadas em massa, repetitivas e de alto volume para o modelo local, e reserve a API hospedada para a meia dúzia de passos que realmente precisam de raciocínio de ponta, com um fallback caso o modelo local se recuse a produzir um JSON válido.

Vale a pena rodar embeddings em CPU?

Eles são a coisa de melhor custo-benefício desta página inteira. Modelos de embeddings são minúsculos — dezenas a centenas de megabytes em vez de gigabytes — e rodam uma passagem direta por trecho, sem geração token a token, então uma CPU mastiga eles com facilidade. Isso significa que toda a metade de recuperação de um sistema RAG — indexar seus documentos, gerar o embedding da consulta, encontrar os trechos mais próximos — roda confortavelmente no plano mais barato, e é também a metade que toca todo documento que você possui. Mesmo que você decida que a etapa de geração pertence a uma API hospedada, mover a etapa de embeddings para a sua própria máquina mantém o seu corpus fora da máquina de outra pessoa.

Por que hospedar o próprio modelo, afinal, se uma API é mais rápida e mais barata?

Três motivos, em ordem crescente de importância. O custo tem um formato: uma API é mais barata até deixar de ser, e um workflow que classifica cinquenta mil mensagens por mês tem uma conta que cresce, enquanto um VPS de $7.90 não. Disponibilidade: sem limite de taxa, sem descontinuação do modelo em torno do qual você construiu tudo, sem indisponibilidade na página de status de outra pessoa. E o que decide tudo — seus prompts são o texto mais revelador que você produz. Não as respostas, as perguntas. O que você perguntou, sobre quem, em que dia, em que ordem. Um endpoint hospedado vê tudo isso, associado a uma identidade de cobrança. Um modelo rodando em uma máquina que você alugou sem documento de identidade, em uma jurisdição nórdica, paga em Monero, vê o mesmo texto e não reporta a ninguém.

Obtenha o hardware

Um VPS nórdico para um modelo que responde só para você. Sem KYC, pago em cripto.

O Garrison (4 vCPU, 8 GB, 240 GB NVMe, $7.90/mês) roda um modelo de 8B com espaço para o cache de contexto e o sistema — o plano pelo qual a maioria das pessoas deveria começar. O Ravelin dobra a memória para 14B e contextos longos. Sem e-mail no cadastro, sem documento de identidade, e sem conta por token.

Última revisão · 2026-08-24 · Fontes · Documentação e referência de API do Ollama, documentação do llama.cpp, documentação do proxy reverso Caddy, model cards publicados das builds quantizadas referenciadas · Cadência · anualmente