Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >一行代码让训练速度提升2倍,飞桨自动混合精度技术详解

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

作者头像
机器之心
发布于 2020-03-11 01:48:16
发布于 2020-03-11 01:48:16
68600
代码可运行
举报
文章被收录于专栏:机器之心机器之心
运行总次数:0
代码可运行

机器之心发布

机器之心编辑部

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import paddle.fluid as fluid
def 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。为了简化说明,这里省略了迭代训练的相关代码,仅体现损失函数及优化器定义相关的内容。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import paddle.fluid as fluid
import numpy as np
data = 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)更新参数梯度,代码如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 类设置,代码示例如下所示。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 功能相关的参数,这些参数都带有默认值,如下面代码所示。这些默认值都是经过飞桨工程师多次验证后定义的。通常情况下,用户可以直接使用,无需重新设置。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 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+训练

如果您加入官方 QQ 群,您将遇上大批志同道合的深度学习同学。官方 QQ 群:703252161。

如果您想详细了解更多飞桨的相关内容,请参阅以下文档。

官网地址:https://www.paddlepaddle.org.cn

飞桨核心框架项目地址:https://github.com/PaddlePaddle/Paddle

本文为机器之心发布,转载请联系本公众号获得授权。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器之心 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
NLP涉及技术原理和应用简单讲解【二】:paddle(分布式训练、AMP自动混合精度训练、模型量化、模型性能分析)
https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/06_distributed_training/cluster_quick_start_cn.html
汀丶人工智能
2022/12/21
8100
NLP涉及技术原理和应用简单讲解【二】:paddle(分布式训练、AMP自动混合精度训练、模型量化、模型性能分析)
5大典型模型测试单机训练速度超对标框架,飞桨如何做到?
为方便用户使用,飞桨提供一些不同粒度的Layer,其中有些Layer的组合可以通过单个Layer完成。比如:
AI科技大本营
2019/08/09
5610
更快更简单|飞桨PaddlePaddle单机训练速度优化最佳实践
导读:飞桨(PaddlePaddle)致力于让深度学习技术的创新与应用更简单。在单机训练速度方面,通过高并行、低开销的异步执行策略和高效率的核心算子,优化静态图训练性能,在Paddle Fluid v1.5.0的基准测试中,在7个典型模型上进行了测试(图像领域5个,NLP领域2个),其中5个模型的速度显著优于对标框架(大于15%),2个模型与对标框架持平(5%之内)。如果想让单机训练速度更快,可以根据这篇文档的建议从网络构建、数据准备、模型训练三个方向了解飞桨单机训练中常用的优化方法。来一组测试数据先睹为快。
用户1386409
2019/07/30
9880
更快更简单|飞桨PaddlePaddle单机训练速度优化最佳实践
训练提速60%!只需5行代码,PyTorch 1.6即将原生支持自动混合精度训练。
PyTorch 1.6 nightly增加了一个子模块 amp ,支持自动混合精度训练。值得期待。来看看性能如何,相比Nvidia Apex 有哪些优势?
McGL
2020/09/03
1.3K0
都9102年了还不懂动态图吗?一文带你了解飞桨动态图
导读:飞桨PaddlePaddle致力于让深度学习技术的创新与应用更简单。飞桨核心框架已提供了动态图(DyGraph)相关的API和文档,并且还附有Language model、Sentiment Classification、OCR、ResNet等模型的动态图版本官方实现。飞桨目前兼具了动态图和静态图的优势,同时具备灵活性和高效性。
用户1386409
2019/08/26
1.9K0
都9102年了还不懂动态图吗?一文带你了解飞桨动态图
【一】分布式训练---单机多卡多机多卡(飞桨paddle1.8)
     加快模型的训练速度。通过对训练任务按照一定方法拆分分配到多个计算节点进行计算,再按照一定的方法对需要汇总的信息进行聚合,从而实现加快训练速度的目的。
