关于深度学习中的数据结构INT\FLOAT\FP(为使用FP数据类型调用TensorCore的知识储备)

  • 首先我们需要知道何为bits和bytes?

    bits:名为位数
    bytes:为字节
    简单的数就是MB和G的关系!那么8bits=1bytes,下面是各个单位的相互转化!
    关于深度学习中的数据结构INT\FLOAT\FP(为使用FP数据类型调用TensorCore的知识储备)
    *引用自https://blog.****.net/m0_43432638/article/details/89973862

  • INT - 也就是整数,比如INT8就是8bit整数,取值范围是-128~127也就是256(2^8)个数,
    (整数在内存中没什么符号位,区分正负只是为了软件需要)。
    那么为什么后来有INT16 INT32之类的呢?很简单,数值范围不够用了。
    在计算机上,8、16、32、64、128纯粹是因为首先它是二进制,其次数据容易对齐。在编程语言中,不同数据类型并没有强制的使用环境,比如你定义变量是一个8bit数还是32bit数只要够用都可以,只不过数据长度太长占内存。

  • FLOAT - 也就是传统的浮点数,数位越高浮点数的精度越高。
    FLOAT32即32bit的浮点数,1bit留给符号位,剩下的就是指数和尾数占位
    FLOAT32\64在内存中占分别32和64个bits,也就是4bytes或8bytes
    FLOAT同样可以表示非常大的整数,比如12000000也可以表示为1.2*10^7

  • TF FLOAT32和FP - 随着深度学习和python的出现而出现在公众视野中的数据类型
    它们的结构与FLOAT相似,只不过精度要高的多得多,同时也是在大数据深度学习中显卡CUDA(TF FLOAT32)\ TensorCore(FP)使用的数据结构
    除却前面一位符号位之外,区别仅在于指数位和数据位的不同,TF32就是具备与FP32相同的指数位(数值范围)以及与FP16相同的数据位(精度)。
    关于深度学习中的数据结构INT\FLOAT\FP(为使用FP数据类型调用TensorCore的知识储备)
    但是问题来了,数据位就这么点,前面那个小数位太长就存不下,这就会导致精度不够,而TF32就是典型的为AI优化的数据类型,只不过19bit数据对齐不方便,所以就只能用32bit的寄存器了。
    以游戏为例,N卡率先支持FP32,但是市面上已经有FP24的游戏了,NVIDIA无奈只能用FP32去跑FP24承受性能损失,后来为了挽回游戏性能的颓势搞了个强制FP16渲染结果落了个画质缩水的名声,主要就是24bit的数据放在32bit寄存器里浪费空间,16bit*2正好塞满。
    *引自英伟达tegra吧@九方航空

  • FLOAT32\64对深度学习的性能影响?
    float64占用的内存是float32的两倍,是float16的4倍;比如对于CIFAR10数据集,如果采用float64来表示,需要60000323238/1024**3=1.4G,光把数据集调入内存就需要1.4G;如果采用float32,只需要0.7G,如果采用float16,只需要0.35G左右;占用内存的多少,会对系统运行效率有严重影响;(因此数据集文件都是采用uint8来存在数据,保持文件最小)
    *引自https://blog.****.net/m0_43432638/article/details/89973862

  • 更多的对浮点数位和深度学习关系的知乎讨论
    https://www.zhihu.com/question/46344503?from=profile_question_card