背景:
pytorch从1.6版本开始,已经内置了torch.cuda.apex,采用自动混合精度训练就不需要加载第三方NVIDIA的apex库了。本文主要从三个方面来介绍AMP:
1.什么是AMP?
2.为什么要使用AMP?
3.如何使用AMP?
正文:
1.什么是AMP?
默认情况下,大多数深度学习框架都采用32位浮点算法进行训练。2017年,NVIDIA研究了一种用于混合精度训练的方法,该方法在训练网络时将单精度(FP32)与半精度(FP16)结合在一起,并使用相同的超参数实现了与FP32相同的精度。在介绍AMP之前,先来理解下FP16与FP32,半精度是一种计算机使用的二进制浮点数据类型,使用2字节存储。
其中,sign位表示正负,exponent位表示指数2^(n-15+1(n=0)),fraction位表示分数(m/1024)。
为什么要使用FP16,理由有三个:1.减少显存占用;2.加快训练和推断的计算,能带来多一倍速的体验;3.张量核心的普及(NVIDIA Tensor Core),低精度计算是未来深度学习的一个重要趋势。
但凡事都有两面性,FP16也带来了些问题:1.溢出错误;2.舍入误差;
1.溢出错误:由于FP16的动态范围比FP32位的狭窄很多,因此,在计算过程中很容易出现上溢出和下溢出,溢出之后就会出现"NaN"的问题。在深度学习中,由于激活函数的梯度往往要比权重梯度小,更易出现下溢出的情况
2.舍入误差
舍入误差指的是当梯度过小时,小于当前区间内的最小间隔时,该次梯度更新可能会失败: