Modo de Roteador Llama-Server - Alternância Dinâmica de Modelos sem Reinicializações

Servir e alternar LLMs sem reinicializações.

Conteúdo da página

Por muito tempo, o llama.cpp teve uma limitação evidente:
você só podia servir um modelo por processo, e alternar significava reiniciar.

Essa era acabou.

Atualizações recentes introduziram o modo roteador no llama-server, trazendo algo muito mais próximo do que as pessoas esperam de tempos de execução modernos para LLMs locais:

  • carregamento dinâmico de modelos
  • descarregamento sob demanda
  • alternância por solicitação
  • sem reinício do processo

llm router on the table

Em outras palavras: comportamento semelhante ao Ollama, mas sem as rodinhas de apoio.

Se você ainda está decidindo entre tempos de execução locais, APIs em nuvem e infraestrutura auto-hospedada, a visão geral de hospedagem de LLM é um bom ponto de partida.


Pré-requisitos

O modo roteador requer uma versão recente de llama-server — aproximadamente pós-meados de 2024. Versões mais antigas não possuem a flag --models.

Para opções de instalação (gerenciador de pacotes, binários pré-construídos ou compilação completa do código-fonte com CUDA), consulte o início rápido do llama.cpp.

Uma vez que você tenha o llama-server, confirme que sua compilação suporta o modo roteador:

llama-server --help | grep -i models

Se a flag --models aparecer, você está bom. Se estiver ausente, atualize para uma versão mais recente.

A minha saída atual de ajuda relacionada a modelos:

-cl,   --cache-list                     show list of models in cache
                                        Prefix/Suffix/Middle) as some models prefer this. (default: disabled)
                                        models with dynamic resolution (default: read from model)
                                        models with dynamic resolution (default: read from model)
                                        embedding models (default: disabled)
--models-dir PATH                       directory containing models for the router server (default: disabled)
                                        (env: LLAMA_ARG_MODELS_DIR)
--models-preset PATH                    path to INI file containing model presets for the router server
                                        (env: LLAMA_ARG_MODELS_PRESET)
--models-max N                          for router server, maximum number of models to load simultaneously
                                        (env: LLAMA_ARG_MODELS_MAX)
