当前位置:首页要闻 → 正文

一行代码让练习速度提高2倍飞桨主动混合精度技能详解

时间:2020-03-09 18:59:44  阅读:7977+ 编辑:责任编辑NO。邓安翔0215
导读:机器之心发布机器之心编辑部飞桨主动混合精度技能,让你的练习速度飞起来。跟着生活节奏的加快,「等候」现已越来越成为人们期望

机器之心发布

机器之心编辑部

飞桨主动混合精度技能,让你的练习速度飞起来。

跟着生活节奏的加快,「等候」现已越来越成为人们期望远离的工作。可是在深度学习范畴,模型的参数、数据集的规划等等动辄便是以亿为单位,乃至更大,因而当模型练习成功之时,放一首张靓颖的「总算比及你」作为背景音乐实在是太应景了。

那假如现在向你引荐一款神器,能轻松完成练习速度翻倍,访存功率翻倍,你心动吗?心动不如举动(这可不是电视直销,别着急换频道),来和我一同看看这款神器——基于飞桨中心结构的主动混合精度(Automatic Mixed Precision) 技能,简称飞桨 AMP 技能。

飞桨 AMP 技能只是通过一行代码即可协助用户简练快速的将单精度练习的模型修改为主动混合精度练习。一起通过是非名单和动态 Loss Scaling 来保证练习的稳定性,防止呈现 INF 或许 NAN 问题。飞桨 AMP 可以充沛的发挥新一代 NVIDIA GPU 中 Tensor Core 的核算功用优势,ResNet50、Transformer 等模型的练习速度与单精度练习比较可以提高到 1.5~2.9 倍。

那么它是怎样完成的呢?咱们先从什么是主动混合精度技能讲起。

什么是主动混合精度技能

望文生义,主动混合精度是一种主动将半精度和单精度混合运用,然后加快模型练习的技能。其间单精度(Float Precision32,FP32)好了解,是核算机常用的一种数据类型。那么半精度是什么呢?如图 1 所示,半精度(Float Precision16,FP16)是一种相对较新的浮点类型,在核算机中运用 2 字节(16 位)存储,在 IEEE 754-2008 中,它被称作 binary16。与核算中常用的单精度和双精度类型比较,Float16 更适于在精度要求不高的场景中运用。

图 1 半精度和单精度数据示意图

清楚明了,在深度学习范畴,假如运用 Float16 替代 Float32 来存储数据,那么开发者就可以练习更大更杂乱的模型,运用更大的 batch size。因而关于那些恨不能挖掘出 GPU 里每一个晶体管悉数潜力的科学家们怎样能放过它呢?一起因为 NVIDIA 推出了具有 Tensor Core 技能的 Volta 及 Turing 架构 GPU,使半精度核算趋向老练。在相同的 GPU 硬件上,Tensor Core 的半精度核算吞吐量是单精度的 8 倍。

但清楚明了,运用 Float16 肯定会一起带来核算精度上的丢失。但对深度学习练习而言,并不是一切核算都要求很高的精度,一些部分的精度丢失对终究练习作用影响很弱小,仅需求某些特别进程保存 Float32 的核算精度即可。因而混合精度核算的需求应运而生。咱们咱们可以将练习进程中一些对精度丢失不灵敏且能运用 Tensor Core 进行加快的运算运用半精度处理,最大极限的提高访存和核算功率。

可是对每个具体模型,人工去规划和测验精度混合的办法,是十分繁琐的,咱们迫切需求一种更简练的方法,高效地完成混合精度的练习。AMP,望文生义,便是让混合精度练习主动化,因而运用简略是它的重要特征。具体咋用,咱们往下看!

AMP 的运用办法

下面以 MNIST 为例介绍怎样运用飞桨 AMP 技能。MNIST 网络界说的代码如下所示。其间 conv2d、batch_norm(bn)和 pool2d 的数据布局需求提早设置为'NHWC',这样有利于加快混合精度练习,而且 conv2d 的输出通道数需求设置为 4 的倍数,以便运用 Tensor Core 技能加快。

