- Published on
FP8的两种格式
基础概念回顾
FP8(8-bit Floating Point)用 8位二进制 表示一个浮点数,分为:
- 符号位(1位):
0
表示正数,1
表示负数。 - 指数位(E位):决定数值的范围。
- 尾数位(M位):决定数值的精度。
- E4M3:4位指数 + 3位尾数 → 共8位。
- E5M2:5位指数 + 2位尾数 → 共8位。
3.25
示例1:用E4M3表示数字 3.25
转换为二进制科学计数法
步骤1:将 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位)。
- E4M3的指数偏置(bias)=
- 尾数(Mantissa):科学计数法的
1.101
中,隐含前导1.
,只存储小数部分101
。- 尾数截断到3位:
101
。
- 尾数截断到3位:
步骤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
(精确还原)。
3.25
示例2:用E5M2表示数字 步骤1:二进制科学计数法
- 同上:
3.25
=1.101 × 2^1
。
步骤2:确定指数和尾数
- 指数(Exponent):
1
。- E5M2的指数偏置 =
2^(5-1) - 1 = 15
。 - 存储的指数 =
1 + 15 = 16
。 16
的二进制:10000
(5位)。
- E5M2的指数偏置 =
- 尾数(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 的结果 | 精度损失 |
---|---|---|---|---|
E4M3 | 4位 | 3位 | 0 1000 101 → 精确 3.25 | 无 |
E5M2 | 5位 | 2位 | 0 10000 10 → 近似 3.0 | 有 |
关键结论
- E4M3:尾数多1位 → 精度更高,适合需要精确计算的场景(如小数值运算)。
- E5M2:指数多1位 → 范围更大,适合可能有极端值的场景(如大模型推理)。
0.0625
再举一个例子:数字 E4M3表示
- 科学计数法:
0.0625
=1.0 × 2^-4
。 - 存储指数 =
-4 + 7 = 3
→0011
。 - 尾数 =
000
(因为1.0
的小数部分为全零)。 - 结果:
0 0011 000
→0x18
。 - 解码:
1.0 × 2^(3-7) = 1.0 × 2^-4 = 0.0625
(精确)。
E5M2表示
- 存储指数 =
-4 + 15 = 11
→01011
。 - 尾数 =
00
。 - 结果:
0 01011 00
→0x58
。 - 解码:
1.0 × 2^(11-15) = 0.0625
(精确)。
最终理解要点
- 指数偏置(Bias):用于将真实指数(可能为负)转换为存储的正整数。
- E4M3偏置 =
7
,E5M2偏置 =15
。
- E4M3偏置 =
- 尾数截断:尾数位数越少,精度损失风险越高(如E5M2将
3.25
变为3.0
)。 - 硬件支持:新一代GPU(如H100)可直接加速FP8计算,但需注意格式选择!
THE END