float16/32/64对神经网络计算的影响

https://www.maixj.net/ict/float16-32-64-19912

float16/32/64对神经网络计算的影响

神经网络的计算,或者说深度学习的计算,全都是浮点数。浮点数的类型分16/32/64(128位的不再考虑范围内,numpy和python最大只到float64),选择哪一种浮点数类型,对神经网络的计算有不同的影响。以下是近期的学习总结:

(1)目前业界深度学习的标准是BF16,一种16位的浮点数,据说Google的TPU已经支持,未来Intel的芯片也会支持;

(2)我们在一般计算上的,通过numpy得到的16位浮点数,是FP16,不是BF16FP16是IEEE754-2008的标准;这两个标准,在能够表示的数值的范围上有区别;

(3)对于内存的影响:float64占用的内存是float32的两倍,是float16的4倍;比如对于CIFAR10数据集,如果采用float64来表示,需要60000*32*32*3*8/1024**3=1.4G,光把数据集调入内存就需要1.4G;如果采用float32,只需要0.7G,如果采用float16,只需要0.35G左右;占用内存的多少,会对系统运行效率有严重影响;(因此数据集文件都是采用uint8来存在数据,保持文件最小)

(4)采用numpy的float16,即FP16,来计算深度学习,容易出现runtime warning;因为精度不够,更容易在计算过程中,产生极限值;(也许有办法解决这个问题,比如进一步缩小初始化的weights和bias)

(5)如果采用numba来进行计算加速,要求所有计算的数据类型要保持一致;如果不加速,numpy在计算过程中,会自动upcast到数据精度更大的类型上去,这个问题要通过仔细写代码来规避;

(6)如果做gradient check,即通过比较网络计算的梯度和数学定义的方式计算出来的梯度来判断代码是否正确,float32的精度可能都不够,需要比较到小数点后6-8位;

(7)在没有numba加速的情况下,如果是64位的CPU,float64的计算速度最快;因为对于float32和float16,CPU都需要多条指令来进行数据的转移,没有严格测试过,有可能float16是最慢的;

(8)基于以上事实,我自己的teapot库,决定采用float32!并保持在整个计算过程中,全部参与计算的数据,都是float32,不会upcast的情况;并可通过一个全局可变常量,来控制浮点数类型的选择,默认就是float32;

(9)也可以考虑数据集数据在内存中使用float16,而神经网络的weights和bias使用float32,这样在计算过程中,float16和float32并存,即减少了内存占用,也保持了一定的精度;不过这样做,就无法采用numba加速;

以上就是我对float16/32/64对神经网络计算的影响的学习总结。

原创文章 2935 获赞 1163 访问量 619万+

猜你喜欢

转载自blog.csdn.net/jacke121/article/details/106063375
今日推荐