Pytorch自动混合精度(AMP)训练

本文探讨了PyTorch 1.6中如何利用torch.cuda.amp模块进行自动混合精度(AMP)训练,包括FP16与FP32的混合原理,为何使用AMP、FP16的优缺点以及如何通过动态损失放大和GradScaler解决NAN问题。重点介绍了autocast和GradScaler的使用方法,以及如何在实际项目中提升训练效率和精度.

相关问题:解决pytorch半精度amp训练nan问题 - 知乎

pytorch模型训练之fp16、apm、多GPU模型、梯度检查点(gradient checkpointing)显存优化等 - 知乎

pytorch从1.6版本开始,已经内置了torch.cuda.amp,采用自动混合精度训练就不需要加载第三方NVIDIA的apex库了。AMP -- (automatic mixed-precision training)

一 什么是自动混合精度训练(AMP)

默认情况下,大多数深度学习框架都采用32位浮点算法进行训练。2017年,NVIDIA研究了一种用于混合精度训练的方法,该方法在训练网络时将单精度(FP32)与半精度(FP16)结合在一起,并使用相同的超参数实现了与FP32几乎相同的精度。

1.1、FP16理论基础:

在介绍AMP之前,先来理解下FP16与FP32,FP16也即半精度是一种计算机使用的二进制浮点数据类型,使用2字节存储。而FLOAT就是FP32。

在上图可以看到,与单精度float(32bit,4个字节)相比,半进度float16仅有16bit,2个字节组成。天然的存储空间是float的一半。 其中,float16的组成分为了三个部分:

  1. 最高位表示符号位,sign 位表示正负
  2. 有5位表示exponent位, exponent 位表示指数
  3. 有10位表示fraction位, fraction 位表示的是分数

根据  wikipedia 上的介绍,我总结下float16的这几个位置的使用,以及如何从其bitmap计算出表示的数字:

结合上面的讲解,那么就可以顺利的理解下面的这些半精度例子:

 FP16的表示范例

总结:

FP16值动态区间

FP32值动态区间:

float16 最大范围是 [-65504,66504],float16 能表示的精度范围是,超过这个数值的数字会被直接置0;

评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值