Paralelismo de dados (DP): cada GPU tem uma cópia completa do modelo, processa um mini-batch diferente, e os gradientes são promediados entre as GPUs. Simples e eficiente para modelos que cabem em uma GPU. Paralelismo de tensor (TP): camadas individuais são divididas entre GPUs, com cada GPU computando parte de cada multiplicação de matrizes. Necessário quando os pesos de uma única camada não cabem em uma GPU. Paralelismo de pipeline (PP): diferentes camadas rodam em diferentes GPUs, com micro-batches fluindo pelo pipeline.
Fully Sharded Data Parallel (FSDP, do PyTorch) e DeepSpeed ZeRO (da Microsoft) fragmentam parâmetros do modelo, gradientes e estados do otimizador entre GPUs. Cada GPU armazena apenas uma fração do modelo, e os parâmetros são reunidos sob demanda para computação, depois liberados. Isso permite treinar modelos muito maiores que a memória de uma única GPU. DeepSpeed ZeRO tem três estágios: Estágio 1 fragmenta estados do otimizador, Estágio 2 adiciona gradientes, Estágio 3 adiciona parâmetros.
O desafio fundamental do treinamento distribuído é comunicação: GPUs precisam sincronizar gradientes (em paralelismo de dados) ou trocar ativações (em paralelismo de modelo/pipeline). Essa comunicação acontece via NVLink (dentro de um nó, 900 GB/s) ou InfiniBand (entre nós, 400 Gb/s). A eficiência de treinamento cai quando GPUs gastam mais tempo esperando por comunicação do que computando. Configurações ótimas minimizam comunicação entre nós mantendo operações fortemente acopladas (como paralelismo de tensor) dentro de um nó e operações fracamente acopladas (como paralelismo de dados) entre nós.