Avançado

Gradient checkpointing e matemática de memória

Activation checkpointing salva fronteiras no forward e recompõe intermediários no backward, trocando compute por memória.

Atualizada em

1

Conceito

Backpropagation precisa de valores do forward para calcular gradientes. Autograd retém ativações, intermediários de attention e outros tensors até as funções de backward rodarem. Num Transformer profundo, esses valores consomem mais memória que os pesos. Activation checkpointing, também chamado gradient checkpointing, reduz o consumo esquecendo e recompondo de propósito.

Divida a rede em segmentos. No forward original, salve apenas input ou output de fronteira de cada segmento, não toda ativação interna. No backward, execute novamente o forward do segmento desde a fronteira, reconstrua intermediários, calcule gradientes e libere-os. Os parâmetros não voltam no tempo; “checkpoint” aqui é fronteira de ativação, não arquivo em disco.

O tradeoff é direto: pico menor por compute adicional. Se todo Transformer block é checkpointed, boa parte do forward roda de novo no backward. O overhead exato não é simplesmente dobrar tempo, porque backward, comunicação e trechos não checkpointed continuam, e recomputação se sobrepõe de outro modo. Meça step time e throughput realizado.

Um budget separa categorias:

Mpeak=Mparams+Mgrads+Moptimizer+Mactivations+Mtemporary+Mallocator.M_{peak}=M_{params}+M_{grads}+M_{optimizer}+M_{activations}+M_{temporary}+M_{allocator}.

Checkpointing ataca principalmente MactivationsM_{activations}. Não divide parâmetros nem moments do Adam. Talvez não elimine temporários de attention, conforme kernel e fronteira. Um job dominado por optimizer state precisa de ZeRO/FSDP; um dominado por ativações de sequência longa ganha mais.

Tamanho de ativação cresce com batch, sequência, largura e camadas salvas. Attention comum adiciona termos quadráticos, enquanto kernels memory-efficient evitam materializar a matriz completa. Combine estimativas por shape com picos medidos do allocator, pois fusão e bookkeeping mudam o que é retido.

Operações estocásticas exigem cuidado. Se dropout cria uma mask no forward e outra na recomputação, backward diferencia função diferente. Utilitários preservam ou restauram RNG state com algum custo. Módulos com estado, side effects, caches mutáveis e chamadas externas também tornam recomposição incorreta.

Granularidade muda o tradeoff. Segmentos grandes guardam poucas fronteiras, mas recompõem mais e podem reter inputs grandes. Segmentos pequenos mantêm mais checkpoints e invocam mais overhead. Policies seletivas tratam attention e FFN separadamente. Profile em vez de escolher “a cada N camadas” por tradição.

Pipeline parallelism complica scheduling porque recomputação disputa espaço com outros microbatches. FSDP pode repetir all-gather durante recompute, a menos que mantenha parâmetros materializados, trocando comunicação por memória. Compiladores podem fundir ou reordenar regiões. A unidade efetiva é o schedule distribuído inteiro.

Faça uma medição A/B com o mesmo batch e a mesma seed: sem checkpointing, com uma policy por bloco e com uma policy seletiva. Registre memória reservada e alocada, tokens por segundo e tempo de comunicação. Se a configuração economiza memória mas não permite batch, sequência ou modelo maior, o compute adicional talvez não compre benefício algum. O objetivo é remover um gargalo concreto, não maximizar a porcentagem economizada.

Uma calculadora deixa inserir batch, TT, dmodeld_{model}, camadas, bytes do dtype, expansão e intervalo, mostrando uma estimativa explicitamente simplificada. Deve rotular omissões e não apresentar contagem teórica como garantia do allocator.

O modelo mental é troca entre tempo e espaço. Guarde estado suficiente para reconstruir o grafo; descarte intermediários volumosos; pague compute para recriá-los antes dos gradientes. A decisão vem de um breakdown medido, não do fato genérico de o modelo ser grande.

2

Como explicar para uma criança de cinco anos

Uma pessoa numa trilha longa pode fotografar cada curva ou somente grandes cruzamentos. Fotografar tudo facilita a volta, mas lota o celular. Guardar só cruzamentos economiza espaço; no retorno, ela percorre cada trecho de novo para reconstruir as curvas. Checkpointing guarda fronteiras de ativações e recompõe o caminho quando os gradientes voltam.

3

Ensine de volta

Explique o que activation checkpointing guarda, o que recompõe e como estimar se resolve out-of-memory.

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

Salvo somente neste dispositivo.

Ver uma resposta-modelo

Autograd comum retém intermediários do forward. Checkpointing conserva boundary tensors e RNG state, descarta ativações internas e executa novamente o segmento durante backward. Estime separadamente parâmetros, gradientes, optimizer, ativações, attention, buffers e fragmentação; checkpointing reduz ativações elegíveis, não estado persistente, e adiciona o custo de recompor o forward dos segmentos.

4

Teste seu entendimento

1. Qual recurso activation checkpointing reduz principalmente?
Resposta e explicação

Ativações salvas do forward — Ele descarta intermediários internos e os recria depois a partir de fronteiras.

2. Por que cuidar do RNG na recomputação?
Resposta e explicação

Dropout e operações estocásticas precisam reproduzir máscaras compatíveis — Um forward estocástico diferente faria o backward derivar outra função.

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

Fontes

  1. Tianqi Chen, Bing Xu, Chiyuan Zhang e Carlos Guestrin (2016). Training Deep Nets with Sublinear Memory Cost.