Skip to content

English · Español

05 — Por qué bf16 + RMSNorm se convirtieron en el default moderno

🇪🇸 La pareja bf16 + RMSNorm no es moda. Es la respuesta cuantitativa a dos preguntas: "¿qué precisión necesito en cada tensor?" y "¿cuál es el camino más barato para mantener la varianza bajo control?". En esta página enseñamos los números — exponente vs. mantisa de bf16, FLOPs y memory traffic de RMSNorm vs. LayerNorm — y mostramos por qué se asentaron juntos en Llama/Mistral/Qwen.

Anclajes: LYNX_CORTEX.md §4 / PHASE 10; LYNX_CORTEX_ADDENDUM.md §A13. Zoo de precisión §04 de la Fase 2; variantes de normalización §02 de esta fase.


Las dos preguntas

  1. Formato numéricofp32 es seguro pero caro; fp16 es barato pero su rango de exponente es lo suficientemente estrecho como para que las activaciones se desborden por debajo/arriba durante el entrenamiento. ¿Cuál es el formato más barato que no rompe el entrenamiento?
  2. Normalización — LayerNorm funciona pero cuesta 5 lecturas + 3 reducciones + 1 afín. ¿Podemos eliminar la sustracción de media sin perjudicar la convergencia?

Las respuestas — bf16 y RMSNorm — aterrizaron en el stack open-source de LLMs alrededor de 2021–2022 y no han sido desplazadas desde entonces.


bf16 vs fp16: los mismos bits totales, distribución muy diferente

Formato Signo Exponente Mantisa Rango dinámico Normal mínimo
fp32 1 8 23 ~10^-38 … 10^38 ~1.18e-38
fp16 1 5 10 ~6e-5 … 6.55e4 ~6.1e-5
bf16 1 8 7 ~10^-38 … 10^38 ~1.18e-38

El titular: bf16 tiene el rango de exponente de fp32 con sólo el coste de almacenamiento de fp16. La mantisa es más corta — 7 bits vs 10 — así que es menos preciso por número. Pero el entrenamiento de redes neuronales no necesita precisión; necesita rango.

Por qué el rango importa y la precisión no

Un gradiente de magnitud 1e-7 que fluye a través de un LayerNorm produce un denominador cerca de 1e-3.5. Los valores intermedios pueden oscilar a través de 8 órdenes de magnitud en un único paso backward. El mínimo de 6e-5 de fp16 significa que los 3 órdenes inferiores silenciosamente se desbordan a cero — los gradientes se desvanecen, el entrenamiento se estanca. El suelo de 1e-38 de bf16 evita esto por completo.

Precisión de mantisa: una mantisa de 7 bits da ~3 dígitos decimales. Eso es suficiente para representar un gradiente unitario como 1.000 ± 0.004. El descenso de gradiente estocástico es ya un estimador ruidoso — ±0.4% de ruido de cuantización está en el mismo orden que la varianza de SGD, así que no perjudica a la convergencia.

Esta es la tesis de bf16 en una frase: cambia bits de mantisa que no necesitas por bits de exponente que sí necesitas.

Evidencia empírica

  • Kalamkar et al. 2019 ("A Study of BFLOAT16 for Deep Learning Training") muestran que ResNet-50, BERT, GNMT entrenan a la misma precisión en bf16 que en fp32, mientras que fp16 necesita loss scaling (Micikevicius et al. 2018) para evitar divergencia.
  • Llama-2 (Touvron et al. 2023) entrena con pesos en bf16 + activaciones en bf16 + acumulador maestro de gradiente en fp32. La receta de precisión mixta de la Fase 18 copia esto.

RMSNorm vs LayerNorm: el balance de costes

LayerNorm sobre un tensor (B, L, d) hace, por elemento (i, j, k):

  1. calcula μ_{ij} = (1/d) Σ_k X_{ijk} — d lecturas, d-1 sumas, 1 división.
  2. calcula σ²_{ij} = (1/d) Σ_k (X_{ijk} - μ_{ij})² — d lecturas, d-1 sumas, d cuadrados, 1 división.
  3. (X - μ) / sqrt(σ² + ε) — d sustracciones, d divisiones (efectivamente, tras una raíz cuadrada recíproca).
  4. · γ + β — d multiplicaciones, d sumas.

Total: ~5d FLOPs + 2 reducciones + 5 lecturas de X.

RMSNorm:

  1. r²_{ij} = (1/d) Σ_k X_{ijk}² — d lecturas, d cuadrados, d-1 sumas, 1 división.
  2. X / sqrt(r² + ε) · γ — d divisiones, d multiplicaciones.

Total: ~3d FLOPs + 1 reducción + 3 lecturas de X.

