一、浮点数

在深度学习中,几乎所有的运算都基于浮点数。计算机中常见的浮点数格式通常为单精度浮点和双精度浮点。

1.1 FP32(单精度)

单精度浮点总共32位,由1位浮点数、8位指数位、23位尾数位构成。

这是Pytorch的默认数据类型 torch.float32, 其可表示的范围覆盖-3.4e+38~3.4e+38,精度高,动态范围大,几乎不会出现溢出或下溢。

1.2 FP64(双精度)

64位,更高精度,由1位浮点数、11位指数位,32位尾数位构成。

因为成本太高,很少在深度学习中使用。

1.3 FP16(半精度)

16位,由1位浮点数、5位指数位,10位尾数位构成。

动态范围比FP32小很多,但尾数精度仍然不错。

1.4 BF16(Brain Floating Point 16)

也是16位,不过是由1位符号数、8位指数位、7位尾数位构成。

与FP16不同的是,通过牺牲一些尾数精度,喊来与FP32几乎相同的动态范围(指数位同为8位)。

这是目前大模型训练中最常用的格式(尤其是混合精度训练)。

二、低精度格式

2.1 FP16 / BF16(2017-2019年流行)

混合精度训练(AMP)让训练速度提升2-3倍,同时精度几乎无损。

NVIDIA A100及以后的GPU原生支持。