为了练习 MNIST 网络,还需求界说丢失函数来更新权重参数,此处运用的优化丢失函数是 SGDOptimizer。为了简化阐明,这儿省掉了迭代练习的相关代码,仅表现丢失函数及优化器界说相关的内容。

如上即为最简略的飞桨 AMP 功用运用办法。

可是咱们或许有些疑问,模型是怎样感知哪些算子(Op)需求被转化呢?是不是还需求手艺指定呢?算子那么多,我怎样知道哪个算子可以被转化呢?别着急,飞桨现已帮你定制好了,这也是这门技能被称为「主动」的原因之一,且请往下看!

是非名单功用

为了让开发者可以方便快捷的运用混合精度核算,飞桨的工程师们运用了很多模型在不同运用场景中重复验证,然后依据半精度数据类型核算的稳定性和加快作用,梳理出一系列合适转化为半精度核算的算子,并将这些算子界说到了一份白名单文件中。一起关于一些通过验证发现不合适转化的算子,也便是运用半精度核算会导致数值不精确的算子将被记录到黑名单文件中。此外一些对半精度核算没有多少影响的算子归类于灰名单。在运用 AMP 练习进程中,体系会主动读取是非名单,然后感知到哪些算子需求被转化为半精度核算。

关于某些特别场景,假如开发者期望运用自界说的是非名单,则可以正常的运用 AutoMixedPrecisionLists 类设置,代码示例如下所示。

那么主动混合精度技能被称为「主动」的原因之二呢?那便是下面的主动调整 Loss Scaling 功用。

主动调整 Loss Scaling

AMP 技能在提高访存和核算功率的一起,随同的副作用也是很明显的。那便是因为半精度数据类型的精度规模与转化前的单精度比较过窄,导致简单发作 INF 和 NAN 问题。为了尽最大或许防止此类问题,AMP 技能完成了主动调整 Loss Scaling 功用,即在 AMP 练习进程中,为了尽最大或许防止精度下溢,每练习必定数量批次的数据,就将 Loss 扩大指定倍数。假如 Loss 在扩大进程中发作上溢,则可以再缩小必定倍数,保证整个练习进程中,梯度可以正常收敛。

多卡 GPU 练习的优化

在新发布的飞桨中心结构 1.7 版别上,AMP 技能深度优化了多卡 GPU 练习。如图 2 所示,在优化之前的参数梯度更新进程中,梯度核算时尽管运用的是半精度数据类型,可是不同 GPU 卡之间的梯度传输数据类型仍为单精度。

图 2 1.7 版别之前的参数梯度更新进程示意图

为了下降 GPU 多卡之间的梯度传输带宽,咱们将梯度传输这样的一个进程说到 Cast 操作之前,而每个 GPU 卡在得到对应的半精度梯度后再履行 Cast 操作,将其转变为单精度类型,如图 3 所示。这一优化在练习网络杂乱度较大的模型时,对削减带宽占用方面十分有用,如多卡练习 BERT-Large 模型。

图 3 1.7 版别的参数梯度更新进程示意图

练习功用比照(AMP VS FP32)

飞桨 AMP 技能在 ResNet50、Transformer 等模型上练习速度相关于 FP32 练习来说有十分大的优势,下面以 ResNet50 模型为例,从下图中可以精确的看出,ResNet50 的 AMP 练习相对与 FP32 练习,单卡加快比可达 2.9 倍,八卡加快比可达 2.8 倍。

相关材料

Mixed Precision Training:https://arxiv.org/abs/1710.03740

运用主动混合精度加快 PaddlePaddle 练习:https://on-demand-gtc.gputechconf.com/gtcnew/sessionview.php?sessionName=cn9312-运用主动混合精度加快+paddlepaddle+练习

假如您想具体了解更多飞桨的相关联的内容,请参阅以下文档。

官网地址:https:///PaddlePaddle/Paddle

本文为机器之心发布,转载请联络本大众号取得授权。

------------------------------------------------

“如果发现本网站发布的资讯影响到您的版权,可以联系本站!同时欢迎来本站投稿!

相关阅读
本类排行
本类推荐
栏目热点