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
Conclua o teach-back e acerte o quiz para finalizar a aula.
Fontes
- Paulius Micikevicius et al. (2018). Mixed Precision Training.
- Paulius Micikevicius et al. (2022). FP8 Formats for Deep Learning.