La aritmética de precisión mixta es una forma de aritmética de punto flotante que utiliza números con anchos variables en una sola operación.
Descripción general
Un uso común de la aritmética de precisión mixta es operar con números inexactos con un ancho pequeño y expandirlos a una representación más grande y más precisa. Por ejemplo, dos números de punto flotante de media precisión o bfloat16 (16 bits) se pueden multiplicar entre sí para dar como resultado un número flotante de precisión simple (32 bits) más preciso. [1] De esta manera, la aritmética de precisión mixta se aproxima a la aritmética de precisión arbitraria , aunque con un número bajo de posibles precisiones.
Los algoritmos iterativos (como el de descenso de gradiente ) son buenos candidatos para la aritmética de precisión mixta. En un algoritmo iterativo como el de raíz cuadrada , se puede hacer una estimación integral aproximada y refinarla a lo largo de muchas iteraciones hasta que el error de precisión haga que la suma o resta más pequeña a la estimación sea demasiado aproximada para ser una respuesta aceptable. Cuando esto sucede, la precisión se puede aumentar a algo más preciso, lo que permite utilizar incrementos más pequeños para la aproximación.
Las supercomputadoras como Summit utilizan aritmética de precisión mixta para ser más eficientes en lo que respecta a la memoria y el tiempo de procesamiento, así como al consumo de energía. [1] [2] [3]
Formato de punto flotante
Un número de punto flotante se empaqueta normalmente en una única cadena de bits, como el bit de signo, el campo de exponente y la mantisa, de izquierda a derecha. A modo de ejemplo, un número flotante de 32 bits del estándar IEEE 754 ("FP32", "float32" o "binary32") se empaqueta de la siguiente manera:
Los flotantes binarios IEEE 754 son:
Aprendizaje automático
La aritmética de precisión mixta se utiliza en el campo del aprendizaje automático , ya que los algoritmos de descenso de gradiente pueden utilizar puntos flotantes de precisión media gruesos y eficientes para ciertas tareas, pero pueden ser más precisos si utilizan puntos flotantes de precisión simple más precisos pero más lentos. Algunas plataformas, incluidas las CPU y GPU de Nvidia , Intel y AMD , proporcionan aritmética de precisión mixta para este propósito, utilizando puntos flotantes gruesos cuando es posible, pero ampliándolos a una precisión mayor cuando es necesario. [1] [2]
[4] [5]
Precisión mixta automática
PyTorch implementa precisión mixta automática (AMP), que realiza conversión automática, escala de gradiente y escala de pérdida. [6] [7]
- Los pesos se almacenan en una copia maestra con alta precisión, normalmente en FP32.
- La conversión automática significa convertir automáticamente un número de punto flotante entre diferentes precisiones, como de FP32 a FP16, durante el entrenamiento. Por ejemplo, las multiplicaciones de matrices a menudo se pueden realizar en FP16 sin pérdida de precisión, incluso si los pesos de la copia maestra se almacenan en FP32. Los pesos de baja precisión se utilizan durante el paso hacia adelante.
- El escalado de gradientes implica multiplicar los gradientes por un factor constante durante el entrenamiento, generalmente antes de la actualización del optimizador de peso . Esto se hace para evitar que los gradientes se desborden hasta llegar a cero cuando se utilizan tipos de datos de baja precisión como FP16. Matemáticamente, si el gradiente sin escalar es , el gradiente escalado es donde es el factor de escalado. Dentro de la actualización del optimizador, el gradiente escalado se convierte a una precisión más alta antes de que se reduzca (ya no se desborde, ya que está en una precisión más alta) para actualizar los pesos.
- El escalado de pérdida significa multiplicar la función de pérdida por un factor constante durante el entrenamiento, generalmente antes de la retropropagación . Esto se hace para evitar que los gradientes se desborden hasta llegar a cero cuando se utilizan tipos de datos de baja precisión. Si la pérdida sin escalar es , la pérdida escalada es donde es el factor de escalado. Dado que el escalado de gradiente y el escalado de pérdida son matemáticamente equivalentes por , el escalado de pérdida es una implementación del escalado de gradiente.
PyTorch AMP utiliza una reducción exponencial para ajustar automáticamente el factor de escala para el escalamiento de pérdidas. Es decir, aumenta periódicamente el factor de escala. Siempre que los gradientes contienen un NaN (que indica un desbordamiento), se omite la actualización del peso y se reduce el factor de escala.
Referencias
- ^ abc «Diferencia entre precisión simple, doble, múltiple y mixta». Blog de NVIDIA . 15 de noviembre de 2019. Consultado el 30 de diciembre de 2020 .
- ^ ab Abdelfattah, Ahmad; Anzt, Hartwig; Boman, Erik G.; Carson, Erin; Cojean, Terry; Dongarra, Jack; Gates, Mark; Grützmacher, Thomas; Higham, Nicholas J.; Li, Sherry; Lindquist, Neil; Liu, Yang; Loe, Jennifer; Luszczek, Piotr; Nayak, Pratik; Pranesh, Sri; Rajamanickam, Siva; Ribizel, Tobias; Smith, Barry; Swirydowicz, Kasia; Thomas, Stephen; Tomov, Stanimire; Tsai, Yaohung M.; Yamazaki, Ichitaro; Urike Meier Yang (2020). "Un estudio de métodos numéricos que utilizan aritmética de precisión mixta". arXiv : 2007.06674 [cs.MS].
- ^ Holt, Kris (8 de junio de 2018). «Estados Unidos vuelve a tener la supercomputadora más potente del mundo». Engadget . Consultado el 20 de julio de 2018 .
- ^ Micikevicius, Paulius; Narang, Sharan; Alben, Jonah; Diamos, Gregory; Elsen, Erich; Garcia, David; Ginsburg, Boris; Houston, Michael; Kuchaiev, Oleksii (15 de febrero de 2018). "Entrenamiento de precisión mixto". arXiv : 1710.03740 [cs.AI].
- ^ "Entrenamiento de precisión mixta de redes neuronales profundas". Blog técnico de NVIDIA . 2017-10-11 . Consultado el 2024-09-10 .
- ^ "Mixed Precision — PyTorch Training Performance Guide" (Guía de rendimiento de entrenamiento de precisión mixta de PyTorch). residentmario.github.io . Consultado el 10 de septiembre de 2024 .
- ^ "Lo que todo usuario debe saber sobre el entrenamiento de precisión mixta en PyTorch". PyTorch . Consultado el 10 de septiembre de 2024 .