网易首页 > 网易号 > 正文 申请入驻

如何提高PyTorch“炼丹”速度?这位小哥总结了17种方法

0
分享至

杨净 发自 凹非寺
量子位 报道 | 公众号 QbitAI

如何提升PyTorch“炼丹”速度?

最近,有一位名叫Lorenz Kuhn的小哥,分享了他在炼丹过程中总结的17种投入最低、效果最好的提升训练速度的方法,而且基本上都可以直接在PyTorch中进行更改,无需引入额外的库。

不过需要注意的是,这些方法都是假设是在GPU上训练模型。

这一分享在Reddit上得到了600的热度。

接下来,我们便从提速高低开始,依次对这些方法来做介绍。

1、选择合适的学习率时间表。

选择的学习率时间表对收敛速度以及模型的泛化性能有很大影响。

Leslie Smith提出的周期性学习速率(CLR)以及 1cycle 策略可以令复杂模型的训练迅速完成。

比如在 cifar10 上训练 resnet-56 时,通过使用 1cycle,迭代次数可以减少10倍,得到与原论文相同的精度。

在最好的情况下,与传统的相比,这个时间表实现了大规模的提速。不过有一个缺点,它们引入了一些额外的超参数。

为什么这样做有效?一种可能的解释是,定期增加学习率有助于更快地穿越损失函数中的鞍点。

2、在DataLoader中使用多个工作程序并固定内存。

使用时torch.utils.data.DataLoader,请设置num_workers > 0,而不是默认值0,和pin_memory=True,而不是默认值False。

英伟达高级工程师Szymon Micacz使用了4个工作程序和固定内存,在单个训练时期内将速度提高了两倍。

需要注意的是,在选择worker数量时,建议将设置为可用GPU数量的四倍

worker数量的多和少都会导致速度变慢,数量越多还会增加CPU内存消耗

3、批量最大化。

这一方法极具争议。但在通常情况下,使用GPU内存允许的最大批处理量可以加快训练速度。

如果要修改批量大小,还需要调整其他的超参数,比如,学习率。一般来说,将批量大小增加一倍,学习率也提高一倍。

此前有人进行了了一些不同批量大小的实验,通过将批量大小从64增加到512实现了4倍的加速。

4、使用自动混合精度(AMP)。

PyTorch 1.6版本就包括了对 PyTorch 的自动混合精度训练的本地实现。

与其他地方使用的单精度(FP32)相比,某些操作可以在半精度(FP16)上运行得更快,并且不会损失准确性。

随后,让AMP自动决定应以什么样的格式执行操作,这样既可以加快训练速度,也可以减少内存占用。

有研究者发现,在NVIDIA V100 GPU上对一些常见的语言和视觉模型进行基准测试时,使用AMP要比常规的FP32训练的速度提升2倍,最高可提升5.5倍

目前,只有CUDA ops 可以通过这种方式进行自动广播。

5、使用不同的优化器

比如AdamW,AdamW是带有权重衰减(而不是L2正则化)的Adam,它在错误实现、训练时间都胜过Adam。

此外,还有一些非本地的优化器值得关注,比如,LARS和LAMB。

NVIDA的APEX实现了一些常见优化器(比如Adam)的融合版本,比如Adam。与Adam的PyTorch实现相比,它避免了多次进出GPU内存的过程,产生了5%左右的速度提升。

6、打开cudNN基准测试。

如果你的模型架构保持固定,输入大小保持不变,则可以设置torch.backends.cudnn.benchmark = True,启动 cudNN 自动调整器。

它将对cudNN中计算卷积的多种不同方法进行基准测试,以获得最佳的性能指标。

7、防止CPU和GPU之间频繁传输数据。

注意要经常使用tensor.cpu()将tensors从GPU传输到CPU,.item()和.numpy()也是如此,使用.detach()代替。

如果正在创建一个张量,就可以使用关键字参数device=torch.device(‘cuda:0’)直接将其分配给你的GPU。

如果到传输数据的情境下,可以使用.to(non_blocking=True),只要你在传输后没有任何同步点。

8、使用梯度/激活检查点。

检查点的工作原理,是用计算换取内存。检查点部分不是将整个计算图的所有中间激活都存储起来向后计算,而不是保存中间激活,在后传中重新计算。

它可以应用到模型的任何部分。

具体来说,在前向传递中,函数将以torch.no_grad()的方式运行,即不存储中间的激活。相反,前向传递会保存输入元组和函数参数。

