O erro de dimensionar por TFLOPs
O erro mais comum ao dimensionar um servidor de IA é achar que poder de cálculo resolve tudo sozinho. Na prática, a inferência de modelos de linguagem não bate primeiro no teto de processamento. Ela bate com força na física do transporte de dados. Quando montei o cluster com duas GPUs para rodar modelos locais em tempo real, isso ficou claro em poucos dias: ou você domina a hierarquia de largura de banda, ou o hardware passa a maior parte do tempo ocioso esperando dados chegarem aos núcleos.
A razão está na natureza do decode. A geração de tokens é sequencial e limitada por memória: a cada novo token, todos os bilhões de pesos precisam ser lidos de onde quer que estejam. "Onde quer que estejam" é a frase que importa.
O abismo entre VRAM, RAM e disco
| Camada | Banda típica | Modelo de 10 GB: teto por token |
|---|---|---|
| VRAM (GDDR6 / HBM) | 360 GB/s a mais de 1.000 GB/s | Cerca de 36 a mais de 100 tokens por segundo |
| RAM do sistema (DDR4 / DDR5) | 40 a 80 GB/s | 4 a 8 tokens por segundo |
| SSD NVMe (PCIe 4.0 / 5.0) | 5 a 14 GB/s | Menos de 1,5 token por segundo |
Cada degrau é quase uma ordem de grandeza. A VRAM é o único meio capaz de alimentar a GPU na velocidade necessária para gerar dezenas ou centenas de tokens por segundo. Fazer offloading de camadas para a RAM reduz a taxa de leitura em quase dez vezes de imediato. E o swap em disco transforma um modelo fluido numa experiência inviável.
A intuição diz que se 10% do modelo está na RAM, a velocidade cai 10%. A conta diz outra coisa. O tempo por token é a soma do tempo de ler cada parte de onde ela está. Com 90% dos pesos a 360 GB/s e 10% a 60 GB/s, cada gigabyte leva, em média, \(0{,}9/360 + 0{,}1/60 \approx 0{,}0042\) segundo, contra \(1/360 \approx 0{,}0028\) com tudo na VRAM. Transbordar 10% deixa o token 50% mais lento. Com 20% na RAM, duas vezes mais lento. É a lei de Amdahl ao contrário: a parte lenta domina mesmo sendo pequena, porque é seis vezes mais lenta. Foi isso que vi no nosso servidor quando o modelo quase cabia. O throughput não caiu um pouco. Desabou.
O gargalo silencioso: o barramento PCIe
Mesmo que você encha uma placa-mãe de placas de vídeo, a conexão entre elas vira o próximo obstáculo. Enquanto a VRAM interna conversa a centenas de gigabytes por segundo, um slot PCIe 4.0 x16 entrega na casa dos 30 GB/s, e slots divididos em x8, o que é comum em placas-mãe de consumo quando se instala a segunda placa, caem pela metade. Também é por esse caminho que os dados saem da RAM para a VRAM, o que explica por que o offloading é ainda pior do que a banda da RAM sugere: o dado atravessa a RAM e o PCIe.
Se a comunicação entre as placas não for ajustada com cuidado, o barramento vira a avenida engarrafada do sistema. E o tipo de paralelismo escolhido decide o quanto se trafega nela.
Paralelismo de tensor contra paralelismo de pipeline
Ao dividir um modelo entre múltiplas GPUs, há duas formas principais, e elas conversam com o barramento de modos opostos:
Tensor parallelism (TP)
- Cada camada é fatiada entre as GPUs; todas trabalham em todas as camadas
- Exige sincronização (all-reduce) a cada bloco de atenção e feed-forward
- Soma a banda de VRAM das placas: o teto de decode dobra com duas placas
- Sensível à latência e à banda da interconexão; é para onde o NVLink foi feito
Pipeline parallelism (PP)
- Cada GPU processa um bloco sequencial de camadas
- Só o estado de uma camada atravessa para a próxima placa, uma vez por token
- Exige pouca banda entre placas
- Com uma requisição por vez, uma placa trabalha enquanto a outra espera: o tempo ocioso é o custo
A escolha que fiz no cluster, duas RTX 3060 sem NVLink, foi TP com duas placas, e a razão é a conta do decode. Em decode com poucas sequências, o que atravessa o PCIe em cada all-reduce é pequeno: um vetor do tamanho da dimensão oculta por token, alguns kilobytes. O custo é mais de latência de sincronização do que de banda, e por isso o ganho de somar as duas VRAMs compensa. O cenário muda no prefill de prompts longos, quando o all-reduce carrega milhares de tokens de uma vez e a banda do PCIe passa a aparecer. É o motivo de o teto teórico de 66 tokens por segundo por sequência não ser atingido na prática: a sincronização come uma parte.
TP em PCIe funciona bem para decode com poucas sequências e piora conforme o lote e o prompt crescem. PP não sofre com o barramento, mas desperdiça uma placa por vez quando há pouca concorrência. Nenhum dos dois é "o certo". O certo depende de quantos usuários simultâneos você tem e de quão longos são os prompts deles, e isso se mede, não se chuta. Num time pequeno com prompts curtos, TP. Numa fila cheia de documentos longos, PP ou TP com interconexão de verdade.
O que isso muda na hora de montar
- Primeiro garanta que o modelo cabe inteiro na VRAM, incluindo o KV cache de que você precisa. Transbordar um pouco é a pior das configurações. Se não cabe, quantize mais ou troque de modelo antes de pensar em offloading.
- Olhe as pistas do PCIe, não só os slots. Uma placa-mãe de consumo com dois slots x16 físicos frequentemente entrega x8 e x8 quando ambos estão ocupados, ou x16 e x4. O segundo caso estrangula a segunda placa.
- Prefira banda de VRAM a TFLOPs quando o uso é conversa. A ficha técnica anuncia TFLOPs em letras grandes e GB/s em letras pequenas. Para decode, leia as pequenas.
- Meça a utilização dos núcleos sob carga. Se a GPU mostra 20% de uso e o throughput está no limite, o gargalo é memória ou barramento. Comprar mais computação não vai ajudar.
Dimensionar infraestrutura local de IA é um exercício constante de balancear a largura de banda interna de cada chip com as pontes que conectam o cluster inteiro. Os TFLOPs são a parte fácil da conta.
Resumo da conversa
- Decode lê todos os pesos a cada token. A velocidade é a banda de onde os pesos estão: VRAM, RAM ou disco, cada um quase dez vezes mais lento que o anterior.
- Transbordar 10% para a RAM deixa o token cerca de 50% mais lento, não 10%. A parte lenta domina.
- PCIe 4.0 x16 entrega na casa de 30 GB/s, metade em x8. É o caminho do offloading e da sincronização entre placas.
- TP soma VRAM e exige sincronização a cada camada; PP exige pouca banda e desperdiça placa quando há pouca concorrência. Escolha pelo padrão de uso medido.
- Para conversa, leia os GB/s da ficha técnica antes dos TFLOPs.
Igor Nascimento