--models-autoload, --no-models-autoload
                                        for router server, whether to automatically load models (default:
                                        (env: LLAMA_ARG_MODELS_AUTOLOAD)

O que o modo roteador faz realmente

O modo roteador transforma o llama-server em um dispersor de modelos.

Em vez de vincular a um único modelo via -m, o servidor:

  • inicia sem nenhum modelo carregado
  • recebe uma solicitação que nomeia um modelo
  • carrega esse modelo se ele não estiver já na memória
  • executa a inferência
  • opcionalmente descarrega o modelo após a resposta, ou mantém-o quente para a próxima solicitação

A ideia chave

Você não está mais executando:

./llama-server -m model.gguf

Você está executando:

./llama-server --models models.ini --port 8080

E deixando o servidor decidir o que carregar e quando, com base no que o cliente realmente solicita.

Isso importa porque significa que um processo persistente pode servir uma frota inteira de modelos, com clientes selecionando o modelo certo para cada tarefa — um modelo de codificação, um modelo de chat, um modelo de resumo — sem nenhum sobrecarga de coordenação do seu lado.


Configuração: definindo seus modelos

Aqui é onde as coisas ainda estão um pouco brutas.

Ainda não existe um formato oficial totalmente estável, mas as versões atuais suportam definições de modelos no estilo INI via arquivo de configuração.

Exemplo models.ini

[llama3]
model = /opt/models/llama-3-8b-instruct.Q5_K_M.gguf
ctx-size = 8192
ngl = 35
threads = 8

[mistral]
model = /opt/models/mistral-7b-instruct-v0.3.Q4_K_M.gguf
ctx-size = 4096
ngl = 20
threads = 8

[qwen]
model = /opt/models/qwen2.5-coder-7b-instruct.Q5_K_M.gguf
ctx-size = 16384
ngl = 35
threads = 8

Cada nome de seção torna-se o identificador do modelo que os clientes usam no campo "model" de suas solicitações de API.

Parâmetros chave de configuração

Parâmetro O que controla
model Caminho absoluto para o arquivo GGUF
ctx-size Tamanho da janela de contexto em tokens. Valores maiores usam mais VRAM.
ngl Número de camadas de GPU descarregadas. Defina como 0 para CPU apenas; aumente até atingir os limites de VRAM.
threads Threads de CPU para as camadas que permanecem na CPU.

Escolher o valor correto de ngl depende da VRAM disponível da sua GPU — para seleção de GPU e economia de hardware, o guia de hardware de computação é uma referência útil. Para monitorar o consumo de VRAM em tempo real enquanto ajusta, veja as ferramentas de monitoramento de GPU para Linux.

Iniciar o servidor com configuração

./llama-server --models /opt/llama.cpp/models.ini --port 8080

Confirme que o servidor iniciou corretamente:

curl http://localhost:8080/v1/models | jq '.data[].id'

Você deve ver cada nome de seção do seu models.ini listado como um ID de modelo.

Uma nota sobre estabilidade

A interface de configuração INI ainda está evoluindo:

  • flags podem mudar entre commits
  • alguns parâmetros são reconhecidos apenas por configurações de compilação específicas
  • a documentação fica atrás da implementação

Fixe-se em um commit específico do llama.cpp se precisar de reprodutibilidade entre reinícios.


Uso da API: alternando modelos por solicitação

Uma vez que o servidor esteja em execução, a alternância de modelos acontece através da API compatível com OpenAI. Basta definir o campo "model".

Listar modelos registrados

curl http://localhost:8080/v1/models

Solicitação de conclusão — primeiro modelo

curl http://localhost:8080/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "llama3",
    "messages": [
      {"role": "user", "content": "Explain router mode in one paragraph"}
    ]
  }'

Alternar para um modelo diferente — mesmo endpoint, mesma porta

curl http://localhost:8080/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "qwen",
    "messages": [
      {"role": "user", "content": "Write a Python function that reads a CSV file"}
    ]
  }'

O servidor gerencia o ciclo de descarregar/carregar de forma transparente. Seu código de cliente não muda — apenas o campo model.

Exemplo em Python

Se você estiver usando o cliente Python openai:

from openai import OpenAI

client = OpenAI(base_url="http://localhost:8080/v1", api_key="not-needed")

# Use o modelo de codificação
response = client.chat.completions.create(
    model="qwen",
    messages=[{"role": "user", "content": "Write a Go HTTP handler"}],
)
print(response.choices[0].message.content)

# Alternar para o modelo de chat — mesmo cliente, nome de modelo diferente
response = client.chat.completions.create(
    model="llama3",
    messages=[{"role": "user", "content": "What is the capital of Australia?"}],
)
print(response.choices[0].message.content)

O que acontece internamente

Quando uma solicitação chega para qwen e llama3 está atualmente carregado:

  1. llama3 é descarregado da VRAM
  2. os pesos de qwen são lidos do disco e carregados na VRAM
  3. a inferência é executada
  4. a próxima solicitação determina se qwen deve permanecer carregado ou se deve ser trocado novamente

Isso responde diretamente à pergunta comum:

Como um servidor local de LLM pode alternar modelos sem reiniciar

Carregando modelos dinamicamente por solicitação, em vez de vincular na inicialização.


Serviço Systemd: configuração pronta para produção

Criar um usuário dedicado e diretórios

sudo useradd --system --shell /usr/sbin/nologin --home-dir /opt/llama.cpp llm
sudo mkdir -p /opt/llama.cpp/models
sudo chown -R llm:llm /opt/llama.cpp

