Sinal, Expoente, Mantissa
Formato de Ponto Flutuante IEEE 754
Todo número de ponto flutuante armazena três campos:
- Bit de sinal (1 bit): positivo ou negativo
- Expoente (E bits): a escala de magnitude, uma potência inteira de 2
- Mantissa (M bits): a precisão fracionária, um número entre 1.0 e ~2.0
Total de bits = 1 + E + M. O valor é aproximadamente (-1)^sign (1 + mantissa) 2^(exponent - bias).
Duas propriedades importam para o treinamento:
Faixa dinâmica = 2^(2^E) (aproximadamente). Mais bits de expoente significa representar números minúsculos e enormes sem overflow.
Precisão = 2^M valores distintos por potência de 2. Mais bits de mantissa significa representação mais fina entre potências de 2 consecutivas.
Os Três Formatos
| Formato | Bits totais | Sinal | Exp | Mant | Faixa dinâmica | Precisão |
|---|---|---|---|---|---|---|
| FP32 | 32 | 1 | 8 | 23 | ~10^-38 a ~10^38 | ~7 dígitos |
| FP16 | 16 | 1 | 5 | 10 | ~10^-5 a ~10^5 | ~3 dígitos |
| FP8 E4M3 | 8 | 1 | 4 | 3 | ~2^-9 a ~448 | ~2 dígitos |
FP8 E4M3 significa "4 bits de expoente, 3 bits de mantissa". Uma alternativa FP8 E5M2 troca precisão por alcance; os experimentos ANDREA usam E4M3 porque as ativações do transformer permanecem em faixas estreitas de magnitude onde a precisão extra prevalece sobre o alcance extra.
Bytes Por Parâmetro
Por que Menor Precisão Executa Mais Rápido
Largura de Banda de Memória Domina a Velocidade de Treinamento
GPUs modernas passam mais tempo esperando pela memória do que computando. A RTX 4090 tem 1008 GB/s de largura de banda de memória & 165 TFLOPS de computação FP16. Uma camada típica lê pesos da VRAM, multiplica ativações, escreve resultados de volta. Largura de banda, não computação, decide o throughput.
Reduzir a precisão pela metade reduz os bytes por parâmetro pela metade, então ler os mesmos pesos usa metade da largura de banda de memória. O throughput aproximadamente dobra.
Tensor Cores: Multiplicação de Matrizes Acelerada por Hardware
A RTX 4090 possui unidades dedicadas de tensor core que computam multiplicações de matrizes em FP16 ou FP8 diretamente. Uma única operação de tensor core multiplica um pequeno bloco (ex.: 16x16) em um ciclo, dramaticamente mais rápido que multiplicações escalares FP32.
Números empíricos do ANDREA-120M:
| Precisão | Passos/min | Notas |
|---|---|---|
| FP32 | ~3 | baseline; sem aceleração por tensor core |
| FP16 | ~6 | núcleos tensor cuBLAS; 2x aceleração |
| FP8 E4M3 | ~6 | núcleos tensor; comparável ao FP16 |
O FP8 não superou o FP16 em throughput nesta carga de trabalho porque o throughput de computação deixou de ser o gargalo; a largura de banda de memória e o overhead de lançamento tornaram-se limitantes. ANDREA-120M v3 é enviado com FP16 cuBLAS a 6 passos/min para uma margem de segurança confortável sem perda de throughput.
Risco de NaN no FP8
O FP8 E4M3 representa números de ~2^-9 a ~448. Ativações ou gradientes fora dessa faixa transbordam para NaN (não é um número) ou subtransbordam para zero. Um único NaN envenena toda computação downstream: multiplicações de matriz com NaN retornam tudo-NaN; gradientes tudo-NaN corrompem o estado AdamW; AdamW com NaN m & v gera atualizações NaN; pesos tornam-se NaN; toda a execução de treinamento morre.
Os experimentos FP8 da ANDREA produziram falésias ocasionais de NaN que exigiam loss scaling, alternância programada de precisão ou caminhos de fallback. O intervalo dinâmico do FP16 (~10^-5 a ~10^5) é amplo o suficiente para que eventos NaN permaneçam raros sem truques intricados de scaling.
Escolhendo Precisão para uma Nova Execução
Ajustando 120M em uma Única 4090
O Multiplicador de 6-8x da Lição de Introdução
Lembre-se de grow_a_language_model_intro que a memória de treinamento é aproximadamente 6-8x a contagem bruta de pesos, considerando:
- Peso (1x)
- Primeiro momento Adam m (1x)
- Segundo momento Adam v (1x)
- Buffer de gradiente (1x)
- Ativações & temporárias (~2-4x, depende do lote & contexto)
ANDREA-120M em FP16 com batch_size=8, context=1024:
| Componente | Tamanho FP16 |
|---|---|
| Pesos | 240 MB |
| m (primeiro momento) | 240 MB |
| v (segundo momento) | 240 MB |
| Gradientes | 240 MB |
| Ativações | ~2-4 GB (batch, ctx) |
| Total | ~3.5 GB |
A RTX 4090 tem 24 GB de VRAM. ANDREA-120M usa ~14% em FP16. Ampla margem para tamanhos de batch maiores ou janelas de contexto mais longas. ANDREA-12M usou apenas 1.4 GB no total.
Onde a Precisão Mista Reside
O ANDREA NÃO mantém tudo em uma única precisão. O treinamento de precisão mista armazena:
- Pesos mestres: FP32 (preserva a estabilidade do treinamento)
- Cálculo forward & backward: FP16 (usa tensor cores)
- Estado do otimizador AdamW: FP32 (m & v precisam de precisão para atualizações de cauda longa)
- Buffer de gradientes: FP16 (lado do compute)
O orçamento final de memória mistura ambos. A pegada real da ANDREA fica entre FP16 puro (720 MB estado do otimizador) & FP32 puro (1.44 GB estado do otimizador), mais próximo do FP32 porque m & v permanecem em FP32.
Dimensionando um Orçamento para ANDREA-480M
Precisão na Prática
Atividades Adjacentes
Três atividades irmãs ligam à precisão:
- Atividade 1: Intro / Orçamento de VRAM. Precisão multiplica cada termo na aritmética do orçamento de memória. A regra de ouro do multiplicador 6-8x é adimensional; bytes-por-parâmetro dá unidades a ela.
- Atividade 10: AdamW. O estado do otimizador (m & v) tipicamente permanece em FP32 mesmo quando o compute forward/backward roda em FP16. Razão: a precisão do acumulador de cauda longa importa mais do que a velocidade de runtime para o otimizador.
- Atividade 12: Clipping de gradiente. O clipping limita as magnitudes do gradiente antes das atualizações do estado do otimizador. Com FP16 forward/backward & FP32 otimizador, o clipping acontece na fronteira onde a precisão muda & onde o risco de overflow se concentra.
A precisão é um knob grátis: mude-a, o modelo treina mais rápido & usa menos memória. O custo é cuidado numérico: tratamento de NaN, escalonamento de perda, disciplina de precisão mista. ANDREA-120M v3 demonstra o payoff: 120M parâmetros treinados em hardware de consumidor em 23 dias porque FP16 cortou tudo pela metade.