float在舍弃一些精度和范围的情况下,可以做些压缩,节省存储空间。本文介绍3种压缩方式:fp16,Int8,fp block
float存储格式
V = (-1) ^ s × M × 2 ^ E
(1)(-1)^s 表示符号位,当 s=0,V 为正数;当 s=1,V 为负数。
(2)M 表示有效数字,大于等于 1,小于 2,但整数部分的 1 不变,因此可以省略。
(3)2^E 表示指数位。
比如: 对于十进制的 5.25 对应的二进制为:101.01,相当于:1.0101*2^2。所以,S 为 0,M 为 1.0101,E 为 2。
对于float 32位存储,M为23Bit,E为8bit,s 1bit,具体存储格式,见下图:

则,我们可以计算出,float的值范围为:[-3.4*10^38,-1.18*10^-38]U[1.18*10^-38,3.4*10^38]
fp16压缩:
半精度浮点数 是一种被计算机使用的二进制浮点数据类型。半精度浮点数使用2个字节(16位)来存储。
在IEEE 754-2008中,它被称作binary16。这种数据类型只适合存储对精度要求不高的数字,不适合用来计算。
IEEE 754 标准指定了一个 binary16 要有如下的格式:
- Sign bit(符号位): 1 bit
- Exponent width(指数位宽): 5 bits
- Significand precision(尾数精度): 11 bits (有10位被显式存储)
按如下顺序排列:

最大值为:0 11110 1111111111=(-1)^0 * 2^15 * (1+1-2^-10)=65504
正数最小值为:0 00001 0000000000=2^-14=6.10 * 10^-5
int8压缩:
根据float的range,将int8 128bit,平均分,存储float的值,精度损失与float的range范围相关。
block fp压缩:
针对多float的存储做压缩,统计系列数的最大指数(Exponent),并统一存储一个指数,统计其他的小数位(Fraction),此压缩适合于系列float值相差较少的。
本文探讨了在节省存储空间的前提下,如何通过fp16、Int8和Block FP三种方式对float进行压缩。详细介绍了每种方法的原理和应用场景,包括fp16的二进制格式,Int8根据float范围进行的压缩,以及Block FP针对一系列相近float值的压缩策略。

2109

被折叠的 条评论
为什么被折叠?



