1、定义
算力的计量单位FLOPS(Floating-point operations per second),FLOPS表示每秒浮点的运算次数。具体使用时,FLOPS前面还会有一个字母常量,例如TFLOPS、PFLOPS。这个字母T、P代表次数,T代表每秒一万亿次,P代表每秒一千万亿次。
除了运算次数,衡量算力水平时还要看算力精度。例如,1000FLOPS的AI计算中心所提供的的算力,与1000FLOPS超级计算机提供的算力,虽然数值相同,但由于精度不同,实际算力水平也是天壤之别。
根据参与运算数据精度的不同,可把算力分为
- 双精度浮点数(64位,FP64)
- 单精度浮点数(32位,FP32),占用4个字节,共32bit位,其中1位为符号位,8位指数位,23位小数位
- 半精度浮点数(16位,FP16),占用2个字节,共16位,其中1位为符号位,5位指数位,10位有效数字位(小数),与FP32相比,FP16的访存消耗仅为1/2,也因此FP16是更适合在移动终端侧进行AI计算的数据格式。
- 用5bit 表示指数,10bit 表示小数,占用2字节;
- 8位整型数(INT8、INT4),占用1个字节,INT8是一种定点计算方式,代表整数运算,一般是由浮点运算量化而来。在二进制中一个“0”或者“1”为一bit,INT8则意味着用8bit来表示一个数字。因此,虽然INT8比FP16精度低,但是数据量小、能耗低,计算速度相对更快,更符合端侧运算的特点;
- 混合精度:简单的讲就是使用fp16进行乘法和存储,只使用fp32进行加法操作,避免累加误差;
在数据表示范围上,FP32和FP16 表示的整数范围是一样的,小数部分表示不一样,存在舍入误差;FP32和FP16 表示的数据范围不一样,在大数据计算中,FP16存在溢出风险。
以下为int8范围为何是-128 至 127的解释:
int8占1个字节,1字节(byte)占8位(bit), 其中最高位代表符号位 1-负号;0-正号
那么最大数值的二进制为:
0 1 1 1 1 1 1 1
换算成10进制为 从低位到高位开始计算
0 1 1 1 1 1 1 1
02^7 + 12^6 + 12^5 + 12^4 + 12^3 + 12^2 + 12^1 + 12^0
0 + 64 + 32 + 16 + 8 + 4 + 2 + 1
= 127
最小数值的二进制应与最大数值相反, 10000000
换算成10进制为 从低位到高位开始计算
1 0 0 0 0 0 0 0
12^7 + 02^6 + 02^5 + 02^4 + 02^3 + 02^2 + 02^1 + 02^0
128 + 0 + 0 + 0 + 0 + 0 + 0 + 0
= 128其实还有一种很好理解的解释
1.int8占1个字节(byte) 也就是8个二进制位(bit)
2.每个二进制位 可以存储0 和 1 两个数 ,8个二进制位就有2^8 = 256种组合(可以存储256个数)
3.int8为有符号,所以正数和负数将平分256个数。256 / 2 = 128
4.负数为128个数 最小值为-128
5.正数为128个数,0占一个数 最大值为+127如果是uint8(8bit无符号-没有负数) 2^8 = 256
0 占一个数 ,所以最大是255
2、比较
低精度技术 (high speed reduced precision)。在training阶段,梯度的更新往往是很微小的,需要相对较高的精度,一般要用到FP32以上。在inference的时候,精度要求没有那么高,一般F16(半精度)就可以,甚至可以用INT8(8位整型),精度影响不会很大。同时低精度的模型占用空间更小了,有利于部署在嵌入式模型里面。
利用fp16 代替 fp32
优点:
1)TensorRT的FP16与FP32相比能有接近一倍的速度提升,前提是GPU支持FP16(如最新的2070,2080,2080ti等)
2)减少显存。
缺点:
1) 会造成溢出
3、测试
参考文章:TensorRT模型转换及部署,FP32/FP16/INT8精度区分_BourneA的博客-CSDN博客_tensorrt半精度
版权归原作者 ytusdc 所有, 如有侵权,请联系我们删除。