在后向传递中,检索保存的输入和函数,然后再次对函数进行前向传递计算,现在跟踪中间激活,使用这些激活值计算梯度。

虽然这可能会略微增加你在给定批量大小下的运行时间,但你会显著减少你的内存占用。这反过来又会让你进一步增加你所使用的批次大小,提高GPU的利用率。

9、使用梯度累积。

另一种增加批次大小的方法是在调用optimizer.step()之前,在多个.backward()通道中累积梯度。

这个方法主要是为了规避GPU内存限制而开发的,但不清楚是否有额外的.backward()循环之间的权衡。

10、使用DistributedDataParallel进行多GPU训练。

加速分布式训练的方法可能需要单独写一篇文章,但一个简单的方法是使用 torch.nn.DistributedDataParallel 而不是 torch.nn.DataParallel。

这样做可以让每个GPU将由一个专门的CPU核驱动,避免了DataParallel的GIL问题。

11、将梯度设置为None而不是0。

使用.zero_grad(set_to_none=True)而不是.zero_grad()。

这样做会让内存分配器来处理梯度,而不是主动将它们设置为0,这样会适度加速。

注意,这样做并不是没有副作用的。

12、使用 .as_tensor 而不是 .tensor()

torch.tensor() 总是复制数据。如果你有一个要转换的 numpy 数组,使用 torch.as_tensor() 或 torch.from_numpy() 来避免复制数据。

13、如果不需要,请关闭调试API。

Pytorch提供了很多调试工具,例如autograd.profiler,autograd.grad_check和autograd.anomaly_detection,确保在需要的时候使用它们,不需要时将其关闭,否则它们会拖慢你的训练速度。

14、使用梯度剪裁。

剪裁梯度,可以加速加速收敛。最初是用来避免RNNs中的梯度爆炸,可以使用orch.nn.utils.clipgrad_norm来实现。

目前尚不清楚哪些模型能靠梯度剪裁能够加速多少,但它似乎对RNNs、基于 Transformer 和 ResNets 的架构以及一系列不同的优化器都非常有用。

15、在BatchNorm之前关闭偏置。

这是一个非常简单的方法,在BatchNormalization图层之前关闭图层的偏置。

对于二维卷积层,可以通过将bias关键字设置为False:来完成torch.nn.Conv2d(…, bias=False, …)

16、在验证过程中关闭梯度计算。

在验证期间设置torch.no_grad() 。

17、使用输入和批次归一化。

额外提示,使用JIT来融合逐点操作。

如果你有相邻的逐点操作,可以使用PyTorch JIT将其合并成一个FusionGroup,然后在单个内核上启动,这样可以节省一些内存读写。

不少网友在表达感谢的同时,还分享了自己训练时的小Tips。

比如这位炼丹师分享了第“18”个方法,下载更多的RAM。

还有人提出了两点建议:

1、数据变换 (用于数据增强) 可成为速度提升的另一个来源。一些只使用简单 Python 语句的变换可以通过使用 numba 包来加速。

2、将数据集预处理成单个文件,对速度也有好处。

除了这些,你还有哪些可以提升训练速度的方法?欢迎与我们分享~

传送门:
https://efficientdl.com/faster-deep-learning-in-pytorch-a-guide/#1-consider-using-another-learning-rate-schedule
https://www.reddit.com/r/MachineLearning/comments/kvs1ex/d_here_are_17_ways_of_making_pytorch_training/

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
我78岁风流才子和妙龄少妇同居两年后,她怀孕还发财了

我78岁风流才子和妙龄少妇同居两年后,她怀孕还发财了

叶天辰故事会
2024-04-23 22:26:35
6台光刻机,突然宣布!美媒:荷兰ASML反水了!

6台光刻机,突然宣布!美媒:荷兰ASML反水了!

小蘑菇壹号
2024-04-25 19:38:47
线上讨薪!郭艾伦喊话贾跃亭:贾总我的150万什么时候结一下

线上讨薪!郭艾伦喊话贾跃亭:贾总我的150万什么时候结一下

懂球帝
2024-04-25 08:27:11
退休养老金最新规定2024

退休养老金最新规定2024

天下纵览
2024-04-25 16:16:53
靳东被抓!涉案金额巨大!我们都被他骗了

靳东被抓!涉案金额巨大!我们都被他骗了

莫问先生
2024-04-25 17:37:39
犹太人的暴利思维:10元买1000股跌到8元卖出500股,7.5元补500股

