Todos os 6 centros de dados operacionais

Pago em cripto · Sem verificação de identidade · Acesso root em em menos de 5 minutos

Prática guia · 11 min de leitura

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.

Memória necessária para o Llama 3.3 70B, por precisão e contexto
PrecisãoPesos Total em 8kTotal em 32kTotal em 128k
BF16 / FP16Qualidade de referência 140 GB 164 GB 173 GB 207 GB
FP8Quase referência, Hopper e Blackwell 70 GB 82 GB 86 GB 103 GB
4-bit (AWQ, GPTQ)Pesos menores, cache permanece em FP16 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ós que comportam o Llama 3.3 70B em uma placa
Precisão que cabeMemória da placatok/s estimadoPor mês
NVIDIA RTX A6000PCIe 5.0 · 768 GB/s 4-bit (AWQ, GPTQ) 48 GB ~10 $286/mês
2 × NVIDIA RTX A6000PCIe 5.0 ×16 · 768 GB/s 4-bit (AWQ, GPTQ) 48 GB ~10 $597/mês
NVIDIA L40SPCIe 5.0 · 864 GB/s 4-bit (AWQ, GPTQ) 48 GB ~11 $714/mês
NVIDIA A100 PCIePCIe 5.0 · 1,935 GB/s 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.

Confirme a máquina, depois dê aos pesos um lugar para ficar
$ 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.

vLLM, placa única, 4 bits
$ 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
Primeira requisição
$ 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

--max-model-lenDefina-o para o contexto que você atendeO vLLM reserva cache KV para o máximo declarado. Declarar 131072 quando você atende 8192 desperdiça dezesseis vezes a memória de que você precisa, e o sintoma é "concorrência insuficiente", não um erro.
--gpu-memory-utilization0.90 to 0.95A fração da placa que o vLLM pode reivindicar. Tudo o que ele não reivindica é desperdiçado; deixar o padrão de 0.90 em uma máquina dedicada custa concorrência real. Não ultrapasse 0.95.
--ipc=hostObrigatório, não opcionalSem isso, a memória compartilhada do container fica limitada a 64 MB. Em uma única placa, isso pode passar despercebido; em um modelo com sharding, o NCCL trava sem nenhum erro útil.
--tensor-parallel-sizeSomente quando o modelo não cabeFazer sharding de um modelo que cabe em uma placa o torna mais lento. Veja o guia de interconexão — essa é a forma mais comum de fazer um nó caro ter desempenho pior que um barato.
--kv-cache-dtype fp8Reduz seu cache pela metadeEm Hopper e Blackwell. Dobra o contexto ou a concorrência que você consegue manter, com um custo de qualidade que geralmente não é mensurável. O ganho mais fácil desta lista.
--max-num-seqsLimite isso à sua concorrência realDeixar em 256 em uma máquina que atende oito usuários faz o vLLM planejar para 256 e aceitar requisições que não consegue comportar, o que aparece como picos de latência em vez de recusas.

Sem publicar para o mundo todo

A API compatível com OpenAI não tem autenticação por padrão. Vinculado a 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:

Do seu notebook
$ 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.

  1. Reduza --max-model-len para o seu contexto real. Quase sempre o maior ganho isolado, e não custa nada que você estivesse usando.
  2. Aumente --gpu-memory-utilization para 0.95. Esta é uma máquina dedicada; não há mais nada na placa para o qual deixar espaço.
  3. Ative o cache KV em FP8 se a placa for compatível. Dobra o que você consegue manter.
  4. 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.
  5. 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.
Meça antes e depois — não adivinhe
$ 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.

Entrar

Console, faturas e acesso fora de banda.

Ainda não tem uma conta?

Não existe cadastro separado. Sua conta é criada enquanto você faz seu primeiro pedido — você escolhe o e-mail e a senha na etapa de pagamento, e o console já está aberto quando a máquina estiver pronta.

Configurar um servidor

Language