存储在 4 比特中的浮点数

论文

4 比特浮点格式已成为解决大型语言模型日益增长的成本和部署挑战的一种方案。S1E2M1 格式已成为 开放计算项目 (OCP) 标准的一部分。

因此,在 onnx==1.18.0 中引入了一种新的数据类型,以支持有限的算子集,从而实现使用 float4 进行计算。

  • FLOAT4E2M1:1 比特用于符号位,2 比特用于指数,1 比特用于尾数。不支持 NaN 或无穷大。

E2M1

\(S\) 代表符号位。\(10_2\) 表示以 2 为基数的数。

Float4 类型

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\)。浮点数值由以下表达式定义

Float4 类型的值

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 可表示的所有值(忽略符号位)

Float4 类型的值

比特 (忽略符号位)

E2M1

000

0

001

0.5

010

1

011

1.5

100

2

101

3

110

4

111

6

Cast (类型转换)

从 float4 向上转换为 float32、float16、bfloat16 和 float8 是精确的。向下转换为 float4 的行为总结如下

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 中,即对于数组中的连续元素 xy

pack(x,y): y << 4 | x & 0x0F
unpack(z): x = z & 0x0F, y = z >> 4

如果元素总数为奇数,将附加 4 比特的填充。大小为 N 的 4 比特张量的存储大小是 ceil(N/2)