首页 » 信息技术 »

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

2019年1月12日 / 2,500次阅读

神经网络的计算,或者说深度学习的计算,全都是浮点数。浮点数的类型分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对神经网络计算的影响的学习总结。

本文链接:https://www.maixj.net/ict/float16-32-64-19912

相关文章

留言区

《float16/32/64对神经网络计算的影响》有5条留言

  • mo

    目前(2019年)的硬件环境下,fp32应该是最快的,其次是fp64,最慢的应该是fp16 avx支持fp32和fp64的打包运算,同样fpu宽度的情况下,fp32的吞吐应该是fp64的2倍。fp16为什么慢呢,因为fp16不被avx支持,计算的时候要先转fp32,算完还要转回来。 []

    • 麦新杰

      请教一下AVX是指什么? []

  • 麦新杰

    在float16的场景下,使用relu更容易出现runtime warning,这是可以考虑换成sigmoid。 []

  • 麦新杰

    我在intel i5的电脑上测试:float16(FP16)的运行速度比float32的速度要慢10倍以上!!!

    >>> import test
    这是float16(FP16)的测试结果:
    >>> test.test9()
    Dataset is loaded...train 60000 and test 10000
    Epoch 1:7875/10000,Cost(on train):0.9327273864746094,round time(s):141.74
    /home/xinlin/teapot/neuron.py:16: RuntimeWarning: overflow encountered in exp
      return 1.0/(1.0+np.exp(-z))
    Epoch 2:8785/10000,Cost(on train):0.5251145568847656,round time(s):140.79
    Epoch 3:8983/10000,Cost(on train):0.41291842161814374,round time(s):141.92
    
     []

    • 麦新杰

      比较奇怪的是,同样的测试环境,采用float64的速度反而比float32要慢:

      这是float64的结果:
      >>> import test
      >>> test.test9()
      Dataset is loaded...train 60000 and test 10000
      Epoch 1:8064/10000,Cost(on train):0.8878804677101441,round time(s):18.92
      Epoch 2:8815/10000,Cost(on train):0.498614283441541,round time(s):19.36
      Epoch 3:9033/10000,Cost(on train):0.3867261083274222,round time(s):19.85
      Epoch 4:9115/10000,Cost(on train):0.33850479519113874,round time(s):18.51
      
      这是float32的结果:
      >>> import test
      >>> test.test9()
      Dataset is loaded...train 60000 and test 10000
      Epoch 1:8169/10000,Cost(on train):0.8541207203867535,round time(s):13.22
      Epoch 2:8854/10000,Cost(on train):0.4810312115223147,round time(s):13.66
      Epoch 3:9046/10000,Cost(on train):0.37793103677684753,round time(s):13.59
      Epoch 4:9130/10000,Cost(on train):0.3327436235669108,round time(s):13.56
      Epoch 5:9172/10000,Cost(on train):0.3047675042224524,round time(s):13.46
      
      看来加速神经网络,还可以在float32和float64之间测试一下!!! []


前一篇:
后一篇:

栏目精选

云上小悟,麦新杰的独立博客

Ctrl+D 收藏本页

栏目


©Copyright 麦新杰 Since 2014 云上小悟独立博客版权所有 备案号:苏ICP备14045477号-1。云上小悟网站部分内容来源于网络,转载目的是为了整合信息,收藏学习,服务大家,有些转载内容也难以判断是否有侵权问题,如果侵犯了您的权益,请及时联系站长,我会立即删除。

网站二维码
go to top