Logo NascimentoIgor Nascimento / Blog
Infraestrutura

A hierarquia de largura de banda: VRAM, RAM, NVMe, PCIe e o que acontece quando o modelo transborda

O erro mais comum ao dimensionar um servidor de IA é achar que TFLOPs resolvem sozinhos. A inferência não bate primeiro no teto de processamento. Ela bate na física do transporte de dados. Uma conversa sobre o abismo entre VRAM, RAM e disco, sobre o barramento que vira avenida engarrafada quando se junta duas placas, e sobre a conta que mostra por que 10% de transbordo custa muito mais que 10%.

InfraestruturaInferência13 min de leituraIgor Nascimento

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

CamadaBanda típicaModelo de 10 GB: teto por token
VRAM (GDDR6 / HBM)360 GB/s a mais de 1.000 GB/sCerca de 36 a mais de 100 tokens por segundo
RAM do sistema (DDR4 / DDR5)40 a 80 GB/s4 a 8 tokens por segundo
SSD NVMe (PCIe 4.0 / 5.0)5 a 14 GB/sMenos 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.

Por que 10% de transbordo custa muito mais que 10%

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.

O trade-off que vale dizer de frente

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

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