热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

点击上方“视学算法”,选择加星标或“置顶”重磅干货,第一时间送达金磊发自凹非寺量子位报道|公众号QbitAI面对数以亿计的图片数据,到

点击上方“视学算法”,选择加"星标"或“置顶

重磅干货,第一时间送达9f9499abe1b89eda85f33f1d3298f599.png

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

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

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

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

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

5149d6017dab778a0ecebfa9fa3eb47c.gif

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

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

1c28fe12230082285ec2f487e50377db.png

优化机器学习pipeline,很重要

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

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

663952ffc664dd498513b3864c6fec7f.png

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

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

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

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

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

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

并行数据加载

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

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

  • 从磁盘加载数据

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

  • 将每个样本分批整理

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

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

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

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

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

5f187887efa12cd4de70b7bd6691638d.png

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

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

多个GPU!

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

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

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

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

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

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

1fc33a9be7caea8218a56e1dd995d0dd.png

混合精度

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

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

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

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

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

d24ef76323bb421a98cfb01609d4cdc8.png

早停法

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

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

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

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

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

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

cc22048d1de5d4edb27b29ece4eb6ee4.png

Sharded Training

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

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

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

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

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

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

91ea8a2753313a2f26b6dad53382a5c1.png

模型评估和推理中的优化

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

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

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

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

效果如何?

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

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

06962539d8c64ce2623847ed0cf31f87.png

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

快去试试吧~

参考链接:

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

本文系网易新闻•网易号特色内容激励计划签约账号【量子位】原创内容,未经账号授权,禁止随意转载。cc3c29ae0fa85d8b3b317524286e2fb0.png

outside_default.png

点个在看 paper不断!



推荐阅读
  • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
    本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了PhysioNet网站提供的生理信号处理工具箱WFDB Toolbox for Matlab的安装和使用方法。通过下载并添加到Matlab路径中或直接在Matlab中输入相关内容,即可完成安装。该工具箱提供了一系列函数,可以方便地处理生理信号数据。详细的安装和使用方法可以参考本文内容。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • 通过Anaconda安装tensorflow,并安装运行spyder编译器的完整教程
    本文提供了一个完整的教程,介绍了如何通过Anaconda安装tensorflow,并安装运行spyder编译器。文章详细介绍了安装Anaconda、创建tensorflow环境、安装GPU版本tensorflow、安装和运行Spyder编译器以及安装OpenCV等步骤。该教程适用于Windows 8操作系统,并提供了相关的网址供参考。通过本教程,读者可以轻松地安装和配置tensorflow环境,以及运行spyder编译器进行开发。 ... [详细]
  • 云原生应用最佳开发实践之十二原则(12factor)
    目录简介一、基准代码二、依赖三、配置四、后端配置五、构建、发布、运行六、进程七、端口绑定八、并发九、易处理十、开发与线上环境等价十一、日志十二、进程管理当 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
  • {moduleinfo:{card_count:[{count_phone:1,count:1}],search_count:[{count_phone:4 ... [详细]
  • 像跟踪分布式服务调用那样跟踪Go函数调用链 | Gopher Daily (2020.12.07) ʕ◔ϖ◔ʔ
    每日一谚:“Acacheisjustamemoryleakyouhaven’tmetyet.”—Mr.RogersGo技术专栏“改善Go语⾔编程质量的50个有效实践” ... [详细]
  • Android图形架构学习笔记(待修改)
    以下简单总结来自Android官网,稍作总结:https:source.android.google.cndevicesgraphics概览Andr ... [详细]
author-avatar
风中的百合香迷人
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有