汀丶人工智能
2022/12/21
1.8K0
【一】分布式训练---单机多卡多机多卡(飞桨paddle1.8)
飞桨万能转换小工具X2Paddle,教你玩转模型迁移
百度推出飞桨(PaddlePaddle)后,不少开发者开始转向国内的深度学习框架。但是从代码的转移谈何容易,之前的工作重写一遍不太现实,成千上万行代码的手工转换等于是在做一次二次开发。
用户1386409
2019/07/02
9720
学界 | 减少模型半数内存用量:百度&英伟达提出混合精度训练法
机器之心编译 选自:arXiv 参与:李泽南、蒋思源 深度学习的模型正在变得越来越复杂,所需要的计算资源也越来越多,在开发更加强大的硬件的同时,很多人也在致力于改进算法。最近,百度和英伟达共同提出了一
机器之心
2018/05/08
1.3K0
学界 | 减少模型半数内存用量:百度&英伟达提出混合精度训练法
[源码分析] Facebook如何训练超大模型---(4)
我们在前文介绍过,微软 ZeRO 可以对一个万亿参数模型可以使用 8 路模型并行、64 路管道并行和 8 路数据并行在 4,096 个 NVIDIA A100 GPU 上进行扩展。而FSDP(Fully Sharded Data Parallel)是Facebook 深度借鉴微软ZeRO之后提出的PyTorch DDP升级版本,可以认为是对标微软 ZeRO,其本质是 parameter sharding。Parameter sharding 就是把模型参数等切分到各个GPU之上。我们会以 Google,微软和 Facebook 的论文,博客以及代码来进行学习分析。
罗西的思考
2022/05/09
1.6K0
[源码分析] Facebook如何训练超大模型---(4)
PyTorch重大更新:将支持自动混合精度训练!
混合精度训练(mixed precision training)可以让模型训练在尽量不降低性能的情形下提升训练速度,而且也可以降低显卡使用内存。目前主流的深度学习框架都开始支持混合精度训练。对于PyTorch,混合精度训练还主要是采用NVIDIA开源的apex库。但是,PyTorch将迎来重大更新,那就是提供内部支持的混合精度训练,而且是自动混合精度训练:
lujohn3li
2020/11/11
2.6K1
PyTorch重大更新:将支持自动混合精度训练!
优化PyTorch速度和内存效率的技巧汇总
深度学习模型的训练/推理过程涉及很多步骤。在有限的时间和资源条件下,每个迭代的速度越快,整个模型的预测性能就越快。我收集了几个PyTorch技巧,以最大化内存使用效率和最小化运行时间。为了更好地利用这些技巧,我们还需要理解它们如何以及为什么有效。
炼丹笔记
2022/10/27
2.6K0
优化PyTorch速度和内存效率的技巧汇总
ERNIE2.0背后的神助攻:飞桨高性能分布式训练引擎
ERNIE 连续获得业界 SOTA 效果,离不开飞桨高性能分布式训练引擎提供的强大支撑。举例来说,在计算复杂度较高的深层 Multi Head Self-Attention 结构和成本较低的海量无监督的中文预训练语料,数据量和算力需求都是超乎想象的,不仅要求我们拥有大量高性能计算芯片,还要有非常强大的分布式训练能力。
用户1386409
2019/08/15
6530
ERNIE2.0背后的神助攻:飞桨高性能分布式训练引擎
ERNIE 连续获得业界 SOTA 效果,离不开飞桨高性能分布式训练引擎提供的强大支撑。举例来说,在计算复杂度较高的深层 Multi Head Self-Attention 结构和成本较低的海量无监督的中文预训练语料,数据量和算力需求都是超乎想象的,不仅要求我们拥有大量高性能计算芯片,还要有非常强大的分布式训练能力。
机器之心
2019/08/09
5470
ERNIE2.0背后的神助攻:飞桨高性能分布式训练引擎
基于飞桨复现 SRGAN 模型,对图像进行超分辨率重构
SRGAN是一种用于图像超分辨率(SR)的生成对抗网络(GAN),能够推断四倍放大因子的照片般逼真的自然图像。
用户1386409
2020/11/06
8860
基于飞桨复现 SRGAN 模型,对图像进行超分辨率重构
Pytorch mixed precision 概述(混合精度)
本文对pytorch中的mixed precision进行测试。主要包括两部分,第一部分为mixed precision使用概述,第二部分为实际测试。参考torch官网 Automatic Mixed Precision
公众号机器学习与AI生成创作
2021/04/19
2K0
Pytorch mixed precision 概述(混合精度)
人脸表情识别实战:你的喜怒哀乐飞桨统统get!
【飞桨开发者说】李增保,2019年于安徽工业大学取得学士学位,目前在东南大学攻读硕士研究生学位,主要的研究方向为分布式无人机集群协同控制、算法设计与优化等。
用户1386409
2020/06/10
2.7K0
手把手教你如何用飞桨自动生成二次元人物头像
每次生成一组shape为[1,72]的随机数,更改其中某个数值,依次生成20组随机数,作为生成网络的输入,得到横向对比图片,观察GAN带来的神奇效果,如下所示。
用户1386409
2020/06/17
8220
手把手教你如何用飞桨自动生成二次元人物头像
性能领先,即训即用,快速部署,飞桨首次揭秘服务器端推理库
为什么难呢?因为调参就像厨师根据食材找到了料理配方,药剂师根据药材找到了药方,充满了玄幻色彩。
量子位
2020/03/18
8700
改动一行代码,PyTorch训练三倍提速,这些「高级技术」是关键
GitHub 地址:https://github.com/rasbt/cvpr2023
计算机视觉研究院
2023/08/23
5360
改动一行代码,PyTorch训练三倍提速,这些「高级技术」是关键
【DL】模型训练太慢?显存不够用?这个算法让你的GPU老树开新花
小夕找了一份开源代码,结果刚开始跑小夕就震惊了!什么鬼?训练速度怎么这么快?出bug了吧????
yuquanle
2020/02/20
1.8K0
【DL】模型训练太慢?显存不够用?这个算法让你的GPU老树开新花
推荐阅读
NLP涉及技术原理和应用简单讲解【二】:paddle(分布式训练、AMP自动混合精度训练、模型量化、模型性能分析)
8100
5大典型模型测试单机训练速度超对标框架,飞桨如何做到?
5610
更快更简单|飞桨PaddlePaddle单机训练速度优化最佳实践
9880
训练提速60%!只需5行代码,PyTorch 1.6即将原生支持自动混合精度训练。
1.3K0
都9102年了还不懂动态图吗?一文带你了解飞桨动态图
1.9K0
【一】分布式训练---单机多卡多机多卡(飞桨paddle1.8)
1.8K0
飞桨万能转换小工具X2Paddle,教你玩转模型迁移
9720
学界 | 减少模型半数内存用量:百度&英伟达提出混合精度训练法
1.3K0
[源码分析] Facebook如何训练超大模型---(4)
1.6K0
PyTorch重大更新:将支持自动混合精度训练!
2.6K1
优化PyTorch速度和内存效率的技巧汇总
2.6K0
ERNIE2.0背后的神助攻:飞桨高性能分布式训练引擎
6530
ERNIE2.0背后的神助攻:飞桨高性能分布式训练引擎
5470
基于飞桨复现 SRGAN 模型,对图像进行超分辨率重构
8860
Pytorch mixed precision 概述(混合精度)
2K0
人脸表情识别实战:你的喜怒哀乐飞桨统统get!
2.7K0
手把手教你如何用飞桨自动生成二次元人物头像
8220
性能领先,即训即用,快速部署,飞桨首次揭秘服务器端推理库
8700
改动一行代码,PyTorch训练三倍提速,这些「高级技术」是关键
5360
【DL】模型训练太慢?显存不够用?这个算法让你的GPU老树开新花
1.8K0
相关推荐
NLP涉及技术原理和应用简单讲解【二】:paddle(分布式训练、AMP自动混合精度训练、模型量化、模型性能分析)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验