参考教程:
https://pytorch.org/tutorials/recipes/recipes/amp_recipe.html?highlight=amp
https://pytorch.org/docs/stable/amp.html
https://arxiv.org/pdf/1710.03740.pdf
https://zhuanlan.zhihu.com/p/79887894
文章目录
原理
float 32
参考资料:wikipedia/float32

float32的格式如上图。一共三十二位。
- 蓝色区域占一位:表示sign。
- 绿色区域占八位:表示exponent。
- 红色区域占23位:表示fraction。
它的计算规则如下:

假如你的 Exponent位全为0,那么fraction位有两种情况。
- fraction全为0,则最终结果为0。
- fraction不为0,则表示一个subnormal numbers,也就是一个非规格化的浮点数。
( − 1 ) s i g n × 2 − 126 × ( f r a c t i o n 2 23 ) (-1)^{sign} \times2^{-126} \times(\frac{fraction}{2^{23}}) (−1)sign×2−126×(223fraction)
假如你的Exponent位全为1,那么fraction位有两种情况。
- fraction全为0, 则最终结果为inf。
- fraction不为0,则最终结果为NaN。
假如你的Exponent是其他的情况,那么数据的计算公式为:
( − 1 ) s i g n × 2 ( e x p o n e n t − 127 ) × ( 1 + f r a c t i o n 2 23 ) (-1)^{sign}\times2^{(exponent-127)}\times(1+\frac{fraction}{2^{23}}) (−1)sign×2(exponent−127)×(1+223fraction)
因此float32能取到的最小正数是 2 − 126 2^{-126} 2−126,最大正数是 2 2 8 − 2 − 127 × ( 1 + 2 23 − 1 2 23 ) 2^{2^8-2-127}\times(1+\frac{2^{23}-1}{2^{23}}) 228−2−127×(1+2

本文介绍了float32和float16浮点数格式及其计算规则,讨论了半精度(float16)在解决计算和内存限制方面的优势,以及可能遇到的溢出和舍入误差问题。在PyTorch中,使用torch.autocast和torch.cuda.amp.GradScaler进行混合精度训练,以提高效率并保持模型准确性。文章还提到了如何处理梯度惩罚以适应混合精度环境。
最低0.47元/天 解锁文章
736

被折叠的 条评论
为什么被折叠?



