整理了一下 FP32、FP16、FP8 和 FP4 这几种浮点数数据格式的表示形式。
浮点数(Floating-point number)的通用表示形式为:
$(-1)^S \times M \times 2^E$
其中:
- $S$ 是符号位(Sign),决定了数值的正负。$S=0$ 表示正数,$S=1$ 表示负数。
- $M$ 是尾数(Mantissa/Significand),代表了有效数字的精度。
- $E$ 是指数(Exponent),代表了数值的量级。
下面是这几种常见浮点数格式的具体表示:
FP32 (Single-precision)
FP32 是最常见的浮点数格式,通常被称为单精度浮点数。
- 总位数: 32 比特
- 符号位 (S): 1 比特
- 指数位 (E): 8 比特
- 尾数位 (M): 23 比特
- 表示范围: 约 $1.18 \times 10^{-38}$ 到 $3.4 \times 10^{38}$
- 用途: 广泛用于科学计算、游戏、传统机器学习等领域,提供高精度。
FP16 (Half-precision)
FP16,也叫半精度浮点数,是 FP32 的精简版,在保持一定精度的前提下,减少了存储空间和计算量。
- 总位数: 16 比特
- 符号位 (S): 1 比特
- 指数位 (E): 5 比特
- 尾数位 (M): 10 比特
- 表示范围: 约 $6.1 \times 10^{-5}$ 到 $6.55 \times 10^{4}$
- 用途: 在深度学习训练和推理中非常流行,特别是当计算能力和内存是瓶颈时,它可以显著加速计算,同时避免大部分精度损失问题。
FP8 (8-bit floating-point)
FP8 是一种新的低精度浮点格式,目前在 NVIDIA H100 等新一代 GPU 中得到支持,旨在进一步提升深度学习的训练和推理效率。FP8 有两种主要格式:
E4M3(指数4位,尾数3位)
- 总位数: 8 比特
- 符号位 (S): 1 比特
- 指数位 (E): 4 比特
- 尾数位 (M): 3 比特
- 特点: 这种格式的指数范围较小,但尾数精度更高,更适合那些数值范围不大但对精度有一定要求的场景。
E5M2(指数5位,尾数2位)
- 总位数: 8 比特
- 符号位 (S): 1 比特
- 指数位 (E): 5 比特
- 尾数位 (M): 2 比特
- 特点: 这种格式有更大的指数范围,可以表示更大的数值,适合处理数值范围波动较大的模型,例如某些大模型。
- 用途: FP8 格式主要用于大语言模型(LLM)的训练和推理,大幅减少显存占用并提升计算速度。
FP4 (4-bit floating-point)
FP4 是目前探索中的最低精度浮点格式之一,主要用于大模型的推理场景,以实现极致的显存优化和加速。
- 总位数: 4 比特
- 符号位 (S): 1 比特
- 指数位 (E): 1 或 2 比特
- 尾数位 (M): 1 或 2 比特
- 特点: 由于位宽极低,其精度和动态范围都非常有限。FP4 的具体实现尚无统一标准,通常会根据模型的需求进行调整。
- 用途: 主要是为了在不损失太多性能的情况下,对模型进行极致压缩,以便在有限的硬件资源上进行大模型的推理部署。