Published on

FP8的两种格式

基础概念回顾

FP8(8-bit Floating Point)用 8位二进制 表示一个浮点数,分为:

  1. 符号位(1位)0表示正数,1表示负数。
  2. 指数位(E位):决定数值的范围。
  3. 尾数位(M位):决定数值的精度。
  • E4M3:4位指数 + 3位尾数 → 共8位。
  • E5M2:5位指数 + 2位尾数 → 共8位。

示例1:用E4M3表示数字 3.25

步骤1:将 3.25 转换为二进制科学计数法

  • 3.25 的二进制表示:
    • 整数部分:311
    • 小数部分:0.2501(因为 0.25 = 2^-2
    • 合并:3.25 = 11.01(二进制)。
  • 科学计数法:11.01 × 2^0 = 1.101 × 2^1(规范化后)。

步骤2:确定指数和尾数

  • 指数(Exponent)1(科学计数法中的 2^1)。
    • E4M3的指数偏置(bias)= 2^(4-1) - 1 = 7
    • 存储的指数 = 真实指数 + 偏置 = 1 + 7 = 8
    • 8 的二进制:1000(4位)。
  • 尾数(Mantissa):科学计数法的 1.101 中,隐含前导 1.,只存储小数部分 101
    • 尾数截断到3位:101

步骤3:组合FP8(E4M3)

  • 符号位:0(正数)。
  • 指数:1000
  • 尾数:101
  • 最终E4M3二进制0 1000 101 → 十六进制 0x85

验证解码

  • 指数:1000(二进制)= 8 → 真实指数 = 8 - 7 = 1
  • 尾数:101 → 隐含 1.1.101(二进制)= 1.625(十进制)。
  • 值 = 1.625 × 2^1 = 3.25(精确还原)。

示例2:用E5M2表示数字 3.25

步骤1:二进制科学计数法

  • 同上:3.25 = 1.101 × 2^1

步骤2:确定指数和尾数

  • 指数(Exponent)1
    • E5M2的指数偏置 = 2^(5-1) - 1 = 15
    • 存储的指数 = 1 + 15 = 16
    • 16 的二进制:10000(5位)。
  • 尾数(Mantissa)1.101 的小数部分 101 截断到2位 → 10(丢失最后一位)。

步骤3:组合FP8(E5M2)

  • 符号位:0
  • 指数:10000
  • 尾数:10
  • 最终E5M2二进制0 10000 10 → 十六进制 0x82

验证解码

  • 指数:10000 = 16 → 真实指数 = 16 - 15 = 1
  • 尾数:10 → 隐含 1.1.10(二进制)= 1.5(十进制)。
  • 值 = 1.5 × 2^1 = 3.0(原为 3.25精度损失)。

对比总结

格式指数位尾数位表示 3.25 的结果精度损失
E4M34位3位0 1000 101 → 精确 3.25
E5M25位2位0 10000 10 → 近似 3.0

关键结论

  1. E4M3:尾数多1位 → 精度更高,适合需要精确计算的场景(如小数值运算)。
  2. E5M2:指数多1位 → 范围更大,适合可能有极端值的场景(如大模型推理)。

再举一个例子:数字 0.0625

E4M3表示

  1. 科学计数法:0.0625 = 1.0 × 2^-4
  2. 存储指数 = -4 + 7 = 30011
  3. 尾数 = 000(因为 1.0 的小数部分为全零)。
  4. 结果:0 0011 0000x18
  5. 解码:1.0 × 2^(3-7) = 1.0 × 2^-4 = 0.0625(精确)。

E5M2表示

  1. 存储指数 = -4 + 15 = 1101011
  2. 尾数 = 00
  3. 结果:0 01011 000x58
  4. 解码:1.0 × 2^(11-15) = 0.0625(精确)。

最终理解要点

  1. 指数偏置(Bias):用于将真实指数(可能为负)转换为存储的正整数。
    • E4M3偏置 = 7,E5M2偏置 = 15
  2. 尾数截断:尾数位数越少,精度损失风险越高(如E5M2将 3.25 变为 3.0)。
  3. 硬件支持:新一代GPU(如H100)可直接加速FP8计算,但需注意格式选择!

THE END