El misterio detrás de la biblioteca de precisión mixta automática PyTorch | por Mengliu Zhao | septiembre de 2024

Fundamentos del formato de datos: precisión simple (FP32) frente a precisión media (FP16)

Ahora, echemos un vistazo más de cerca a los formatos FP32 y FP16. FP32 y FP16 son formatos IEEE que representan números flotantes utilizando almacenamiento binario de 32 bits y almacenamiento binario de 16 bits. Ambos formatos constan de tres partes: a) un bit de signo, b) bits de exponente y c) bits de mantisa. FP32 y FP16 se diferencian en la Número de bits asignados al exponente y a la mantisa.lo que da como resultado diferentes rangos de valores y precisiones.

Diferencia entre FP16 (estándar IEEE), BF16 (estándar de Google Brain), FP32 (estándar IEEE) y TF32 (estándar de Nvidia). Fuente de la imagen: https://en.wikipedia.org/wiki/Bfloat16_floating-point_format

¿Cómo se convierten FP16 y FP32 a valores reales? Según los estándares IEEE-754, el valor decimal para FP32 = (-1)^(signo) × 2^(exponente decimal —127) × (1 inicial implícito + mantisa decimal), donde 127 es el valor del exponente sesgado. Para FP16, la fórmula se convierte en (-1)^(signo) × 2^(exponente decimal — 15) × (1 inicial implícito + mantisa decimal), donde 15 es el valor del exponente sesgado correspondiente. Ver más detalles del valor del exponente sesgado aquí.

En este sentido, el rango de valores para FP32 es aproximadamente [-2¹²⁷, 2¹²⁷] ~[-1.7*1e38, 1.7*1e38]y el rango de valores para FP16 es aproximadamente [-2¹⁵, 2¹⁵]=[-32768, 32768]Tenga en cuenta que el exponente decimal de FP32 está entre 0 y 255, y estamos excluyendo el valor más grande, 0xFF, ya que representa NAN. Es por eso que el exponente decimal más grande es 254–127 = 127. Se aplica una regla similar a FP16.

Para la precisión, tenga en cuenta que tanto el exponente como la mantisa contribuyen a los límites de precisión (lo que también se denomina desnormalizaciónver Discusión detallada aquí), por lo que FP32 puede representar una precisión de hasta 2^(-23)*2^(-126)=2^(-149), y FP16 puede representar una precisión de hasta 2^(10)*2^(-14)=2^(-24).

La diferencia entre las representaciones FP32 y FP16 plantea las preocupaciones clave del entrenamiento de precisión mixto, ya que Las diferentes capas/operaciones de los modelos de aprendizaje profundo son insensibles o sensibles a los rangos de valores y la precisión y deben abordarse por separado..