
Sessenta contêineres em um servidor
Uma caixa bare-metal executa dezenas a centenas de contêineres Hoody. KSM e BTRFS dedup fazem o custo marginal próximo a zero.
Você está rodando um modelo 70B em uma única caixa de GPU. Cinquenta contêineres downstream pela sua frota precisam da mesma resposta para a mesma query — estão pontuando o mesmo catálogo, gerando os mesmos embeddings, avaliando o mesmo experimento. Não pague por cinquenta inferências. Rode o modelo uma vez, faça broadcast dos tokens.
# generate once, pipe upwardllama.cpp -m llama3-70b.gguf \ -p "$PROMPT" --stream \ | curl -T - \ /pipe/llm?n=50pipe/llm?n=50UM CAMINHO · CINQUENTA LEITORESo modelo roda uma vez · o pipe faz broadcast · workers lentos atrasam só a si mesmos
A resposta ingênua é um servidor HTTP com fila, batching de requisições e contenção de lock. A resposta mais barata para esse formato: cada query vai para um caminho de pipe com ?n=50. O modelo roda uma vez. Cinquenta contêineres consumidores fazem GET no mesmo caminho e recebem os mesmos tokens ao mesmo tempo, distribuídos pelo pipe. Um worker lento aplica backpressure só na própria conexão — os outros ficam na velocidade da linha.
# 1× GPU box — run the model once and pipe its tokens upward.
llama.cpp -m llama3-70b.gguf -p "$PROMPT" --stream \
| curl -T - https://pipe.hoody.com/api/v1/pipe/llm?n=50
# 50 consumer containers — same path, ?n=50, fanned out by the pipe.
for i in $(seq 1 50); do
curl https://pipe.hoody.com/api/v1/pipe/llm?n=50 \
| jq -c .delta \
| ./score.py --worker $i &
done
# Sender blocks until 50 readers have connected, then bytes flow.
# Slow workers backpressure their own connection — others stay at line speed.PUT manda bytes pra cima. GET puxa pra baixo. O parâmetro ?n=50 diz quantos leitores esperar; o pipe segura a conexão até essa quantidade conectar, e aí distribui o stream em fan-out simultaneamente para todos. Sem fila, sem camada de batching, sem servidor-de-inferência-com-load-balancer.
cinquenta contêineres downstream querem a mesma resposta; você gera ela na GPU uma vez. O pipe cuida da entrega. Sem framework de batching de requisições, sem camada de cache de tokens, sem coordenação de "por favor não rode de novo".
o pipe bloqueia até cinquenta receivers conectarem, então transmite os bytes do produtor para cada um em paralelo. Cópias idênticas, entrega na velocidade da linha, zero armazenamento no servidor. Até 256 receivers por caminho.
se um contêiner consumidor está em GC ou seu disco está ocupado, a conexão dele atrasa. O pipe aplica backpressure naquele receiver — os outros 49 continuam transmitindo a toda velocidade. Sem head-of-line blocking, sem ajuste de profundidade de fila.
Quando cinquenta contêineres querem a mesma resposta, as alternativas cobram por chamada, por token ou por servidor de inferência. O pipe cobra por uma transferência HTTP. Rode o modelo numa caixa que você já aluga.
isso não é toda carga de trabalho — é o formato em que N contêineres querem a mesma resposta. Quando esse é seu formato, o pipe é o fan-out mais barato que você vai cabear. Cargas com prompts divergentes ainda querem um servidor de inferência de verdade; esse padrão brilha quando a pergunta é idêntica e a frota é larga.
Uma GPU, um pipe, cinquenta contêineres provando os mesmos tokens.
Toda stack de "dê acesso a um modelo pra minha frota" que você procura quando uma query precisa alimentar muitos consumidores. Cada uma cobra por chamada, hospeda seus pesos ou pede pra você rodar um load balancer na frente do vLLM. O pipe faz broadcast uma vez.
Pare de pagar cinquenta contas de inferência por uma resposta. Rode o modelo onde você já aluga o silício. Abra um pipe. Deixe a frota ler.