Copie seu binário e configuração de modelo para o local:

sudo cp build/bin/llama-server /opt/llama.cpp/
sudo cp models.ini /opt/llama.cpp/

/etc/systemd/system/llama-server.service

[Unit]
Description=Llama.cpp Router Server
After=network.target

[Service]
Type=simple
User=llm
WorkingDirectory=/opt/llama.cpp
ExecStart=/opt/llama.cpp/llama-server --models /opt/llama.cpp/models.ini --port 8080
Restart=always
RestartSec=5

Environment=LLAMA_LOG_LEVEL=info

[Install]
WantedBy=multi-user.target

Habilitar e iniciar

sudo systemctl daemon-reload
sudo systemctl enable llama-server
sudo systemctl start llama-server

Verificar e inspecionar logs

sudo systemctl status llama-server
journalctl -u llama-server -f

Em uma inicialização bem-sucedida, você verá linhas indicando que o servidor está ouvindo e que o registro de modelos foi carregado. Uma verificação rápida de sanidade:

curl -s http://localhost:8080/v1/models | jq '.data[].id'

Agora você tem um serviço persistente com reinício automático e alternância centralizada de modelos — sem gerenciamento manual de processos necessário. Se você quiser aplicar o mesmo padrão a outros binários, hospedar qualquer executável como um serviço Linux percorre a abordagem geral.

A flag --metrics do llama-server expõe um endpoint compatível com Prometheus. Para dashboards específicos do llama.cpp, consultas PromQL e regras de alerta, veja o guia de monitoramento de inferência de LLM. Para a configuração de observabilidade mais ampla, o guia de observabilidade cobre a pilha completa.


Limitações que você precisa entender

O modo roteador é genuinamente útil, mas vem com compensações que você deve estar claro antes de confiar nele em produção.

Apenas um modelo na memória por vez

Mesmo que vários modelos estejam definidos em models.ini, apenas um residente na VRAM por trabalhador em qualquer momento dado. Alternar significa um ciclo completo de descarregar-e-carregar.

  • alternar significa recarregar
  • pico de latência é inevitável
  • em um modelo 7B típico em Q5, um recarregamento pode levar 3–10 segundos dependendo da velocidade do disco e largura de banda de VRAM

Isso responde outra pergunta chave:

O llama.cpp suporta servir múltiplos modelos ao mesmo tempo

Não realmente. Ele suporta múltiplas definições, não residência simultânea. Se você precisar de dois modelos verdadeiramente carregados em paralelo, precisa de dois processos em duas GPUs separadas.

Para consumo de VRAM medido e tokens por segundo através de tamanhos de modelo, os benchmarks de desempenho de LLM cobrem o quadro completo. Para números específicos do llama.cpp em uma GPU de 16 GB — modelos densos e MoE em múltiplos tamanhos de contexto — veja os benchmarks do llama.cpp com 16 GB de VRAM.

Nenhum cache inteligente

Ao contrário do Ollama, que mantém uma piscina quente e expulsa modelos com base na recência:

  • não há estratégia automática de expulsão de modelos
  • nenhum pré-aquecimento em segundo plano
  • nenhuma fila de prioridade para modelos usados com frequência

Se você enviar solicitações alternadas para llama3 e mistral, cada única solicitação dispara um recarregamento. Este é o custo fundamental de estar mais próximo do metal.

Latência é imprevisível para cargas de trabalho mistas

Uma carga de trabalho bem-comportada que usa um modelo consistentemente será rápida. Uma carga de trabalho que intercala múltiplos modelos será lenta. Planeje sua lógica de roteamento de cliente accordingly — agrupe solicitações por modelo sempre que possível.

Configuração não é estável

O suporte INI existe e funciona na maioria das versões recentes, mas não é totalmente padronizado. Flags e nomes de parâmetros mudaram entre versões. Se você atualizar o llama-server, teste seu models.ini contra a nova compilação antes de implantar.


