深度学习提速10倍!

人工智能博士 人工智能博士     2023-01-12     526

关键词:

点上方人工智能算法与Python大数据获取更多干货

在右上方 ··· 设为星标 ★,第一时间获取资源

仅做学术分享,如有侵权,联系删除

转载于 :量子位

面对数以亿计的图片数据,到底该用什么样的方法才能快速搞实验?

这样的问题,或许在做机器学习研究的你,也会经常遇到。

而就在最近,一个国外小哥就提出了一种建议:

在Pytorch lightning基础上,让深度学习pipeline速度提升10倍

用他自己的话来说就是——“爬楼时像给了你一个电梯”。

这般“酸爽”,到底是如何做到的呢?

优化机器学习pipeline,很重要

无论你是身处学术界还是工业界,时间资源等各种因素,往往会成为你在搞实验的枷锁

尤其是随着数据集规模和机器学习模型,变得越发庞大和复杂,让实验变得既费时又耗力。

提速这件事,就变得至关重要。

例如在2012年的时候,训练一个AlexNet,要花上5到6天的时间。

而现如今,只需要短短几分钟就可以在更大的数据集上训练更大的图像模型。

这位小哥认为,从某种角度上来说,这是得益于各种各样的“利器”的出现。

例如Pytorch Lingtning,就是其中一种。

于是,他便“死磕”pipeline,总结了六种“闪电加速”实验周期的方法。

并行数据加载

数据加载和增强(augmentation)往往被认为是训练pipeline时的瓶颈之一。

一个典型的数据pipeline包含以下步骤:

  • 从磁盘加载数据

  • 在运行过程中创建随机增强

  • 将每个样本分批整理

在这个过程中,倒是可以用多个CPU进程并行加载数据来优化。

但与此同时,还可以通过下面的操作来加速这一过程:

1、将DataLoader中的num_workers参数设置为CPU的数量。

2、当与GPU一起工作时,将DataLoader中的pin_memory参数设置为True。这可以将数据分配到页锁定的内存中,从而加快数据传输到GPU的速度。

使用分布式数据并行的多GPU训练

与CPU相比,GPU已经大大加速了训练和推理时间。

但有没有比一个GPU更好的方法?或许答案就是:

多个GPU!

在PyTorch中,有几种范式可以用多个GPU训练你的模型。

两个比较常见的范式是 “DataParallel ”和 “DistributedDataParallel”。

而小哥采用的方法是后者,因为他认为这是一种更可扩展的方法。

但在PyTorch(以及其他平台)中修改训练pipeline并非易事。

必须考虑以分布式方式加载数据以及权重、梯度和指标的同步等问题。

不过,有了PyTorch Lightning,就可以非常容易地在多个GPU上训练PyTorch模型,还是几乎不需要修改代码的那种!

混合精度

在默认情况下,输入张量以及模型权重是以单精度(float32)定义的。

然而,某些数学运算可以用半精度(float16)进行。

这样一来,就可以显著提升速度,并降低了模型的内存带宽,还不会牺牲模型的性能。

通过在PyTorch Lightning中设置混合精度标志(flag),它会在可能的情况下自动使用半精度,而在其他地方保留单精度。

通过最小的代码修改,模型训练的速度可以提升1.5至2倍。

早停法

当我们训练深度学习神经网络的时候,通常希望能获得最好的泛化性能。

但是所有的标准深度学习神经网络结构,比如全连接多层感知机都很容易过拟合。

当网络在训练集上表现越来越好,错误率越来越低的时候,实际上在某一刻,它在测试集的表现已经开始变差。

因此,早停法 (Early Stopping)便在训练过程中加入了进来。

具体来说,就是当验证损失在预设的评估次数(在小哥的例子中是10次评估)后停止训练。

这样一来,不仅防止了过拟合的现象,而且还可以在几十个 epoch内找到最佳模型。

Sharded Training

Sharded Training是基于微软的ZeRO研究和DeepSpeed库。

它显著的效果,就是让训练大模型变得可扩展和容易。

否则,这些模型就不适合在单个GPU上使用了。

而在Pytorch Lightning的1.2版本中,便加入了对Shared Training的支持。

虽然在小哥的实验过程中,并没有看到训练时间或内存占用方面有任何改善。

但他认为,这种方法在其它实验中可能会提供帮助,尤其是在不使用单一GPU的大模型方面。

模型评估和推理中的优化

在模型评估和推理期间,梯度不需要用于模型的前向传递。

因此,可以将评估代码包裹在一个torch.no_grad上下文管理器中。

这可以防止在前向传递过程中的存储梯度,从而减少内存占用。

如此一来,就可以将更大的batch送入模型,让评估和推理变得更快。

效果如何?

介绍了这么多,你肯定想知道上述这些方法,具体起到了怎样的作用。

小哥为此做了一张表格,详解了方法的加速效果。

那么这些方法,是否对在做机器学习实验的你有所帮助呢?

快去试试吧~

参考链接:

https://devblog.pytorchlightning.ai/how-we-used-pytorch-lightning-to-make-our-deep-learning-pipeline-10x-faster-731bd7ad318a

---------♥---------

声明:本内容来源网络,版权属于原作者

图片来源网络,不代表本公众号立场。如有侵权,联系删除

AI博士私人微信,还有少量空位

如何画出漂亮的深度学习模型图?

如何画出漂亮的神经网络图?

一文读懂深度学习中的各种卷积

点个在看支持一下吧

用上pytorchlightning的这六招,深度学习pipeline提速10倍!

...哥就提出了一种建议:在Pytorchlightning基础上,让深度学习pipeline速度提升10倍!用他自 查看详情

提速10倍!深度解读字节跳动新型云原生sparkhistoryserver

