FP8的两种格式

2025-07-21 · 约 6 分钟 · 标签: FP8 , E4M3 , E5M2

基础概念回顾

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 的二进制表示:
    • 整数部分:3 → 11
    • 小数部分:0.25 → 01(因为 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 = 3 → 0011。
  3. 尾数 = 000(因为 1.0 的小数部分为全零)。
  4. 结果:0 0011 000 → 0x18。
  5. 解码:1.0 × 2^(3-7) = 1.0 × 2^-4 = 0.0625(精确)。

E5M2表示

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

最终理解要点

  1. 指数偏置(Bias):用于将真实指数(可能为负)转换为存储的正整数。
    • E4M3偏置 = 7,E5M2偏置 = 15。
  2. 尾数截断:尾数位数越少,精度损失风险越高(如E5M2将 3.25 变为 3.0)。
  3. 硬件支持:新一代GPU(如H100)可直接加速FP8计算,但需注意格式选择!
评论
评论功能尚未配置:在 GitHub 仓库开启 Discussions,并按项目 README 里的步骤填好 src/consts.ts 即可启用(基于 Giscus,评论需要 GitHub 账号)。