La razón asintótica de FLOPs es 3/5 = 60%. Pero la normalización está limitada por memoria en todo acelerador moderno (es una lectura por un FLOP). La razón de memory traffic importa más:

  • LayerNorm: 5 pasadas sobre X (pasada μ, pasada σ, pasada normalize, pasada γ, pasada β fusionada).
  • RMSNorm: 3 pasadas (pasada r², pasada normalize, pasada γ fusionada).

Razón de memory traffic: ⅗ = 60%. En el panorama del roofline de la Fase 1, esto se traduce en ~40% de ahorro de wall-time para la operación de norm.

¿Quitar la media perjudica?

La media de x + f(x) tras un bloque residual depende sólo de la media de x (asumiendo E[f(x)] ≈ 0 en la inicialización, lo cual se cumple para cualquier GELU-tras-Linear con entradas de media cero). Así que la media por capa de la red ya está controlada — re-centrarla en cada capa es trabajo redundante.

Zhang & Sennrich 2019 ("Root Mean Square Layer Normalization") lo demuestran empíricamente: en T5, RMSNorm entrena 7–64% más rápido que LayerNorm sin pérdida de calidad en GLUE.

Llama (Touvron et al. 2023) adoptó RMSNorm por la misma razón. Cada modelo de la familia Llama desde entonces la usa. PaLM, Qwen, Mistral, Gemma — todos RMSNorm. La era LayerNorm de una década terminó.


Qué obtienes de la combinación

bf16 ahorra la parte baja del presupuesto de memoria de la curva de pérdida (sin loss scaling, menos underflows). RMSNorm ahorra la parte alta (menos cómputo, menos memory traffic, sin parámetro β).

Juntas, recortan el coste por paso de una capa transformer en aproximadamente 30% (regla rápida sobre H100; la fase GPU de la Fase 23 lo medirá). Para un modelo de 100B parámetros con 1T tokens, el 30% son millones de dólares y semanas de wall-time.

Tabla de la linaje bf16 + RMSNorm

Modelo Año Norm dtype de activación
GPT-2 2019 LayerNorm fp16
GPT-3 2020 LayerNorm fp16
T5 2020 RMSNorm bf16
GPT-NeoX 2022 LayerNorm fp16
Llama-1 2023 RMSNorm bf16
Llama-2 2023 RMSNorm bf16
Mistral 7B 2023 RMSNorm bf16
Qwen-1.5 2024 RMSNorm bf16
Gemma 2024 RMSNorm bf16

(La Fase 36 anotará que DeepSeek-V3 mantiene RMSNorm y bf16, con MLA encima.)


Lo que §A13 hereda

El tutor de gramática §A13 es lo bastante microscópico como para que la elección entre fp32 LayerNorm y bf16 RMSNorm no marque ninguna diferencia en la precisión final. Pero la Fase 10 aun así implementa RMSNorm por defecto porque:

  1. El modelo mental se traslada a la Fase 17 (mini-GPT) y la Fase 18 (bucle de entrenamiento), donde la elección sí importa.
  2. La precisión mixta (bf16) se difiere a la Fase 18 — pero la norm es RMSNorm desde el primer día. Este es el tipo de decisión arquitectónica que tomamos barato por adelantado porque revertirla en la Fase 25 es caro.

Citas

  • Kalamkar, D., Mudigere, D., et al. 2019. "A Study of BFLOAT16 for Deep Learning Training." arXiv:1905.12322.
  • Zhang, B., Sennrich, R. 2019. "Root Mean Square Layer Normalization." arXiv:1910.07467.
  • Touvron, H. et al. 2023. "LLaMA: Open and Efficient Foundation Language Models." arXiv:2302.13971.
  • Micikevicius, P. et al. 2018. "Mixed Precision Training." arXiv:1710.03740 — el truco de loss scaling que fp16 necesita y bf16 no.

Resumen en un párrafo

bf16 mantiene el exponente de 8 bits de fp32 (rango ~10^±38) mientras recorta la mantisa a 7 bits — exactamente el intercambio que quiere el entrenamiento de redes neuronales porque los gradientes necesitan rango, no precisión. RMSNorm elimina la sustracción de media de LayerNorm (y el parámetro de sesgo β), recortando el memory traffic al 60% y el wall-time en ~40% en la operación de norm sin pérdida de calidad. Juntos recortan el coste por paso de una capa transformer en ~30% — millones de dólares a escala frontera. El modelo §A13 no necesita ninguno de los dos, pero la Fase 10 sigue usando RMSNorm porque revertir la elección arquitectónica en la Fase 25 sería caro.


Siguiente: Fase 11 (tokenización).