batch & print pro_增大BATCH训练神经网络 | 如何优雅的训练Bert、GPT和XLNet

—— 关注获取更多科技前沿知识 ——

在算法工程师平常实现自己idea的过程中,经常会在自己很满意的写完整套模型代码,准备跃跃欲试运行自己的模型代码的时候,Cuda out of Memory!!!. 因此如何解决这样的问题呢,本文总结了一些常用的实战技巧

作者 | AutoML前沿 全文共1030字,阅读可能需要5分钟 00628cda393ffb99535aec4752e5246b.gif 梯度累积(gradient accumulation) 当 GPU的显存不足无法采用稍大的batchSize 的时候,可以采用梯度累积的方法。即前向反向传播 N次后,再进行参数的更新。 如下所示是一个pytorch 的实现版本: 304dc02029d6c0a44862a470e65cc09e.png 梯度检查点(gradient Checkpointing)

在缺乏足够的GPU资源的时候,又想训练大模型,一个直观的思路是用时间换取空间:在前向训练的过程中,会保存下来模型每一个网络层的激活值,这会占用GPU很大一部分的空间,所以一个直观的想法的是能否在用到这些激活值的时候再去得到它们,而不是一直存储它们。机器学习大佬、xgboostTVM的作者陈天奇提出了一个方法,即在反向传播需要得到梯度的时候再重新计算一遍。更多的细节可以参考Training Deep Nets with Sublinear Memory Cost这篇文章。

e41732d4f6dea0a2ca819b1632f6d8f4.png 混合精度训练(mixed precision trainning)

混合精度训练指的是在模型的训练过程中存在两种参数的存储方式,分别是全精度和半精度。由于深度学习模型包含大量的浮点数,常见的存储方式是float32、float16。但是在很多情况下并不需要float32就能解决很多的问题。并且float16相比较float32有两个优势:分别是内存占用更少,计算更快。不仅仅可以减少单机单卡的计算时间(内存占用更少,可以使用更大的batchSize),由此也能大幅的降低多机多卡的时间延迟。

内存占用更少 :这是显然易见的,float16只需要2个字节,但是float32需要4个字节。 计算更快 由于深度学习中存在大量的矩阵乘法半精度的计算吞吐量可以是单精度的2-8倍 。

在整个训练过程中的梯度变化如下图所示,其中保存的内容包括(weights,gradient, activation)。在softmax等操作的时候存在累加, float16会出现舍入误差[1]。所以在整个运算的过程中,采用float16进行乘法等运算操作,float32进行加法的运算。此外在权重进行更新的时候也会存在由于梯度值过小,也会出现舍入误差。为此需要在整个训练的过程中需要保存一份权重的副本,得到的FP32的损失需要转换为float16的梯度,在更新的时候scale为float32的Gradient,确保整个更新的过程都是在float32程中进行。

68f362a5090c88f879f60bd746bac079.png 如何应用Mix Precition

对于pytorch框架可以使用nvidia开源的加速框架APEX,支持混合训练和分布式训练:

b08d3137401fbb6af6f8914bde667f8e.png 对于TensorFlow框架,也有很方便的方法支持: b3f3422523649180b93c3dafbbf38d94.png 当然,如果你有多个机器,多个GPU的机器,那就可以把以上的技术先抛在一边,下回将介绍如何利用分布式的技术加速深度学习模型的训练。

[1] https://zhuanlan.zhihu.com/p/79887894 (【PyTorch】唯快不破:基于Apex的混合精度加速

[2] https://arxiv.org/pdf/1710.03740.pdf

a1c2054f6be897f319e5bb00d8e79735.png 欲探索更多关于AutoML的精髓,小编强烈推荐大家阅读国内首本系统性介绍AutoML的中文书籍—— 《深入理解AutoML和AutoDL》 。该书由国内顶尖AI专家撰写,业界多位资深专家联袂推荐,来盘它吧~(点击以下链接即可进行购买)

1889a2d4b7eb0c1488f611b04e951fd1.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值