Avançado

Mixed precision: fp16, bf16 e fp8

Treinamento mixed-precision usa formatos compactos para velocidade e memória e preserva operações sensíveis em precisão mais larga.

Atualizada em

1

Conceito

Treinamento armazena e move enormes quantidades de ativações, pesos, gradientes e optimizer values. Formatos menores reduzem memory traffic e liberam unidades mais rápidas de aceleradores. A palavra mixed importa: treino robusto não faz cast cego de tudo para o dtype mais estreito. Ele distribui precisão segundo risco numérico.

Um float divide bits em sinal, expoente e fração. Mais bits de expoente ampliam dynamic range; mais bits de fração melhoram precisão local. fp16 usa cinco bits de expoente e dez de fração explícita. Representa com mais precisão que bf16 perto da mesma magnitude, mas seu alcance limitado torna overflow e underflow comuns.

Dynamic loss scaling protege gradientes fp16 pequenos. Multiplique a loss por um scale antes do backward. Antes do optimizer step, faça unscale e procure valores não finitos. Se houve overflow, pule o update e reduza o scale; após steps estáveis, aumente-o com cuidado. Em aritmética exata, o scale cancelaria; em representação finita, o caminho importa.

bf16 usa oito bits de expoente, como fp32, e sete de fração explícita. Seu alcance reduz problemas de overflow e underflow, enquanto a mantissa grossa aumenta arredondamento. Em hardware compatível, costuma ser um default tolerante. Acumulações e operações selecionadas ainda usam fp32.

fp8 tem oito bits totais e formatos que trocam alcance por fração, frequentemente E4M3 e E5M2. Reduz armazenamento e acelera matrizes suportadas, mas cast cru é inseguro. Receitas mantêm scales para valores ocuparem o range útil, escolhem formato por operação, acumulam em precisão maior e monitoram saturation.

Scaling pode ser por tensor, canal ou bloco. Um scale global é barato, mas um outlier desperdiça quase todo o range. Scales finos representam distribuições variadas melhor, ao custo de metadata e kernels. Delayed scaling usa máximos recentes para escolher o scale de steps futuros, equilibrando resposta e estabilidade.

Operações sensíveis costumam continuar largas: reductions, softmax, loss, estatísticas de norm, optimizer moments e master weights. Escolhas dependem de framework e arquitetura. Um kernel estável recebe input estreito e acumula internamente em fp32. Inspecione a policy por operação, não deduza pelo dtype dos parâmetros.

Treinamento distribuído acrescenta riscos. Um gradiente pode estar finito por rank e estourar na redução. Comunicação usa dtype comprimido distinto do storage. Scales precisam ser sincronizados onde tensors são logicamente compartilhados. Checkpoints guardam metadata da receita e estado do gradient scaler.

Há ainda uma diferença entre precisão de storage, precisão do cálculo e precisão da acumulação. Um peso pode ficar guardado em bf16, entrar numa multiplicação executada por unidades bf16 e ter produtos somados em fp32. Descrever a run apenas como “bf16” perde justamente a escolha que protege a soma. Uma especificação reproduzível registra essas três camadas por classe de operação.

Validação compara com baseline de precisão mais larga. Monitore loss, gradient norms, steps pulados, overflows, saturation e métricas downstream. Uma run curta sem NaNs é evidência fraca; arredondamentos pequenos mudam otimização lentamente. Não espere identidade de bits; compare distribuições e resultados.

A regra estável é gastar bits onde protegem informação. Formatos estreitos aceleram trabalho matricial tolerante. Formatos largos acumulam contribuições e preservam estado sensível. Mixed precision funciona quando fronteiras são explícitas, medidas e salvas.

2

Como explicar para uma criança de cinco anos

Uma equipe de topografia leva réguas de bolso para medidas rotineiras e um instrumento calibrado para tolerâncias minúsculas e totais. A régua leve é rápida, mas tem alcance e detalhe limitados. Mixed precision entrega réguas baratas ao trabalho matricial e guarda acumulação, normalização e registros mestres onde alcance extra importa. Uma régua única é simples, mas pode estourar numa montanha ou arredondar um fio a zero.

3

Ensine de volta

Compare fp16, bf16 e fp8 em exponent range, precisão e proteções necessárias.

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

Salvo somente neste dispositivo.

Ver uma resposta-modelo

fp16 tem mais bits de fração que bf16, mas exponent range muito menor, então gradientes pequenos frequentemente exigem dynamic loss scaling. bf16 mantém o campo de expoente do fp32 com menos fração, melhorando o alcance. Formatos fp8 trocam ainda mais precisão ou alcance por throughput e exigem scaling por tensor ou bloco, acumulação em tipos mais largos, histórico de scales e receita consciente do hardware.

4

Teste seu entendimento

1. Por que loss scaling aparece com fp16?
Resposta e explicação

Para mover gradientes pequenos ao intervalo representável antes do backward — A loss escalada produz gradientes maiores; após unscale, o update é equivalente se não houve overflow.

2. Qual vantagem de range bf16 possui sobre fp16?
Resposta e explicação

Um expoente com a mesma largura de fp32 — bf16 sacrifica precisão de mantissa e conserva o amplo exponent range de fp32.

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

Fontes

  1. Paulius Micikevicius et al. (2018). Mixed Precision Training.
  2. Paulius Micikevicius et al. (2022). FP8 Formats for Deep Learning.