电商| 物流| 科技| 创业| 经商| 运营| 科普| 财经| 文娱| AI| 物联| 品牌| 会议| 政策| 时尚| 健康| 家居| 金融| 农业| 汽车| 房产| 百科| 生活| 游戏| 管理| 快讯
 
首页 » 资讯 » 科技 » 如何提高PyTorch“炼丹”速度?这位小哥总结了17种方法,可直接上手更改的那种

如何提高PyTorch“炼丹”速度?这位小哥总结了17种方法,可直接上手更改的那种

放大字体  缩小字体 时间:2021-01-15 16:46    热度:153
本文经AI新媒体量子位(公众号ID:QbitAI)授权转载,转载请联系出处。如何提升PyTorch炼丹速度?最近,有一位名叫Lorenz Kuhn的。。。

本文经AI新媒体量子位(公众号ID: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、将数据集预处理成单个文件,对速度也有好处。

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

 

关于如何提高PyTorch“炼丹”速度?这位小哥总结了17种方法,可直接上手更改的那种的要点介绍,希望对大家了解如何提高PyTorch“炼丹”速度?这位小哥总结了17种方法,可直接上手更改的那种有所帮助,如有侵权,联系我们37442552@qq.com。
 
你可能感兴趣:
 
芬兰政府指责微软对诺基亚始乱终弃 承诺一个都

2016-05-28

本周早些时候,微软宣称它将会裁减1850个工作岗位,其中有1350个工作位于芬兰。人们认为微软裁员之举预示着该公司新手机开发工作的终结。据外电报道,芬兰政…

三星最新发布的C5酷似iPhone 6 售价只有后者一半
三星最新发布的C5酷似iPhone 6 售价只有后者一

2016-05-28 三星 C5

三星最新发布的C5酷似iPhone 6 售价只有后者一半;三星周四在中国市场发布的最新款智能手机C5酷似苹果iPhone 6和6S。

苹果下架腾讯全系产品只是虚惊一场 淘宝、京东

2016-05-29 苹果 腾讯 APP

苹果下架腾讯全系产品只是虚惊一场 淘宝、京东等APP也未能幸免;苹果下架腾讯全系产品,搜索出现大面积瘫痪,淘宝、京东等APP也未能幸免。据了解,腾讯也曾因…

华为为何要在此时向三星发起专利战?背后的原因究竟是什么?
华为为何要在此时向三星发起专利战?背后的原因

2016-05-29 华为 三星 专利

华为为何要在此时向三星发起专利战?背后的原因究竟是什么?作为中国企业的华为,其在专利,尤其是与通信相关的专利的申请和积累在全球均名列前茅。而华为之…

2016中国互联网大会时间地点主题 互联网大会有何亮点?
2016中国互联网大会时间地点主题 互联网大会有

2016-06-02 2016 中国 互联网 大会

 由中国互联网协会主办的2016(第十五届)中国互联网大会将于6月21-23日在北京国际会议中心举行。本届大会主题为“繁荣网络经济 建设网络强国”。

Facebook周四下架了突发新闻通知应用Notify
Facebook周四下架了突发新闻通知应用Notify

2016-06-04 Facebook Notify

Facebook周四下架了突发新闻通知应用Notify;Facebook发言人在发给科技博客The Verge的声明中表示,Notify采用的技术将集成到Messenger中,所以内容发布商可…

阿里回应被SEC问询 马云:那并不代表公司有问题

2016-06-04

近期,阿里巴巴接受美国证券交易委员会问询,16年来日本软银集团首度出售手中阿里股份,阿里股价震荡,相关消息持续引发关注。2

iphone7上市时间确定 国行或5288元起售

2016-06-04

根据国外网站PC-Tablet的报导称,苹果仍将下一代iPhone的发布时刻定在今年9月份,至于详细日期则为美国当地时刻9月9日或9月16日

印度最大手机厂商明年来华抢市场 有戏吗?

2016-06-04

Micromax联合创始人维卡斯贾因(VikasJain)当天在香港举办的一场科技大会上表明,公司的目标是在2020年前变成按销量核算的全球第

索尼Xperia X系列终于要来了6月8日携手周杰伦发

2016-06-04

索尼的手机一直以来都是以拍照以及颜值闻名的,在今年的MWC2016大会上,索尼曾经发布了一款Xperia X系列产品中的Xperia XPerform

 
热点图文
三星最新发布的C5酷似iPhone 6 售价只有后者一半

三星最新发布的C5酷似iPhone 6 售价只有后者一半

华为为何要在此时向三星发起专利战?背后的原因究竟是什么?

华为为何要在此时向三星发起专利战?背后的原因究竟是什么?

2016中国互联网大会时间地点主题 互联网大会有何亮点?

2016中国互联网大会时间地点主题 互联网大会有何亮点?

Facebook周四下架了突发新闻通知应用Notify

Facebook周四下架了突发新闻通知应用Notify

戴尔确认出售软件业务:4年净赔16亿美元

戴尔确认出售软件业务:4年净赔16亿美元

沉迷于成人VR的日本年轻人  年轻男女都拒绝恋爱(图)

沉迷于成人VR的日本年轻人 年轻男女都拒绝恋爱(图)

今日头条母公司字节跳动科创板上市成功几率多大?

今日头条母公司字节跳动科创板上市成功几率多大?

余承东回应:华为开发自有系统 以防美国科技巨头不授权现有系统

余承东回应:华为开发自有系统 以防美国科技巨头不授权现有系统

 
经商宝 — 经商创业营销推广电子商务门户 网站地图 | 关于我们 | 特惠服务 | 人才招聘 | 联系我们 | 法律声明