Llama.cpp vs Ollama: comparação honesta

Funcionalidade roteador llama.cpp Ollama
Carregamento dinâmico Sim Sim
Alternância de modelos Sim Sim
Registro incorporado Parcial (INI) Sim (baseado em pull)
Gerenciamento de memória Básico Avançado
Expulsão de modelos Nenhuma Baseado em TTL
Acabamento de UX Baixo Alto
Compatibilidade API OpenAI Sim Sim
Controle Máximo Opiniado
Estabilidade de configuração Experimental Estável

Opinião

Escolha o modo roteador do llama.cpp quando você quiser:

  • controle máximo sobre parâmetros de tempo de execução por modelo
  • sobrecarga de processo mínima
  • acesso direto a flags do llama.cpp sem camadas de abstração
  • uma base hackeável para ferramentas personalizadas

Escolha o Ollama quando você quiser:

  • uma experiência estável e polida
  • download automático de modelos e versionamento
  • manter vivo inteligente e expulsão sem configuração
  • tudo incluído desde o primeiro dia

Nenhum está errado. A escolha depende de quanto você quer gerenciar você mesmo.

Se você for com Ollama, a folha de atalhos CLI do Ollama cobre comandos do dia a dia. Para uma comparação mais ampla que também inclui vLLM, LM Studio e LocalAI, veja como diferentes tempos de execução locais se comparam em 2026.


Llama.cpp vs llama-swap

llama-swap é um orquestrador externo que fica na frente de uma ou mais instâncias de llama-server:

  • intercepta solicitações e inspeciona o campo model
  • inicia o processo llama-server apropriado para esse modelo
  • desliga instâncias ociosas após um tempo limite configurável
  • encaminha a solicitação uma vez que o modelo está pronto

Para uma configuração prática, veja o início rápido do llama-swap.

Diferença chave

Aspecto modo roteador llama-swap
Incorporado Sim Não (binário separado)
Maturidade Experimental Mais estável
Flexibilidade Limitado Alta
Camada de controle Interna Proxy externo
Configuração por modelo Arquivo INI Arquivo YAML
Modelo de processo Processo único Um processo por modelo

Quando usar llama-swap

llama-swap oferece isolamento de nível de processo por modelo, o que significa que uma falha em uma instância de modelo não afeta outras. Também permite que cada modelo rode com flags llama-server completamente independentes.

Use se você precisar de:

  • melhor controle de ciclo de vida e isolamento
  • lógica de alternância mais inteligente com tempos de ociosidade configuráveis
  • latência mais previsível (cada modelo tem um processo quente após o primeiro carregamento)
  • estabilidade de produção hoje, não eventualmente

Quando o modo roteador nativo é suficiente

Use o roteador incorporado se você quiser:

  • zero dependências externas
  • um único processo para gerenciar
  • implantação mais simples (um binário, um arquivo de configuração)
  • pilha mínima para ambientes de desenvolvimento ou setups de usuário único

Pensamentos finais

O modo roteador é um passo significativo à frente para o llama-server.

Ele responde à demanda de longa data:

O que é o modo roteador no servidor llama.cpp

É a camada faltante que transforma um binário estático em um serviço de inferência dinâmico — um único processo que pode atender solicitações para um catálogo inteiro de modelos.

Mas não está terminado.

Hoje é:

  • poderoso o suficiente para cargas de trabalho reais
  • promissor como fundação para roteamento mais sofisticado
  • ligeiramente áspero nas bordas de configuração e estabilidade

Se sua carga de trabalho é previsível e você pode agrupar solicitações por modelo, o modo roteador funciona bem hoje. Se você precisar de confiabilidade de nível de produção e isolamento por modelo, escolha llama-swap enquanto a implementação nativa amadurece.

De qualquer forma, você obtém comportamento semelhante ao Ollama, sem esconder a maquinaria.

Assinar

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