儲存在 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 |
轉換 (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 中,即對於陣列中連續的元素 x
和 y
pack(x,y): y << 4 | x & 0x0F
unpack(z): x = z & 0x0F, y = z >> 4
如果元素總數為奇數,則會附加 4 位元的填充。大小為 N
的 4 位元張量的儲存大小為 ceil(N/2)
。