FP32 & TF32

2021-10-27 12:00:24 浏览数 (1)

Float 浮点数

是属于有理数中某特定子集的数的数字表示,在计算机中用以近似表示任意某个实数,小数点可以“浮动”。实数由一个整数或定点数(即尾数/significand/mantissa)乘以某个基数exponent(计算机中通常是2)的整数次幂得到,这种表示方法类似于基数为10的科学计数法。

FP = Floating Point 浮点算术

在计算中,浮点算术( FP ) 是使用实数的公式表示作为近似值来支持范围和精度之间的权衡的算术。出于这个原因,浮点计算通常用于需要快速处理时间的非常小和非常大的实数系统。在一般情况下,一个浮点数是具有固定数目的近似表示显著数字(的有效数),并使用缩放指数在一些固定的底座; 缩放的基数通常是 2、10 或 16。有效数是整数,基数是大于或等于 2的整数,指数也是整数。

FLOPS = Floating Point Operations Per Second (FLOPS, flops or flop/s) 每秒浮点运算次数

浮点运算的速度,通常用FLOPS来衡量,是计算机系统的一个重要特性,特别是对于涉及密集数学计算的应用程序。

FP32 = float32 单精度浮点格式

IEEE 754-2008 标准指定了额外的浮点类型,例如 64 位 base-2双精度,以及最近的 base-10 表示。

TF32 = TensorFlow-32 英伟达提出的代替FP32的单精度浮点格式

NVIDIA A100/Ampere安培架构 GPU 中的新数据类型,TF32 使用与半精度 (FP16) 数学相同的 10 位尾数,表明对于 AI 工作负载的精度要求有足够的余量。并且TF32采用与FP32相同的8位指数,因此可以支持相同的数值范围。

TF32 在性能、范围和精度上实现了平衡。

TF32 采用了与半精度( FP16 )数学相同的10 位尾数位精度,这样的精度水平远高于AI 工作负载的精度要求,有足够的余量。同时, TF32 采用了与FP32 相同的8 位指数位,能够支持与其相同的数字范围。

这样的组合使TF32 成为了代替FP32进行单精度数学计算的绝佳替代品,尤其是用于大量的乘积累加计算,其是深度学习和许多HPC 应用的核心。

借助于NVIDIA 函示库,用户无需修改代码,即可使其应用程式充分发挥TF32 的各种优势。TF32 Tensor Core 根据FP32 的输入进行计算,并生成FP32 格式的结果。目前,其他非矩阵计算仍然使用FP32 。

为获得最佳性能, A100 还具有经过增强的16 位数学功能。它以两倍于TF32 的速度支持FP16 和Bfloat16 ( BF16 )。利用自动混合精度,用户只需几行代码就可以将性能再提高2 倍。

所以通过降低精度让TF32新单精度数据类型代替了FP32原有的单精度数据类型,从而减少了数据所占空间大小在同样的硬件条件下可以更多更快地运行。

代码语言:python代码运行次数:0复制
# Tensorflow enable
tf.config.experimental.enable_tensor_float_32_execution(
    enabled
)

需要显卡支持

代码语言:python代码运行次数:0复制
x = tf.fill((2, 2), 1.0001)
y = tf.fill((2, 2), 1.)
# TensorFloat-32 is enabled, so matmul is run with reduced precision
print(tf.linalg.matmul(x, y))  # [[2., 2.], [2., 2.]]
tf.config.experimental.enable_tensor_float_32_execution(False)
# Matmul is run with full precision
print(tf.linalg.matmul(x, y))  # [[2.0002, 2.0002], [2.0002, 2.0002]]

混合精度

是指训练时在模型中同时使用 16 位和 32 位浮点类型,从而加快运行速度,减少内存使用的一种训练方法。通过让模型的某些部分保持使用 32 位类型以保持数值稳定性,可以缩短模型的单步用时,而在评估指标(如准确率)方面仍可以获得同等的训练效果。本文介绍如何使用实验性 Keras 混合精度 API 来加快模型速度。利用此 API 可以在现代 GPU 上将性能提高三倍以上,而在 TPU 上可以提高 60%。

注:Keras 混合精度 API 目前是实验版本,可能会更改。

如今,大多数模型使用 float32 dtype,这种数据类型占用 32 位内存。但是,还有两种精度较低的 dtype,即 float16 和 bfloat16,它们都是占用 16 位内存。现代加速器使用 16 位 dtype 执行运算的速度更快,因为它们有执行 16 位计算的专用硬件,并且从内存中读取 16 位 dtype 的速度也更快。

NVIDIA GPU 使用 float16 执行运算的速度比使用 float32 快,而 TPU 使用 bfloat16 执行运算的速度也比使用 float32 快。因此,在这些设备上应尽可能使用精度较低的 dtype。但是,出于对数值的要求,为了让模型训练获得相同的质量,一些变量和计算仍需使用 float32。利用 Keras 混合精度 API,float16 或 bfloat16 可以与 float32 混合使用,从而既可以获得 float16/bfloat16 的性能优势,也可以获得 float32 的数值稳定性。

需要显卡支持

代码语言:javascript复制
import tensorflow as tf

from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras.mixed_precision import experimental as mixed_precision
policy = mixed_precision.Policy('mixed_float16')
mixed_precision.set_policy(policy)
print('Compute dtype: %s' % policy.compute_dtype)
print('Variable dtype: %s' % policy.variable_dtype)

官方案例中构建模型

代码语言:javascript复制
inputs = keras.Input(shape=(784,), name='digits')
if tf.config.list_physical_devices('GPU'):
  print('The model will run with 4096 units on a GPU')
  num_units = 4096
else:
  # Use fewer units on CPUs so the model finishes in a reasonable amount of time
  print('The model will run with 64 units on a CPU')
  num_units = 64
dense1 = layers.Dense(num_units, activation='relu', name='dense_1')
x = dense1(inputs)
dense2 = layers.Dense(num_units, activation='relu', name='dense_2')
x = dense2(x)

0 人点赞