模型参数的常见数据类型:
- Float32 (FP32) 是标准的 32 位浮点表示,包含 1 符号位+8 指数位+23 尾数位
- Float16 (FP16) 则包含 1 符号位+5 指数位+10 尾数位,数值范围远小于 FP32
- Bfloat16 (BF16) 包含 1 符号位+8 指数位+7 尾数位,牺牲精度来保证数值范围
- TensorFloat-32 (TF32) ,使用 19 位表示,结合了 BF16 的范围和 FP16 的精度
- Int8 (INT8) 是一个 8 位的整型数据表示,可以存储 256 个不同的值
在机器学习术语中,FP32 称为全精度 (4 字节),而 BF16 和 FP16 称为半精度 (2 字节)
理想情况下,模型的训练和推理都应该在 FP32 中完成;但实践中一般使用混合精度训练(Automatic Mixed Precision,AMP),即在针对不同的层,采用不同的数据精度进行计算(一般主权重维持 FP32,正向传播和梯度计算则使用 BF16/FP16)以节省显存和加速
以 FP16 为例,展示特定数值的存储和计算:
- 符号位为 0,表示该数值为正数
- 指数位的偏移量为15,规范化后的指数为 1,实际存储指数为 16
- 尾数位是规范化后的二进制数的小数部分,即
1001001
(需补足 10 位)
不同数据类型的数值范围: