混合精度训练

科技工作者之家 2020-11-17

大多数的深度学习模型使用的是32位单精度浮点数(FP32)来进行训练,而混合精度训练的方法则通过16位浮点数(FP16)进行深度学习模型训练,从而减少了训练深度学习模型所需的内存,同时由于FP16的运算比FP32运算更快,从而也进一步提高了硬件效率。

概述深度学习模型的计算任务分为训练和推理.训练往往是放在云端或者超算集群中,利用GPU强大的浮点计算能力,来完成网络模型参数的学习过程.一般来说训练时,计算资源往往非常充足,基本上受限于显存资源/多节点扩展/通讯库效率的问题。相对于训练过程,推理往往被应用于终端设备,如手机,计算资源/功耗都收到严格的限制,为了解决这样的问题,提出了很多不同的方法来减少模型的大小以及所需的计算资源/存储资源。模型压缩除了剪枝以外,还有一个方法就是降低模型参数的数值精度。随着网络深度的加大,带来的参数数量也呈现指数级增长,如何将最终学习好的网络模型塞入到终端设备有限的空间中是目前很多性能优良的网络真正应用到日常生活中的一大阻碍。

原理介绍通过用半精度运算替代全精度运算来提高效率,这一技术原理听起来很简单明了,但将其付诸实施并不像听起来那么简单。此前也有团队尝试过使用更低精度进行混合计算(如二进制,甚至4-bit),但问题在于这往往不可避免地造成结果的准确性和在主要网络变换上的损失,而百度的MPT模型不仅解决了这一问题,更重要的是MPT无需改变网络超参数,并保持与单精度相同的准确性。

在百度研究院博客中,百度进一步解释了这一模型的原理:

深度学习模型由各种层(Layer)组成,包括完全连接的层,卷积层和反复层。层与层之间的转换可以通过通用矩阵乘法(GEMM)来实现,而对深度学习训练的过程其实很大程度是GEMM计算的过程。

当使用FP16代表神经网络中的数据时,GEMM操作的输入矩阵由16位数组成。我们需要可以使用16位计算执行乘法的硬件,但是需要使用32位计算和存储来执行加法。使用少于32位的加法操作训练大型深度学习模型会非常困难。

为此,百度不仅与NVIDIA共同解决了硬件支持的问题,双方还对训练流程进行了一些修改,模型中的输入,权重,梯度和激活以FP16格式表示。但是如之前介绍,与FP32数字相比,半精度数字的范围有限,只是通过简单地更改存储格式,某些模型无法达到与单精度相同的精度。1

关键技术第一项关键技术被称为“混合精密钥匙”(mixed precision key)。如下图所示,在MT模型中仍然保留FP32格式的主副本,将FP16用于正向和反向传播,优化器中的梯度更新将被添加到主FP32副本当中,该FP32副本被简化为一个FP16副本在训练期间使用,这个过程在每次训练迭代中重复,直至模型收敛且足以恢复损失的精度,从而达到较低内存使用、内存带宽压力更低和更快速执行的优点。

第二种关键技术则是“损耗缩放”(loss-scaling)。该技术可以够恢复一些小数值的梯度。在训练期间,一些权重梯度具有非常小的指数,其FP16格式可能会变为零。为了克服这个问题,我们使用缩放因子在反向传播开始时缩放损失,通过连锁规则,梯度也逐渐扩大,并在FP16中可表示。在将其更新应用于权重之前,梯度确实需要缩小;而为了恢复某些型号的精度损失,必须进行损耗调整。关于这两种技术的更多细节可以在我们的论文中找到。

百度已使用这种方法使用FP16训练其DeepSpeech 2模型。结果表明,对于英文和普通话模型和数据集和使用相同的超参数、模型架构进行混合精度训练实验,可以得到到FP32训练的精度。

同时,使用FP16训练减少了深度学习模型的内存需求,使得百度能够使用一半的处理器来训练这些模型,从而有效地加倍了集群大小。此外,FP16算术的峰值性能(如上所述)通常高于单精度计算。2

本词条内容贡献者为:

李斌 - 副教授 - 西南大学

科技工作者之家

科技工作者之家APP是专注科技人才,知识分享与人才交流的服务平台。