深度学习框架在使用数据类型时通常非常保守。例如,在PyTorch中,模型参数默认的数据类型通常是64位或32位。
当然,这么做是为了确保在表示信息时能够获得更好的精度。
但对大模型来说,这种内存分配方式并不是最优的,它将导致巨大的内存使用量。
研究表明,对于像矩阵乘法这种运算,当使用低精度数据类型时,速度要比在高精度的数据类型下快很多。
大模型本质上就是大量的矩阵乘法。
此外,使用float16可以减少训练网络所需的内存。这也使我们能够训练更大的模型,使用更大的mini-batch进行训练(从而获得更快的训练速度)等。
混合精度训练是实现这一目标的可靠技术。
顾名思义,混合精度训练的思想是,在可行的地方(如卷积和矩阵乘法中)使用较低精度(例如float16),同时结合较高精度(如float32)进行训练——这也是“混合精度”名称的由来。
以下是混合精度训练执行过程:
1.在前向传播过程中,我们创建权重的FP16副本。
2.接下来,我们在FP32中计算损失值。