4位浮点数存储

论文

4位浮点数格式已成为解决大型语言模型日益增长的成本和部署挑战的一种方案。S1E2M1 格式已成为 Open Compute Project (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 是精确的。向下转换为 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 位,第二个元素存储在高 4 位,即对于数组中相邻的元素 xy

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

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