位置: IT常识 - 正文
推荐整理分享深度学习模型精度fp16和fp32,希望有所帮助,仅作参考,欢迎阅读内容。
文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!
当前的深度学习框架大都采用的都是fp32来进行权重参数的存储,比如Python float的类型为双精度浮点数fp64,PyTorch Tensor的默认类型为单精度浮点数fp32。
使用fp32主要存在问题:
模型尺寸大,训练的时候对显卡的显存要求高;模型训练速度慢;模型推理速度慢。解决方案:使用低精度计算对模型进行优化
1.推理过程中,模型优化目前比较成熟的方案就是fp16量化和int8量化;
2.训练方面的方案是混合精度训练,它的基本思想很简单: 精度减半(fp32→ fp16) ,训练时间减半。与单精度浮点数float32(32bit,4个字节)相比,半精度浮点数float16仅有16bit,2个字节组成。
训练过程中,直接使用半精度进行计算会导致的两个问题:
舍入误差(Rounding Error):对足够小的浮点数执行的任何操作都会将该值四舍五入到零,在反向传播中很多甚至大多数梯度更新值都非常小,在反向传播中舍入误差累积可以把这些数字变成0或者nan,这会导致不准确的梯度更新,影响网络的收敛。溢出错误(Grad Overflow / Underflow):精度下降(小数点后16相比较小数点后8位要精确的多)会导致得到的值大于或者小于fp16的有效动态范围,也就是上溢出或者下溢出。解决方案:使用混合精度训练(Mixed Precision)和损失缩放(Loss Scaling)
基于apex的apm(Apex混合精度加速):
自动:Tensor的dtype类型会自动变化,框架按需自动调整tensor的dtype混合精度:采用不止一种精度的Tensor,torch.FloatTensor和torch.HalfTensor
上一篇:sentstrt.exe - sentstrt进程是什么文件 有什么用
下一篇:linux系统怎么使用vmstat命令显示虚拟内存状态?(linux zmodem)
友情链接: 武汉网站建设