Avançado

Data parallelism, ZeRO e FSDP

Data parallelism aumenta throughput, enquanto ZeRO e FSDP dividem parâmetros, gradientes e optimizer state para caber modelos maiores.

Atualizada em

1

Conceito

Um acelerador processa batch limitado e guarda estado limitado. Data parallelism eleva throughput dando a vários workers réplicas idênticas do modelo e exemplos diferentes. Se o rank rr calcula grg_r, uma redução coletiva forma média ou soma usada por todos. Começar com pesos iguais e aplicar gradientes iguais mantém sincronização.

O global batch combina ranks e gradient accumulation. Com PP ranks, microbatch local bb, comprimento TT e aa steps acumulados, o batch contém PbaTPbaT tokens, ignorando padding. Aumentar workers sem ajustar isso muda otimização, não só velocidade.

Replicação custa memória. Adam mixed-precision pode manter parâmetros de baixa precisão, gradientes, master weights em precisão maior e dois tensors de moments. Bytes exatos dependem de implementação e dtype, mas optimizer state pode superar o peso de inference. Data parallelism comum duplica tudo em todo rank.

ZeRO decompõe redundância em estágios. Stage 1 divide optimizer state. Stage 2 divide também gradientes. Stage 3 divide parâmetros. Cada rank possui uma fração persistente, enquanto collectives disponibilizam peças necessárias. Os nomes descrevem ownership de memória, não novo optimizer.

Fully Sharded Data Parallel envolve módulos nesse padrão. Antes do forward, ranks fazem all-gather dos shards para materializar parâmetros completos necessários localmente. Depois, podem fazer reshard. No backward, a comunicação reconstrói parâmetros quando preciso e reduce-scatter envia shards de gradientes aos donos. Comunicação e compute podem se sobrepor quando ordem e rede permitem.

Wrapping policy importa. Unidade grande gera pico alto de all-gather e pouca sobreposição. Pequena cria muitos collectives e deixa latency dominar. Fronteiras de Transformer blocks são comuns por oferecerem compute substancial. Prefetch do próximo bloco esconde latency, mas aumenta memória simultânea.

Checkpoint também vira distribuído. Reunir full state dict pode exceder host memory. Checkpoints sharded deixam ranks escreverem seus tensores e metadata reconstrói nomes e shapes globais. Retomar com outro world size exige formato que reshard. Salvar só pesos não continua exatamente: optimizer, scheduler, scaler, RNG e data-loader state importam.

Falhas precisam ser coletivas. Se um rank encontra dado ruim enquanto outros entram em all-reduce, o job pode travar. Timeouts, propagação coordenada, logs rank-aware e batch IDs reproduzíveis são necessários. Topologia da rede também conta: links rápidos no node e lentos entre nodes favorecem collectives hierárquicos.

Eficiência precisa ser medida por fase. Registre tempo de forward, backward, all-gather, reduce-scatter, optimizer step e data loading, além do pico de memória por rank. Uma média global esconde stragglers: se um único rank recebe batches mais longos ou hardware degradado, todos esperam no collective. O melhor wrapping é aquele que melhora throughput realizado sem tornar o pico imprevisível.

A visualização deve distinguir ownership de materialização temporária. Mostre shards persistentes coloridos, depois um all-gather em torno de um bloco, compute em dados diferentes e reduce-scatter. Exibir o modelo completo permanentemente em todo rank representaria mal o ganho.

O modelo estável é compute replicado sobre dados diferentes com estado progressivamente sharded. Data parallelism compra throughput; ZeRO e FSDP removem memória redundante. O preço é comunicação, orquestração e semântica mais exigente de checkpoint e falha.

2

Como explicar para uma criança de cinco anos

Várias cozinhas recebem pedidos diferentes e usam a mesma receita. Data parallelism comum dá uma despensa completa a cada uma e combina correções depois do serviço. Sharding divide estoque, ledgers e até cartões de receita; ingredientes são reunidos pouco antes do prato e liberados depois. Cabe mais armazenamento coletivamente, mas o tráfego de entregas entra no tempo de cozinhar.

3

Ensine de volta

Compare data parallelism replicado com ZeRO/FSDP e indique a comunicação de um training step.

Mínimo: 80 caracteres e 15 palavras. Seu texto fica somente neste navegador.

Salvo somente neste dispositivo.

Ver uma resposta-modelo

Data parallelism mantém modelo e optimizer completos em cada rank, processa microbatches diferentes e faz all-reduce dos gradientes. ZeRO divide progressivamente optimizer state, gradientes e parâmetros. FSDP faz all-gather dos shards de uma camada antes do cálculo, reduce-scatter dos gradientes no backward e pode reshard parâmetros, reduzindo memória por rank ao custo de comunicação e scheduling.

4

Teste seu entendimento

1. O que é replicado em data parallel training comum?
Resposta e explicação

O modelo completo em cada rank — Cada rank possui todos os parâmetros e recebe uma parte diferente do batch.

2. O que FSDP costuma all-gather antes de calcular um módulo?
Resposta e explicação

Os parâmetros completos daquele módulo — Ranks trocam shards just-in-time para executar forward ou backward local.

Conclua o teach-back e acerte o quiz para finalizar a aula.

Fontes

  1. Samyam Rajbhandari et al. (2019). ZeRO: Memory Optimizations Toward Training Trillion Parameter Models.
  2. Yanli Zhao et al. (2023). PyTorch FSDP: Experiences on Scaling Fully Sharded Data Parallel.