您当前的位置:首页 > 新闻 > 财经

一行代码让训练速度提升2倍,飞桨自动混合精度技术详解

时间:2020-03-09 17:29:12  来源:  作者:

机器之心编辑部

飞桨自动混合精度技术,让你的训练速度飞起来。

随着生活节奏的加快,「等待」已经越来越成为人们希望远离的事情。但是在深度学习领域,模型的参数、数据集的规模等等动辄就是以亿为单位,甚至更大,因此当模型训练成功之时,放一首张靓颖的「终于等到你」作为背景音乐实在是太应景了。

那如果现在向你推荐一款神器,可以实现训练速度翻倍,访存效率翻倍,你心动吗?心动不如行动(这可不是电视直销,别着急换频道),来和我一起看看这款神器——基于飞桨核心框架的自动混合精度(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 更适于在精度要求不高的场景中使用。

一行代码让训练速度提升2倍,飞桨自动混合精度技术详解

 

图 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 技术加速。

import paddle.fluid as fluiddef MNIST(data, class_dim):     conv1 = fluid.layers.conv2d(data, 16, 5, 1, act=None, data_format='NHWC')     bn1 = fluid.layers.batch_norm(conv1, act='relu', data_layout='NHWC')     pool1 = fluid.layers.pool2d(bn1, 2, 'max', 2, data_format='NHWC')     conv2 = fluid.layers.conv2d(pool1, 64, 5, 1, act=None, data_format='NHWC')     bn2 = fluid.layers.batch_norm(conv2, act='relu', data_layout='NHWC')     pool2 = fluid.layers.pool2d(bn2, 2, 'max', 2, data_format='NHWC')     fc1 = fluid.layers.fc(pool2, size=50, act='relu')     fc2 = fluid.layers.fc(fc1, size=class_dim, act='softmax')    return fc2

 

为了训练 MNIST 网络,还需要定义损失函数来更新权重参数,此处使用的优化损失函数是 SGDOptimizer。为了简化说明,这里省略了迭代训练的相关代码,仅体现损失函数及优化器定义相关的内容。

import paddle.fluid as fluidimport numpy as npdata = fluid.layers.data(     name='image', shape=[None, 28, 28, 1], dtype='float32')label = fluid.layers.data(name='label', shape=[None, 1], dtype='int64')out = MNIST(data, class_dim=10)loss = fluid.layers.cross_entropy(input=out, label=label)avg_loss = fluid.layers.mean(loss)sgd = fluid.optimizer.SGDOptimizer(learning_rate=1e-3)sgd.minimize(avg_loss)

 

那么如何将上面的示例改造成使用 AMP 训练的方式呢?用户仅需要使用飞桨提供的 AMP 函数 fluid.contrib.mixed_precision.decorate 将原来的优化器 SGDOptimizer 进行封装,然后使用封装后的优化器(mp_sgd)更新参数梯度,代码如下所示:

sgd = fluid.optimizer.SGDOptimizer(learning_rate=1e-3)mp_sgd = fluid.contrib.mixed_precision.decorator.decorate(sgd)mp_sgd.minimize(avg_loss)

 

如上即为最简单的飞桨 AMP 功能使用方法。

但是大家可能有些疑问,模型是如何感知哪些算子(Op)需要被转换呢?是不是还需要手工指定呢?算子那么多,我怎么知道哪个算子可以被转换呢?别着急,飞桨已经帮你定制好了,这也是这门技术被称为「自动」的原因之一,且请往下看!

黑白名单功能

为了让开发者可以方便快捷的使用混合精度计算,飞桨的工程师们使用了大量模型在不同应用场景中反复验证,然后根据半精度数据类型计算的稳定性和加速效果,梳理出一系列适合转换为半精度计算的算子,并将这些算子定义到了一份白名单文件中。同时对于一些经过验证发现不适合转换的算子,也就是使用半精度计算会导致数值不精确的算子将被记录到黑名单文件中。此外一些对半精度计算没有多少影响的算子归类于灰名单。在使用 AMP 训练过程中,系统会自动读取黑白名单,从而感知到哪些算子需要被转换为半精度计算。

对于某些特殊场景,如果开发者希望使用自定义的黑白名单,则可以使用 AutoMixedPrecisionLists 类设置,代码示例如下所示。

sgd = SGDOptimizer(learning_rate=1e-3)# 指定自定义的黑白名单,其中 list1 和 list2 为包含有算子名称的列表amp_list = AutoMixedPrecisionLists(custom_white_list=list1,custom_black_list=list2)mp_sgd = fluid.contrib.mixed_precision.decorator.decorate(sgd, amp_list)mp_sgd.minimize(avg_loss)

 

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

自动调整 Loss Scaling

AMP 技术在提升访存和计算效率的同时,伴随的副作用也是很明显的。那就是由于半精度数据类型的精度范围与转换前的单精度相比过窄,导致容易产生 INF 和 NAN 问题。为了避免此类问题,AMP 技术实现了自动调整 Loss Scaling 功能,即在 AMP 训练过程中,为了避免精度下溢,每训练一定数量批次的数据,就将 Loss 放大指定倍数。如果 Loss 在放大过程中发生上溢,则可以再缩小一定倍数,确保整个训练过程中,梯度可以正常收敛。

fluid.contrib.mixed_precision.decorate 函数携带了自动调整 Loss Scaling 功能相关的参数,这些参数都带有默认值,如下面代码所示。这些默认值都是经过飞桨工程师多次验证后定义的。通常情况下,用户可以直接使用,无需重新设置。

sgd = SGDOptimizer(learning_rate=1e-3)mp_sgd = fluid.contrib.mixed_precision.decorator.decorate(sgd,             init_loss_scaling=2**15,             incr_every_n_steps=2000,             use_dynamic_loss_scaling=True)mp_sgd.minimize(avg_loss)

多卡 GPU 训练的优化

在新发布的飞桨核心框架 1.7 版本上,AMP 技术深度优化了多卡 GPU 训练。如图 2 所示,在优化之前的参数梯度更新过程中,梯度计算时虽然使用的是半精度数据类型,但是不同 GPU 卡之间的梯度传输数据类型仍为单精度。

 

一行代码让训练速度提升2倍,飞桨自动混合精度技术详解

 

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

为了降低 GPU 多卡之间的梯度传输带宽,我们将梯度传输这个过程提到 Cast 操作之前,而每个 GPU 卡在得到对应的半精度梯度后再执行 Cast 操作,将其转变为单精度类型,如图 3 所示。这一优化在训练网络复杂度较大的模型时,对减少带宽占用方面非常有效,如多卡训练 BERT-Large 模型。

一行代码让训练速度提升2倍,飞桨自动混合精度技术详解

 

图 3 1.7 版本的参数梯度更新过程示意图

训练性能对比(AMP VS FP32)

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

一行代码让训练速度提升2倍,飞桨自动混合精度技术详解

 



Tags:飞桨自动混合精度技术   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
机器之心编辑部飞桨自动混合精度技术,让你的训练速度飞起来。随着生活节奏的加快,「等待」已经越来越成为人们希望远离的事情。但是在深度学习领域,模型的参数、数据集的规模等...【详细内容】
2020-03-09  Tags: 飞桨自动混合精度技术  点击:(112)  评论:(0)  加入收藏
▌简易百科推荐
降准、降息、提高外汇存准率在2021即将结束的一个月里,央妈连续给市场下达到三道“圣旨”,降准、降息并且提高外汇存准率。从本质上说,1个月内的三道命令主要目的仍然是希望人...【详细内容】
2021-12-27  金投网    Tags:财富   点击:(3)  评论:(0)  加入收藏
(原标题:明年1月1日实施的RCEP是什么?它有多重要?)来源:新华社流程编辑:TF019...【详细内容】
2021-12-27    京报网  Tags:RCEP   点击:(3)  评论:(0)  加入收藏
国际金价在新的一年将充满不确定性,因为美联储希望改变并尽快收紧其货币政策。与此同时,通胀威胁继续增加,这意味着美国实际利率将保持在低至负区间。荷兰银行高级外汇和贵金属...【详细内容】
2021-12-23  中国黄金网    Tags:金价   点击:(10)  评论:(0)  加入收藏
“全额实时到账,没有任何费用,给‘民生环球速汇’点赞!”10月18日10点,北京某公司通过民生银行汇给美国客户5075美元,用于支付专利申请代理服务费。款项到达境外收款人...【详细内容】
2021-12-21    中国网财经  Tags:跨境汇款   点击:(10)  评论:(0)  加入收藏
监制/乔申颖主编/王玥设计/高妍校对/郎冰本文内容系原创,转载请注明来源。...【详细内容】
2021-12-20  经济日报    Tags:中央经济工作会议   点击:(8)  评论:(0)  加入收藏
每经编辑:杜宇据国家统计局官网消息,按照我国国内生产总值(GDP)核算和数据发布制度规定,年度GDP核算包括初步核算和最终核实两个步骤。近日,根据国家统计局统计年报、财政部财政决...【详细内容】
2021-12-17  每日经济新闻    Tags:GDP   点击:(130)  评论:(0)  加入收藏
文:任泽平团队特别鸣谢:华炎雪、王一渌对本文数据整理有贡献中央经济工作会议12月8日至10日在北京举行,总结2021年经济工作,分析当前经济形势,部署2022年经济工作。中央经济工作...【详细内容】
2021-12-16  任泽平  微信公众号  Tags:中央经济工作会   点击:(27)  评论:(0)  加入收藏
经济日报北京12月15日讯(记者曾金华)明年起,进口的人造关节、鳕鱼、婴儿服装、洗碗机等一系列医疗产品和消费品有望降价。12月15日,经国务院批准,国务院关税税则委员会印发通知,20...【详细内容】
2021-12-16    经济日报  Tags:关税   点击:(11)  评论:(0)  加入收藏
年底期待的政策大牌,终于都落地,吃颗定心丸。12月6日政治局会议定调后,一年一度最重要的12月中央经济工作会议,也在8-10号召开。对明年定调落地,基本就是“放心,明年是稳增长政策...【详细内容】
2021-12-14  金宝街观市  今日头条  Tags:中央经济工作会议   点击:(16)  评论:(0)  加入收藏
氢能源产业链分三大部分(产业链占比):制氢(55%)、储\运\充(30%)、氢能源应用(15%) 一、制氢1. 煤制氢航天工程(提供煤粉加压汽化设备和技术)美锦能源(炼焦废气制氢)2. 化工废...【详细内容】
2021-12-10  漫天云    Tags:氢能源   点击:(10)  评论:(0)  加入收藏
相关文章
    无相关信息
最新更新
栏目热门
栏目头条