模型量化实在是太常见了,但是我完全不知道 quantization 是什么东西,不好!
float
在计算机中,float
是一种用于表示单精度浮点数的标准数据类型。浮点数的存储遵循 IEEE 754 标准,具体来说,32 位浮点数由三部分组成:
-
符号位 (Sign bit):占 1 位
- 0 表示正数
- 1 表示负数
-
指数部分 (Exponent):占 8 位
- 用于表示浮点数的“大小”或“数量级”。
- 指数采用偏移二进制(biased representation),具体的偏移量是 127。所以,存储的指数值是实际指数值加上 127。
这里这个 127 偏移可以理解为,从 0~255,又要表示正负,所以偏移 127
-
尾数部分 (Mantissa or Fraction):占 23 位
- 存储的是浮点数的小数部分(不包含“1”这一部分)。浮点数通常是规范化表示的,所以在存储时不直接存储“1”,而假设它存在。这个假设是隐式的。
浮点数的表示形式
浮点数的标准表示形式是:
[
(-1)^{sign} \times 1.mantissa \times 2^{(exponent - 127)}
]
其中:
sign
是符号位mantissa
是尾数部分,它存储的是有效数字的二进制表示(包括小数点后的部分)exponent
是指数部分的值,经过偏移 127 后得到实际的指数。
例子:如何存储 5.75
让我们以 5.75 为例来说明如何将一个浮点数表示为 IEEE 754 单精度浮点数。
-
转换为二进制形式:
- 5.75 = 101.11 (二进制表示)
-
规范化:
- 规范化为 1.0111 × 2²
-
分解为三部分:
- 符号位:由于是正数,符号位是 0。
- 尾数部分:去掉 1,得到 0111 (尾数部分只存储小数部分,且只保留 23 位)。
- 指数部分:实际指数是 2,偏移量是 127,因此存储的指数值是 2 + 127 = 129,二进制表示为 10000001。
-
组合成 32 位二进制数:
- 符号位:0
- 指数部分:10000001
- 尾数部分:01110000000000000000000
最终,5.75 的 IEEE 754 单精度浮点数表示为:
0 10000001 01110000000000000000000
注意事项
- 精度问题:浮点数表示有限的二进制位,可能导致精度丢失。例如,某些小数无法精确表示为二进制数。
- 零:IEEE 754 标准对零的表示有特殊定义,使用全零的指数和尾数,但符号位不同表示正零和负零。
- 特殊值:IEEE 754 标准还定义了“无穷大”和“NaN”(非数字)等特殊值,通过特定的指数和尾数组合来表示。
总结
float
类型通过符号位、指数部分和尾数部分来表示浮点数,采用的是 IEEE 754 标准的单精度格式。由于尾数部分有限,可能导致浮点数的精度丧失,但可以表示非常大的或非常小的数值范围。
和 float 的实现类似,double 类型不过是把指数换成了 11 位,尾数换成了 52 位;float128 和 long double 的指数 15 位,尾数 112 位
于是先解释一下名词 fp8 fp18 fp32 bf16
这些术语都是与数值表示和计算精度相关的浮点数格式,通常用于机器学习、科学计算和硬件加速领域。它们表示不同的浮点数精度,每种精度有不同的表示范围和计算性能。
-
FP8 (8-bit Floating Point):
- 这种格式使用8个位来表示浮点数。通常有不同的变种,常见的包括 Bfloat8 和 Float8,这些格式设计用于提高计算速度,减少内存带宽需求,同时仍保留足够的精度。
- 优点: 存储空间和带宽占用非常低,可以加速训练和推理过程。
- 缺点: 数值表示范围非常小,适用于某些特定的应用场景,尤其是在对精度要求不高的情况下。
-
FP16 (16-bit Floating Point, Half Precision):
- 16位浮点数,通常由1位符号位、5位指数位和10位尾数位组成。FP16被广泛用于加速训练和推理,尤其是在深度学习中。
- 优点: 相比FP32,存储需求减少一半,计算速度通常加快,适合现代GPU(如NVIDIA的Tensor Cores)进行高效运算。
- 缺点: 精度相对较低,特别是在训练过程中,可能会遇到梯度下溢或溢出的问题。
-
BF16 (Brain Floating Point 16):
- 这种格式与FP16相似,也是16位浮点数,但是它使用8位指数和7位尾数。BF16的设计主要针对机器学习应用,特别是在训练过程中,它能够更好地保持较大的数值范围。
- 优点: 比FP16具有更大的表示范围,能够更好地处理一些数值较大的情况,适合深度学习训练任务。
- 缺点: 相比FP16,精度稍低,特别是在尾数部分。
-
FP32 (32-bit Floating Point, Single Precision):
- 32位浮点数格式,通常由1位符号位、8位指数位和23位尾数位组成。FP32是标准的浮点数表示格式,广泛用于计算机科学、图像处理、机器学习等领域。
- 优点: 提供较高的精度和更大的表示范围,是许多科学计算的默认格式。
- 缺点: 相比FP16和FP8,存储需求较大,计算速度较慢,尤其是在硬件上不支持浮点数优化时。
总结
- FP8: 最小精度,适合低精度计算任务,存储和带宽要求最低。
- FP16: 较低精度但适合加速计算,尤其在GPU加速计算中表现良好。
- BF16: 与FP16类似,但具有更大的表示范围,适合深度学习训练。
- FP32: 高精度,适合需要高精度计算的任务,但占用更多存储和带宽。
在现代深度学习中,随着硬件的支持,通常会优先使用FP16或BF16来加速训练过程,尤其是在硬件如TPU和NVIDIA Tensor Cores上。
主要注意一下 bf16 相比于常用的 fp16,优势在于可以应对值大的浮点数,劣势就是精度低。还有一个 int8 这个就最好理解了。
接下来要回答的问题有这么几个:
-
主流模型在 pretrain 中是怎么用 quantization 的,尤其是通信场景下
-
quantization 是怎么被应用到 inference acceleration 中的