En informática se denomina aritmética de precisión mixta a una forma de manejo de datos con coma 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 de baja precisión de ancho pequeño y expandirlos a una representación más grande y precisa. Por ejemplo, dos números de coma flotante de media precisión o bfloat16 (16 bits) se pueden multiplicar para obtener un número de coma flotante de simple precisión (32 bits), de mayor precisión. 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 reducido de precisiones posibles.

Los algoritmos iterativos (al igual que los métodos basados en el descenso del gradiente) son buenos candidatos para la aritmética de precisión mixta. En un algoritmo iterativo como el cálculo de una raíz cuadrada, se puede realizar una estimación aproximada de la integral y refinarla en muchas iteraciones hasta que el error de precisión haga que la suma o resta más pequeña a la estimación siga siendo demasiado imprecisa para ser una respuesta aceptable. Cuando esto sucede, se puede aumentar la precisión, lo que permite utilizar incrementos más pequeños para la aproximación.

Los algoritmos empleados en supercomputadoras, como Summit, utilizan aritmética de precisión mixta para ser más eficientes en cuanto a memoria, tiempo de procesamiento y consumo de energía.

Formato de punto flotante Un número de punto flotante se suele empaquetar en una única cadena de bits (incluyendo el bit de signo, el campo del exponente y la mantisa o significando), de izquierda a derecha. Por ejemplo, un número de punto flotante estándar de 32 bits IEEE 754 (FP32, float32 o binary32) se empaqueta de la siguiente manera:

Los números de punto flotante binarios IEEE 754 son:

TipoBitsSesgo del exponenteBits de precisiónNúmero de dígitos decimalesSignoExponenteSignificanciaTotalMedia (IEEE 754-2008)1510161511~3.3Simple18233212724~7.2Doble1115264102353~15.9x86 precisión extendida11564801638364~19.2Cuádruple11511212816383113~34.0

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 del gradiente pueden usar números de coma flotante de precisión media, que son más aproximados y eficientes para ciertas tareas, pero pueden ser más precisos si usan números de coma flotante de precisión simple, que son más precisos pero más lentos. Algunas plataformas, incluidas las CPU y GPU NVIDIA, Intel y AMD, proporcionan aritmética de precisión mixta para este propósito, usando números de coma flotante aproximados cuando es posible, pero ampliándolos a mayor precisión cuando es necesario.

Precisión mixta automática La biblioteca de funciones PyTorch incluye la precisión mixta automática (AMP), que realiza conversión automática de tipos, escalado de gradiente y escalado de pérdida.

Los pesos se almacenan en una copia maestra con alta precisión, generalmente en FP32.

Autocasting significa convertir automáticamente un número de punto flotante entre diferentes precisiones, como de FP32 a FP16, durante el entrenamiento. Por ejemplo, las operaciones de multiplicación 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 la pasada hacia adelante.

Gradient scaleing significa multiplicar las operaciones de gradiente por un factor constante durante el entrenamiento, normalmente antes de la actualización de la optimización de pesos. Esto se hace para evitar que los gradientes se desborden 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 escala. Durante la actualización del optimizador, el gradiente escalado se convierte a una precisión mayor antes de reducir su escala (ya no presenta subdesbordamiento, al estar en una precisión mayor) para actualizar los pesos.

Escalado de la pérdida significa multiplicar la función de pérdida por un factor constante durante el entrenamiento, normalmente antes de la retropropagación. Esto se hace para evitar que los gradientes presenten subdesbordamiento a cero al usar tipos de datos de baja precisión. Si la pérdida sin escalar es , la pérdida escalada es , donde es el factor de escala. Dado que el escalado del gradiente y el escalado de la pérdida son matemáticamente equivalentes según , el escalado de la pérdida es una implementación del escalado del gradiente.

PyTorch AMP utiliza retroceso exponencial para ajustar automáticamente el factor de escala de la función de pérdida. Es decir, lo incrementa periódicamente. Cuando los gradientes contienen NaN (que indica desbordamiento), se omite la actualización de los pesos y se reduce el factor de escala.

Referencias

Categoría:Aritmética computacional