浮点数存储在 4 位中¶
论文¶
4 位浮点数格式已成为解决大型语言模型不断上升的成本和部署挑战的解决方案。S1E2M1 格式已成为 开放计算项目 (OCP) 标准的一部分。
因此,在 onnx==1.18.0
中引入了一种新的数据类型,以支持一组有限的运算符,以使用 float4 进行计算。
FLOAT4E2M1
: 1 位用于符号,2 位用于指数,1 位用于尾数。没有 NaN 或无穷大。
E2M1¶
\(S\) 代表符号。 \(10_2\) 描述以 2 为底的数字。
E2M1 |
|
---|---|
指数偏差 |
1 |
无穷大 |
|
NaN |
|
零 |
\(S.00.0_2\) |
最大 |
\(S.11.1_2\) |
最小 |
\(S.00.1_2 = 2^{-1}\) |
让我们将位表示法表示为 \(S.b_2 b_1 b_0\)。浮点值由以下表达式定义
E2M1 |
|
---|---|
指数 \(\neq\) 0 |
\((-1)^S 2^{\sum_{i=1}^2 b_i 2^{i-1} - 1} \left( 1 + b_0 2^{-1} \right)\) |
指数 \(=\) 0 |
\((-1)^S b_0 2^{-1}\) |
下表列出了 float4 E2M1 的所有可表示值,忽略符号位
位(忽略符号位) |
E2M1 |
---|---|
000 |
0 |
001 |
0.5 |
010 |
1 |
011 |
1.5 |
100 |
2 |
101 |
3 |
110 |
4 |
111 |
6 |
转换¶
从 float4 向上转换到 float32、float16、bfloat16 和 float8 是精确的。向下转换到 float 4 的行为总结如下
x |
E2M1 |
---|---|
-6<=x<=6 |
x 的 E2M1 转换值。四舍五入。 |
x=+/-0 |
+/-0 |
x>6 |
6 |
x<-6 |
-6 |
+Inf |
6 |
-Inf |
-6 |
NaN |
6 |
打包和解包¶
Float4 存储为单个字节中的 2x4 位。第一个元素存储在 4 个 LSB 中,第二个元素存储在 4 个 MSB 中,即对于数组中连续元素的元素 x
和 y
pack(x,y): y << 4 | x & 0x0F
unpack(z): x = z & 0x0F, y = z >> 4
如果元素总数为奇数,则将追加 4 位的填充。大小为 N
的 4 位张量的存储大小为 ceil(N/2)
。