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\) |
Max |
\(S.11.1_2\) |
Min |
\(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是精确的。 向下转换为float4的行为总结如下
x |
E2M1 |
|---|---|
-6<=x<=6 |
E2M1 转换的 x 值。四舍五入到最接近的偶数。 |
x=+/-0 |
+/-0 |
x>6 |
6 |
x<-6 |
-6 |
+无穷大 |
6 |
-无穷大 |
-6 |
NaN |
6 |
打包和解包¶
Float4 以 2x4bit 的形式存储在一个字节中。
第一个元素存储在 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)。