更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群前不久,在6月29日Databricks举办的Data+AISummit上,火山引擎向大家首次介绍了UIMeta,一款致力于监控、分析和优化的新型云原生SparkHistory... 查看详情

用taichi加速python:提速100+倍!(代码片段)

Python已经成为世界上最流行的编程语言,尤其在深度学习、数据科学等领域占据主导地位。但是由于其解释执行的属性,Python较低的性能很影响它在计算密集(比如多重for循环)的场景下发挥作用,实在让人... 查看详情

深度学习momentum(动量方法)

转自:http://blog.csdn.net/bvl10101111/article/details/72615621先上结论:1.动量方法主要是为了解决Hessian矩阵病态条件问题(直观上讲就是梯度高度敏感于参数空间的某些方向)的。2.加速学习 3.一般将参数设为0.5,0.9,或者0.99,分别表... 查看详情

keil编译太慢怎么办?教你一招,提速10倍(代码片段)

点击上方“小麦大叔”,选择“置顶/星标公众号”福利干货,第一时间送达大家好,我是小麦,最近我在进行一个项目的开发,用的IDE是Keilmdk,由于代码量逐渐增加,发现编译的速度越来越慢。构建... 查看详情

keil编译太慢怎么办?教你一招,提速10倍(代码片段)

点击上方“小麦大叔”,选择“置顶/星标公众号”福利干货,第一时间送达大家好,我是小麦,最近我在进行一个项目的开发,用的IDE是Keilmdk,由于代码量逐渐增加,发现编译的速度越来越慢。构建... 查看详情

斯坦福新深度学习系统noscope:视频对象检测快1000倍

...编译:刘小芹斯坦福大学的新研究构建一个名为NoScope的深度学习视频对象检测系统,利用视频的局部性对CNN模型进行优化,相比当前性能最好的 YOLOv2或FasterR-CNN速度加快了1000倍,同时仍保持 查看详情

1个gpu几分钟搞定强化学习训练,谷歌新引擎让深度学习提速1000倍丨开源

博雯发自凹非寺量子位报道|公众号QbitAI机器人要如何完成这样一个动作?我们一般会基于强化学习,在仿真环境中进行模拟训练。这时,如果在一台机器的CPU环境下进行模拟训练,那么需要几个小时到几天。但现... 查看详情

快出数量级的性能是怎样炼成的

...能优化的案例,不算很多,还没有失手过。少则提速数倍,多则数十倍,极端情况还有提速上千倍的。提速一个数量级基本上是常态。下面是一些案例材料:开源SPL提速保险公司团保明细单查询2000+倍开源SP... 查看详情

如何让xcode在读写上提速100倍?

如何让Xcode在读写上提速100倍?上个月参加了一场西雅图当地的线下iOS开发者聚会。JeffSzuhay作为一个有20+年开发经验的资深程序员,跟我讲了一套提高iOS开发效率的方法。相比于其他程序员在App启动时间、架构优化方面的经验,... 查看详情

深度学习正改变物理系统模拟,速度最高提升20亿倍那种

梦晨发自凹非寺量子位报道|公众号QbitAI如果经常玩大型游戏的话应该会发现,游戏里的物理引擎效果越来越好了。比如育碧公司的新游戏《极限国度》中自行车溅起的泥点、受到滑板冲击改变的雪道和飞溅的雪花、随着角色... 查看详情

google提出两个逆天模型:体积下降7倍,速度提升10倍

...经网络模型和训练数据规模的增长,训练效率正成为深度学习的一个重要焦点。GPT-3在小样本学习中表现出卓越的能力,但它需要使用数千个GPU进行数周的训练, 查看详情

机器学习中具有 10 倍交叉验证的代码

】机器学习中具有10倍交叉验证的代码【英文标题】:Codewith10foldcrossvalidationinmachinelearning【发布时间】:2016-06-0605:27:20【问题描述】:我刚刚开始使用机器学习。我尝试使用C5.0模型进行10折交叉验证。我要求代码返回kappa值。fold... 查看详情

smartidev0.1.18已经发布-助力阿里国产ideopensumi插件安装提速10倍dapr和jupyter支持clik8s支持(代码片段)

SmartIDEv0.1.18(clibuild3538)已经发布,在过去的Sprint18中,我们集中精力推进对k8s远程工作区的支持,同时继续扩展SmartIDE对不同技术栈的支持,我们适配了针对分布式应用运行时Dapr以及数据科学计算分析工具Juypter的... 查看详情

import一个“太极”库,让python代码提速100倍!

丰色发自凹非寺量子位|公众号QbitAI众所周知,Python的简单和易读性是靠牺牲性能为代价的——尤其是在计算密集的情况下,比如多重for循环。不过现在,大佬胡渊鸣说了:只需import一个叫做“Taichi”的库,就... 查看详情

import一个“太极”库,让python代码提速100倍!

丰色发自凹非寺量子位|公众号QbitAI众所周知,Python的简单和易读性是靠牺牲性能为代价的——尤其是在计算密集的情况下,比如多重for循环。不过现在,大佬胡渊鸣说了:只需import一个叫做“Taichi”的库,就... 查看详情

你敢信!?几行代码让swift数组初始化提速440+倍!

功能需求在Swift中,我们有时需要初始化数组内容,这往往是一个耗时操作,数组越大时间越长。那么,如何最大限度的缩短数组的初始化时间呢?如上所示,在初始化1w个元素的数组时,我们的3种方法分别耗时为:53.855秒0.36秒... 查看详情

深度学习项目|一招让你的mao(猫)片十倍增长

我们知道深度学习模型训练时通常都需要大量的训练集,我们在做图像相关的应用时同样需要进行图像数据增加,下面我将给大家总结10种图像数据增强常用的方式,并给出keras的实现方法。一.水平翻转随机的对图片进行水平... 查看详情