- Published on
FP8的两种格式
基础概念回顾
FP8(8-bit Floating Point)用 8位二进制 表示一个浮点数,分为:
- 符号位(1位):
0表示正数,1表示负数。 - 指数位(E位):决定数值的范围。
- 尾数位(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位)。
- 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(精确还原)。
示例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位)。
- 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