【学习笔记】模型量化

模型量化实在是太常见了,但是我完全不知道 quantization 是什么东西,不好!

float

在计算机中,float 是一种用于表示单精度浮点数的标准数据类型。浮点数的存储遵循 IEEE 754 标准,具体来说,32 位浮点数由三部分组成:

  1. 符号位 (Sign bit):占 1 位

    • 0 表示正数
    • 1 表示负数
  2. 指数部分 (Exponent):占 8 位

    • 用于表示浮点数的“大小”或“数量级”。
    • 指数采用偏移二进制(biased representation),具体的偏移量是 127。所以,存储的指数值是实际指数值加上 127。
      这里这个 127 偏移可以理解为,从 0~255,又要表示正负,所以偏移 127
  3. 尾数部分 (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 单精度浮点数。

  1. 转换为二进制形式

    • 5.75 = 101.11 (二进制表示)
  2. 规范化

    • 规范化为 1.0111 × 2²
  3. 分解为三部分

    • 符号位:由于是正数,符号位是 0。
    • 尾数部分:去掉 1,得到 0111 (尾数部分只存储小数部分,且只保留 23 位)。
    • 指数部分:实际指数是 2,偏移量是 127,因此存储的指数值是 2 + 127 = 129,二进制表示为 10000001。
  4. 组合成 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

这些术语都是与数值表示和计算精度相关的浮点数格式,通常用于机器学习、科学计算和硬件加速领域。它们表示不同的浮点数精度,每种精度有不同的表示范围和计算性能。

  1. FP8 (8-bit Floating Point):

    • 这种格式使用8个位来表示浮点数。通常有不同的变种,常见的包括 Bfloat8Float8,这些格式设计用于提高计算速度,减少内存带宽需求,同时仍保留足够的精度。
    • 优点: 存储空间和带宽占用非常低,可以加速训练和推理过程。
    • 缺点: 数值表示范围非常小,适用于某些特定的应用场景,尤其是在对精度要求不高的情况下。
  2. FP16 (16-bit Floating Point, Half Precision):

    • 16位浮点数,通常由1位符号位、5位指数位和10位尾数位组成。FP16被广泛用于加速训练和推理,尤其是在深度学习中。
    • 优点: 相比FP32,存储需求减少一半,计算速度通常加快,适合现代GPU(如NVIDIA的Tensor Cores)进行高效运算。
    • 缺点: 精度相对较低,特别是在训练过程中,可能会遇到梯度下溢或溢出的问题。
  3. BF16 (Brain Floating Point 16):

    • 这种格式与FP16相似,也是16位浮点数,但是它使用8位指数和7位尾数。BF16的设计主要针对机器学习应用,特别是在训练过程中,它能够更好地保持较大的数值范围。
    • 优点: 比FP16具有更大的表示范围,能够更好地处理一些数值较大的情况,适合深度学习训练任务。
    • 缺点: 相比FP16,精度稍低,特别是在尾数部分。
  4. 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 中的

posted @   没学完四大礼包不改名  阅读(55)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示