Servindo o Llama 3.3 70B em um nó.
De uma máquina entregue há cinco minutos a um endpoint compatível com OpenAI respondendo requisições — com as duas flags que silenciosamente reduzem seu throughput pela metade e a que compromete sua máquina.
A resposta curta
- Memória necessária
- 43 GB em 4 bits, 82 GB em FP8, 164 GB em BF16 — tudo em contexto de 8k
- Máquina mais simples
- Uma placa de 80 GB. Sem sharding, sem interconexão, sem sincronização
- Tempo até o primeiro token
- Menos de quinze minutos a partir da entrega, a maior parte baixando os pesos
- O único erro
- Publicar a porta 8000 em um endereço público. Ela não tem autenticação
O que você precisa
70 bilhões de parâmetros. Em 4 bits, isso são 35 GB de pesos; o cache KV adiciona 2.5 GB em um contexto de 8k para uma única requisição, e a sobrecarga de execução é de cerca de 15%. Tudo o mais decorre desses três números — o guia de dimensionamento mostra de onde eles vêm.
| Precisão | Pesos | Total em 8k | Total em 32k | Total em 128k |
|---|---|---|---|---|
| BF16 / FP16 | 140 GB | 164 GB | 173 GB | 207 GB |
| FP8 | 70 GB | 82 GB | 86 GB | 103 GB |
| 4-bit (AWQ, GPTQ) | 35 GB | 43 GB | 52 GB | 86 GB |
Observe a linha de 4 bits em 128k: os pesos encolhem para 35 GB, mas o cache não encolhe nada, porque AWQ e GPTQ quantizam apenas os pesos. Esse único fato decide a maior parte da escolha de máquina abaixo.
Escolhendo o nó
As máquinas mais baratas do nosso catálogo que comportam este modelo em uma única placa, que é a configuração que você quer, se puder ter — sem sharding significa sem sincronização e uma coisa a menos para depurar.
| Nó | Precisão que cabe | Memória da placa | tok/s estimado | Por mês |
|---|---|---|---|---|
| NVIDIA RTX A6000 | 4-bit (AWQ, GPTQ) | 48 GB | ~10 | $286/mês |
| 2 × NVIDIA RTX A6000 | 4-bit (AWQ, GPTQ) | 48 GB | ~10 | $597/mês |
| NVIDIA L40S | 4-bit (AWQ, GPTQ) | 48 GB | ~11 | $714/mês |
| NVIDIA A100 PCIe | 4-bit (AWQ, GPTQ) | 80 GB | ~25 | $1,091/mês |
O throughput é a geração de fluxo único, limitada pela largura de banda de memória, e deliberadamente conservadora. Com o processamento contínuo por lotes, o total agregado entre requisições simultâneas é várias vezes maior — esse é o objetivo do vLLM.
Dez minutos de configuração
Nada aqui é específico da nossa empresa, exceto o endereço. O Docker, o NVIDIA Container Toolkit e uma pilha de drivers funcional já estão na máquina.
$ ssh root@203.0.113.42
$ nvidia-smi --query-gpu=name,memory.total --format=csv
# Weights on the fast local NVMe, not the system volume.
$ mkdir -p /scratch/models
$ df -h /scratch
# A gated model needs a token. Skip if yours is open.
$ export HF_TOKEN=hf_xxxxxxxxxxxxxxxxxxxx
Iniciando o servidor
Um container. A primeira execução baixa aproximadamente 40 GB de pesos quantizados, o que em uma porta 1 Gbit/s leva alguns minutos; toda reinicialização depois disso leva segundos.
$ docker run -d --name vllm --restart unless-stopped \
--gpus all --ipc=host \
-v /scratch/models:/root/.cache/huggingface \
-e HF_TOKEN="$HF_TOKEN" \
-p 127.0.0.1:8000:8000 \
vllm/vllm-openai:latest \
--model casperhansen/llama-3.3-70b-instruct-awq \
--quantization awq_marlin \
--max-model-len 8192 \
--gpu-memory-utilization 0.92
# Watch it load. "Application startup complete" is the signal.
$ docker logs -f vllm
$ curl -s http://127.0.0.1:8000/v1/models | head
$ curl -s http://127.0.0.1:8000/v1/chat/completions \
-H 'Content-Type: application/json' \
-d '{"model":"casperhansen/llama-3.3-70b-instruct-awq",
"messages":[{"role":"user","content":"In one sentence: what is a KV cache?"}],
"max_tokens":80}'
As flags que importam
Sem publicar para o mundo todo
0.0.0.0 em um endereço público, é um servidor de inferência aberto, e scanners encontram esses em poucas horas. Note o -p 127.0.0.1:8000:8000 no comando acima — esse endereço inicial é o que mantém isso fora da internet, e é o caractere mais frequentemente esquecido ao copiar um comando de outro lugar.
Acesse a partir da sua própria máquina por um túnel SSH — nenhuma porta aberta, nenhum certificado para gerenciar, nada para configurar errado:
$ ssh -N -L 8000:127.0.0.1:8000 root@203.0.113.42
# Now http://127.0.0.1:8000 on your laptop is the server.
Se realmente precisar ser público, coloque um proxy reverso na frente com TLS e uma chave de API, e restrinja também os endereços de origem no firewall. A documentação tem um conjunto mínimo de regras. Cautela redobrada é a postura correta para um endpoint que vai responder a qualquer um que perguntar.
Aumentando o throughput
Na ordem que vale a pena tentar. As duas primeiras são gratuitas e costumam dar os maiores ganhos.
- Reduza
--max-model-lenpara o seu contexto real. Quase sempre o maior ganho isolado, e não custa nada que você estivesse usando. - Aumente
--gpu-memory-utilizationpara 0.95. Esta é uma máquina dedicada; não há mais nada na placa para o qual deixar espaço. - Ative o cache KV em FP8 se a placa for compatível. Dobra o que você consegue manter.
- Agrupe em lotes no lado do cliente. O processamento contínuo por lotes só ajuda se as requisições chegarem de forma simultânea. Requisições uma de cada vez deixam a maior parte da placa ociosa, seja qual for a configuração.
- Só então, e apenas então, considere uma placa mais rápida. A geração é limitada pela largura de banda de memória, então uma H200 a 4.800 GB/s é aproximadamente 2,4× uma H100 PCIe a 2.000 para o mesmo modelo — um ganho real, e o mais caro desta lista.
$ docker exec vllm python -m vllm.entrypoints.openai.api_server --help | head -1
$ docker exec vllm vllm bench serve \
--model casperhansen/llama-3.3-70b-instruct-awq \
--num-prompts 200 --request-rate 8
# And watch the card while it runs: if utilisation sits below 90%,
# the bottleneck is your client, not the GPU.
$ nvidia-smi dmon -s um
Mantendo em funcionamento
Três coisas que vale a pena fazer no primeiro dia, porque as três são chatas de descobrir no décimo quarto.
Política de reinicialização
--restart unless-stopped está no comando acima. Depois de uma reinicialização, o container volta e os pesos já estão em /scratch, então ele fica pronto em menos de um minuto.
Observe a placa, não o processo
Uma GPU que caiu do barramento mantém um container com aparência saudável. nvidia-smi -q -d PERFORMANCE em uma verificação de integridade detecta isso; uma verificação de porta não.
Os pesos não têm backup
Eles estão no seu NVMe local e em nenhum outro lugar. Tudo bem — eles podem ser baixados novamente. Seus adaptadores de fine-tuning não podem, então guarde-os em algum lugar fora da máquina.
E quando o prazo termina, os discos são apagados dentro de uma hora, sem período de tolerância. Tudo em /scratch vai junto. Isso é proposital — é a mesma garantia que assegura que a máquina que você recebeu não tinha dados de mais ninguém — mas significa que o último dia de um prazo não é o dia para começar a copiar as coisas de lá.
Verifique este modelo contra cada nó que alugamos.
O configurador informa quais configurações o comportam em uma única placa, quais precisam dividi-lo, e quanto cada uma custa.
Outros guias
- Prática · 10 min
Fine-tuning de um modelo de 70B em uma placa
QLoRA em uma única GPU de 48 GB: o que cabe, quanto custa por mês, e por que o fine-tuning completo exige outra categoria de máquina.
Ler o guia - Pagamento · 8 min
Pagando um servidor em cripto
O que realmente acontece entre clicar em pagar e receber o root, qual moeda escolher, e os quatro erros que fazem perder dinheiro no primeiro pagamento.
Ler o guia - Dimensionamento · 9 min
Quanta VRAM um modelo realmente precisa
A aritmética por trás de “será que cabe”: pesos, cache KV, e os dois pontos em que uma regra prática erra por um fator de três.
Ler o guia