犹太人的暴利思维:10元买1000股跌到8元卖出500股,7.5元补500股

微笑看红尘
2024-03-10 16:44:57
塔图姆:若再次被热火淘汰会考虑退役,希望在热火主场创造奇迹

塔图姆:若再次被热火淘汰会考虑退役,希望在热火主场创造奇迹

小豆豆赛事
2024-04-25 13:58:53
不等周琦了!广东一节领先17分打爆广厦,开场20-4,现在辽篮最怕

不等周琦了!广东一节领先17分打爆广厦,开场20-4,现在辽篮最怕

嘴炮体坛
2024-04-25 20:09:39
伊朗启动北斗后,被拦截率99%,但以色列不敢扩大事态,美国怂了

伊朗启动北斗后,被拦截率99%,但以色列不敢扩大事态,美国怂了

A独舌视界
2024-04-25 14:40:35
不是保利尼奥,海港官宣喜讯,29岁强援驰援,巅峰身价过亿

不是保利尼奥,海港官宣喜讯,29岁强援驰援,巅峰身价过亿

东球弟
2024-04-25 17:23:59
“梅西条款”,再次说明梅西在香港缺战是主办方的责任!

“梅西条款”,再次说明梅西在香港缺战是主办方的责任!

历史第一人梅西
2024-04-25 12:01:39
利好!散户做好准备,A股,明日(4月26日)股市将重演历史

利好!散户做好准备,A股,明日(4月26日)股市将重演历史

郭小凡财经
2024-04-25 14:51:34
爱情公寓秦羽墨扮演者新开美甲店被吐槽技术不好,店员回应

爱情公寓秦羽墨扮演者新开美甲店被吐槽技术不好,店员回应

金羊网
2024-04-25 15:23:17
“不接受篮协判罚”,周琦禁赛杜锋强硬表态,广东男篮已无退路

“不接受篮协判罚”,周琦禁赛杜锋强硬表态,广东男篮已无退路

姜大叔侃球
2024-04-25 12:37:36
字节被裁当天发现怀孕

字节被裁当天发现怀孕

蚂蚁大喇叭
2024-04-25 15:25:56
凤凰传奇常州演唱会彻底杀疯了,现场沦为伴舞,副市长到场打call

凤凰传奇常州演唱会彻底杀疯了,现场沦为伴舞,副市长到场打call

娱乐白名单
2024-04-24 18:07:02
莫妮卡·贝鲁奇登上西班牙版《Elle》杂志封面,状态极佳

莫妮卡·贝鲁奇登上西班牙版《Elle》杂志封面,状态极佳

南枫八爪娱
2024-04-24 21:32:00
陕西一火化工将女尸推焚化炉火化,揭开白布后,意外突然发生

陕西一火化工将女尸推焚化炉火化,揭开白布后,意外突然发生

佳琪Feeling
2024-02-06 20:20:49
麦穗丰连续评价许钟豪:谁开始得分就对谁下黑手 全国人民都看着

麦穗丰连续评价许钟豪:谁开始得分就对谁下黑手 全国人民都看着

直播吧
2024-04-25 21:47:32
善恶终有报!“港独分子”陈方安生,现在已活成了一个“笑话”?

善恶终有报!“港独分子”陈方安生,现在已活成了一个“笑话”?

韶华倾覆i
2024-04-24 11:51:55
2024-04-25 22:22:46
量子位
量子位
追踪人工智能动态
9321文章数 175241关注度
往期回顾 全部

科技要闻

神舟十八号发射,飞船太阳帆板已展开

头条要闻

布林肯对所谓中方"非市场经济行为"提关切 外交部回应

头条要闻

布林肯对所谓中方"非市场经济行为"提关切 外交部回应

体育要闻

当胜利变成意外,就不要再提未来……

娱乐要闻

心疼!伊能静曝儿子曾被狗仔追到洗手间

财经要闻

24年后再产纯净水 农夫山泉为何要打自己脸

汽车要闻

全新哈弗H9亮相 大号方盒子硬派SUV入列

态度原创

家居
健康
数码
手机
旅游

家居要闻

光影之间 空间暖意打造生活律动

这2种水果可降低高血压死亡风险

数码要闻

魅蓝 Blus 3 / Pro 降噪耳机发布,279/369 元

手机要闻

用了几天OPPO K12后,我发现中端手机有了新的内卷方向

旅游要闻

京都热门景点一棵樱花树突然倒下 游客被砸成重伤

无障碍浏览 进入关怀版