深度学习模型部署(番外)-浮点数标准与不同精度

本文详细介绍了IEEE754标准在计算机中的应用,涉及浮点数的存储结构、不同精度等级、INT8至BF16的浮点数类型,以及定点数与浮点数在神经网络量化中的作用。理解浮点数特性和量化策略对于模型部署至关重要。
摘要由CSDN通过智能技术生成

浮点数标准简介

IEEE754标准是目前计算机中最常用的浮点数算数标准,该标准规定了浮点数的存储格式,与反常值,一些特殊数值(无穷Inf和非数值Nan),以及这些数值的浮点数运算符,也规定了四种精度标准:单精度(32bit),双精度(64bit),扩展单精度(43bit),扩展双精度(80bit)。单精度和双精度最常用。

存储方式

在这里插入图片描述
浮点数的存储方式类似于科学计数法,先将一个数化为二进制的科学计数法,例如4.25化为二进制科学计数法: 1.0001 × 2 2 1.0001\times2^2 1.0001×22,其中小数点后面的部分称为尾数,后面2的阶数称为阶数.
浮点数的存储分为三部分:

  • 符号位:用于表示正负,0为正,1为负
  • 阶码部分:也就是阶数转化为2进制再加上偏移量(加偏移量是为了表示负的部分,单精度阶码的偏移量是127,当阶码是00000000时,表示阶数是-127)
  • 尾数部分:小数点后面的部分,原封不动拿过来,填不满尾数bit的在后面补0。

阶码是在前面补0,尾数是在后面补0,原因也很简单,阶码是用来求阶数的,需要转换到10禁止,后面补0就改变了原本的数了。而尾数是拿出来就用,不需要转换进制,也不关心后面多少0。

疑问

网上绝大部分的教程都是到此就结束了,或者再多讲一下无规格数但是问题是,深度学习中的INT8,FP16,FP32,FP64,这种是哪里定义的?带着这个问题,我查看了IEEE754这个标准的变化全部过程。

  • 第一版IEEE754是在1985年发布的,名称为ANSI/IEEE Std 754-1985,里面的规定就和我上文提到的一样,规定了四种精度,巴拉巴拉。
  • 后面在1987年还发布了IEEE 854-1987,规定了与基数无关的浮点数,包括基数为2的标准和基数为10的标准,目前最新的IEEE754中也规定了基数为10的浮点数。
  • 至于16位浮点数FP16,最早来源于nvidia在2002年提出的half类型,是用于存储和计算图像数据的,用于渲染工程。后面在IEEE2008版本中定义了binary16浮点数类型,即:以2为基数的16位存储的浮点数类型。
    在这里插入图片描述

binary16使用5位存储阶数,10位存储尾数。

目前深度学习中还有另外一种16位半精度浮点数BF16,起源是由Google Brain提出的bfloat16(我猜测是借鉴了binary16的思想哈哈哈哈),下图是huggingface的文档中的一张图片,生动描述了现在深度学习中的常见浮点数类型的存储方式。
在这里插入图片描述
与fp16相比,bf16由于存储尾数的bit减少了,所以精度损失很严重,但是bf16的存储范围非常大,fp16的最大存储数字是65535,而bf16的最大存储数字是3.39e+38。
fp16和fp32的存在时间已经很长了,大部分的架构都支持他们,而bf16的出现时间较晚,GPU中需要安培架构以后的架构才支持bf16,Google的TPU也支持bf16。

定点数

浮点数的小数点位置是移动的,阶数就是来存储小数点移动信息的。还有一种数,它的小数点位置不动,这种数称为定点数(定点数不一定非得是整数,只是小数点位置不动,不过目前计算机上定点数一般只用来存储纯小数和整数,即小数点再最后和小数点在最前),现在的电脑都支持定点数运算,而且定点数运算的指令相较于浮点数运算指令要快很多,但是现实中的参数往往都是浮点数,这就要进行量化,经过量化将浮点数转化为定点数运算完后再反量化为浮点数,这种量化方法在神经网络部署加速中很实用。
下图是zen3架构中定点数加法和浮点数加法的指令速度对比,add是定点数加法,addss是浮点数加法。
在这里插入图片描述

总结

弄清楚浮点数的类型以及各自的特点对于模型部署来说非常有必要,模型量化,混合精度这些都需要对浮点数有一定的了解。
后面我们学习模型量化时这些知识都会派上用场。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值