在投弹训练时,我们为什么更要强调半精度训练投?

否则的话谁知道你投到什地方去叻说不定你往后投了,把自己的连长和指导员给炸翻了

你对这个回答的评价是

下载百度知道APP,抢鲜体验

使用百度知道APP立即抢鲜体验。你的手机镜头里或许有别人想知道的答案

}

nvidia的Pascal和Volta系列显卡除了支持標准的单半精度训练计算外也支持了低半精度训练的计算,比如最新的Tesla V100硬件支持了FP16的计算加速P4和P40支持INT8的计算加速,而且低半精度训练計算的峰值要远高于单精浮点的计算峰值

为了加速训练过程以及减少显存开销,baidu Research和nvidia在这篇论文中合作提出了一种FP16和FP32混合半精度训练训练嘚方法并且在CNN分类和检测、语音识别和语言模型任务上进行了验证,实验过程中使用的GPU就是Tesla V100

训练过程中每层的权重都存成FP32格式(Mater-Weights),烸次训练时都会将FP32的权重降半精度训练至FP16( a master copy)前向输出和后向梯度都使用FP16进行计算,更新时将FP16的梯度累加到FP32的Mater-Weight上

由于FP16所能表示的subnormal最小正数是2?242?24 ≈ 5.96×10?85.96×10?8(),也就是说在区间(?2?24,2?24?2?24,2?24)的数(或者说指数位小于-24的数)使用FP16表示时都会變成0在一个普通话识别的模型训练中,有将近5%的权重梯度的指数位小于-24如果更新时也用FP16计算,那么这些数在乘以学习率后都将变成0從而对最终模型效果产生负面影响,使用混合半精度训练训练的方式可以避免这种问题

混合半精度训练训练可以解决权重更新量很小的問题,但无法解决梯度本身很小的问题在一些网络中(比如SSD),梯度大部分都在FP16的表示范围之外因此需要将梯度平移到FP16的表示范围内 。

平移实际上就是对梯度值乘以一个系数(等于2n2nnn为平移的位数),但另一种简单高效的方法是直接在前向时就将loss乘以scale这样在后向传导時所有的梯度都会被乘以相同的scale。权重更新时需要将移位后的梯度除以scale后再更新到权重上。

论文中提到他们在实验过程中使用的scale是8~32K最終取得了与FP32一致的收敛结果。对于scale的选择论文没有统一的方法,只是提到scale并没有下界只要选择的scale不会在后向计算时导致溢出就行。

}

传统上深度神经网络训练采用嘚是IEEE单半精度训练格式,但借助混合半精度训练可采用半半精度训练进行训练,同时保持单半精度训练的网络半精度训练这种同时采鼡单半精度训练和半半精度训练表示的技术被称为混合半精度训练技术。

通过使用Tensor核心可加速数学密集型运算,如线性和卷积层

与单半精度训练相比,通过访问一半的字节来加速内存受限的运算

降低训练模型的内存要求,支持更大规模的模型或更大规模的批量训练

啟用混合半精度训练包括两个步骤:移植模型,以适时使用半半精度训练数据类型;以及使用损耗定标以保留小梯度值。

仅通过添加几荇代码TensorFlow、PyTorch和MXNet中的自动混合精确功能就能助力深度学习研究人员和工程师基于NVIDIA Volta和Turing GPU实现高达3倍的AI训练加速。

将自动混合半精度训练用于主流罙度学习框架

NVIDIA NGC容器注册表中TensorFlow容器可提供自动混合半精度训练功能要在容器内启用此功能,只需设置一个环境变量:

或者您也可以在TensorFlow Python脚夲中设置环境变量:

自动混合半精度训练使用单一环境变量,在TensorFlow内部应用这两个步骤并在必要时进行更细粒度的控制。

GitHub的Apex存储库中提供叻自动混合半精度训练功能可将以下两行代码添加至当前训练脚本中以启用该功能:

我们正在构建适用于MXNet的自动混合半精度训练功能。您可通过GitHub了解我们的工作进展可将以下代码行添加至当前训练脚本中以启用该功能:

声明:本文由入驻电子说专栏的作者撰写或者网上轉载,观点仅代表作者本人不代表电子发烧友网立场。如有侵权或者其他问题请联系举报。

}

我要回帖

更多关于 半精度训练 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信