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

QbitAl QbitAl     2023-01-09     258

关键词:

金磊 发自 凹非寺
量子位 报道 | 公众号 QbitAI

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

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

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

在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

在日本写代码玩乐队,做前端tl的这六年

嗨,你好鸭:)我是Nic。▌在国外几年了?介绍下你本人的经历及当前所做的事情吧?从2015年来到日本东京,现在是我在日本的第六个年头。我是通过一个叫WorkInJapan的项目来到日本的,之前我并没有... 查看详情

作为it行业过来人,飞哥想对你聊聊我的这六点认知!

大家好,我是飞哥!我最近逛知乎的时候浏览到这样一个火热的问题:“作为IT行业的过来人,你有什么话想对后辈说的?”飞哥我本人是2010年硕士毕业,到今天已经工作了十多年了。借这个话题谈几点粗... 查看详情

六招助你快速建设一个优秀网站

站长都知道一个优秀的网站对网站的影响有多重要,不仅可以为用户带来惊喜,还可以给网站带来意想不到的收获。而要建一个优秀的网站该怎样建网站,一般有哪些步骤呢?下面就一起来分析一下。第一、对网站的目的定位要... 查看详情

在原神里钓鱼,有人竟然用上了深度强化学习,还把它开源了

还愁在《原神》里钓不到鱼吗?这有一份迟到的提瓦特钓鱼指南。在游戏圈,你可以没有玩过,但一定听过《原神》。虽然这是一款口碑两极分化的游戏,但不得不承认《原神》是当前最为火热的游戏之一。特别... 查看详情

用上chatgpt的这几个功能,你的开发效率不高都难(代码片段)

ChatGPT去年12月份开始火得不行了,它彻底改变了程序员开发代码的方式。怎么来提高程序员开发程序的效率呢?可能现在大多数软件开发人员仍然没有习惯使用ChatGPT,本文将介绍几种方式来提升和简化自己的工作。一、重构你... 查看详情

在原神里钓鱼,有人竟用上了深度强化学习,还把它开源了(代码片段)

还愁在《原神》里钓不到鱼吗?这有一份迟到的提瓦特钓鱼指南。在游戏圈,你可以没有玩过,但一定听过《原神》。虽然这是一款口碑两极分化的游戏,但不得不承认《原神》是当前最为火热的游戏之一。特别... 查看详情

如何辨别橱柜的质量好坏?学会六招成为橱柜专家

    现如今,市面上的橱柜品牌越来越多,不少滥竽充数的产品也随之而来,我们都想买一款品质有保证的橱柜,那么我们该怎么衡量橱柜质量的好坏呢?首先我们不妨来看看橱柜的组成部分,每个部分都是橱柜质... 查看详情

在原神里钓鱼,有人竟然用上了深度强化学习,还把它开源了

还愁在《原神》里钓不到鱼吗?这有一份迟到的提瓦特钓鱼指南。在游戏圈,你可以没有玩过,但一定听过《原神》。虽然这是一款口碑两极分化的游戏,但不得不承认《原神》是当前最为火热的游戏之一。特别... 查看详情

有容云-容器安全,六招解决

引言: 容器是把双刃剑,一方面,它可以标准化应用的运行环境,实现DevOps,应用版本快速迭代,随需弹性伸缩。另一方面,它是一种全新的技术,对云计算生态从计算、存储、网络都产生了新的技术... 查看详情

有容云-容器安全,六招解决

引言: 容器是把双刃剑,一方面,它可以标准化应用的运行环境,实现DevOps,应用版本快速迭代,随需弹性伸缩。另一方面,它是一种全新的技术,对云计算生态从计算、存储、网络都产生了新的技术... 查看详情

提高万恶的kpi,切忌要避开这六个低效的编程习惯

...道怎么学,迷茫ING》做了解答,还有部分,我想通过今天的这篇文章来补充下。其实我们在职场中,多多少少都会遇到很多问题,比如在某公司年会,就有员工吐槽过,怎么一天到晚都要开会,写PPT,大家都成为PPT专家却丢失了... 查看详情

pytorchlightning中的批量测试及其存在的问题

参考技术A2022-1-5,Wed.,13:37于鸢尾花基地可以采用如下方式对之前保存的预训练模型进行批量测试:然而,在上述循环中,通过trainer.test每执行一次测试,都只是执行了一个epoch的测试(也就是执行多次ptl_module.test_step和一次ptl_modul... 查看详情

java快速入门,从这六条技能开始

一、掌握静态方法和属性 静态方法和属性用于描述某一类对象群体的特征,而不是单个对象的特征。Java中大量应用了静态方法和属性,这是一个通常的技巧。但是这种技巧在很多语言中不被频繁地使用。理解静态方法和属... 查看详情

人工智能机器学习和深度学习之间的区别与联系

...)、机器学习(machinelearning)和深度学习(deeplearning)都用上了。这三者在AlphaGo击败李世乭的过程中都起了作用,但它们说的并不是一回事。 今天就用最简单的方法—&m 查看详情

手机掉了的话,这六件事我们必须得做

手机现在成了我们生活的一部分,我们出行靠它,吃饭付钱靠它,聊天靠它......,感觉我们离开了手机就不能活了。那么,要是哪天一不小心手机弄丢了怎么办呢?上面我们绑定了那么多账号和服务,网银、微信、微博、支付宝... 查看详情

业务数据全用上也喂不饱ai?试试这个小样本学习工具包

项目作者|王雅晴量子位编辑|公众号QbitAI引言机器学习在数据密集型的应用中取得了极佳的效果,但在数据集很小的场景下,多数机器学习算法的效果会严重受限[1]。在计算机视觉、自然语言处理等大领域下,从深度... 查看详情

java中所有与集合有关的实现类都是这六个接口的实现类(代码片段)

JAVA中所有与集合有关的实现类都是这六个接口的实现类。 Collection接口:集合中每一个元素为一个对象,这个接口将这些对象组织在一起,形成一维结构。 List接口代表按照元素一定的相关顺序来组织(在这个序列中顺序... 查看详情

深度学习之参数初始化——kaiming初始化

DelvingDeepintoRectifiers:SurpassingHuman-LevelPerformanceonImageNetClassificationKaimingHe,XiangyuZhang,ShaoqingRen,JianSun.ICCV2016.在介绍Xavier初始化方法的这篇博客的最后,我们提到Xavier初始化方法适用的激活函数有限:关于0对 查看详情