Pytorch闪电的基础上深度学习管道的速度提升了10倍!
做机器学习研究的你可能经常会遇到这种问题。
就在最近,一个外国兄弟提出了一个建议:
在Pytorch闪电的基础上,深度学习管道的速度提升了10倍!
用他自己的话说,就是——爬楼梯的时候好像给你一部电梯
这么酸,怎么做。
优化机器学习管道非常重要。
无论你是在学术界还是工业界,时间和资源等各种因素往往会成为你实验的桎梏。
尤其是伴随着数据集和机器学习模型的规模越来越大,越来越复杂,使得实验耗时耗力。
加快这件事,就变得至关重要。
例如,在2012年,训练一个AlexNet需要5到6天。
如今,在更大的数据集上训练更大的图像模型只需要几分钟。
小弟认为,某种程度上,这是由于各种利器的出现。
比如Pytorch Lingtning就是其中之一。
于是,他死在了管道上,在实验循环中总结了六种闪电加速的方法。
并行数据加载。
数据加载和增强通常被认为是流水线训练的瓶颈之一。
典型的数据管道包括以下步骤:
从磁盘加载数据。
在运行过程中创建随机增强。
分批整理每个样品。
在这个过程中,可以使用多个CPU进程并行加载数据进行优化。
可是,与此同时,这个过程可以通过以下操作来加速。
1.将数据加载器中的num_workers参数设置为CPU的数量。
2.使用GPU时,将DataLoader中的pin_memory参数设置为True这可以将数据分配到页锁定内存,从而加快数据传输到GPU
使用分布式数据并行的多GPU训练。
与CPU相比,GPU大大加快了训练和推理时间。
但是有没有比GPU更好的方法呢。也许答案是:
多个GPU!
在PyTorch中,有几种范例可以用多个GPU训练您的模型。
两种常见的范例是数据并行和分布式数据并行。
小弟的方法是后者,因为他认为是一种更具扩展性的方法。
但是,在PyTorch中修改训练管道并不容易。
有必要考虑以分布式方式加载数据以及权重,梯度和指标同步的问题。
但是有了PyTorch Lightning,在多个GPU上训练PyTorch模型是非常容易的,而且是几乎不需要修改代码的那种!
混合精度
默认情况下,输入张量和模型权重以单精度定义。
可是,一些数学运算可以半精确地执行。
这样可以显著提高速度,在不牺牲模型性能的情况下,降低模型的内存带宽。
通过在PyTorch Lightning中设置混合精度标志,它将在可能的情况下自动使用半精度,同时在其他地方保留单精度。
通过最少的代码修改,模型训练的速度可以提高1.5到2倍。
提前停止法
当我们训练深度学习神经网络时,我们通常希望获得最佳的泛化性能。
可是,所有标准的深度学习神经网络结构,如全连接多层感知器,都容易过度拟合。
当网络在训练集中越来越好,错误率越来越低的时候,其实在某个时刻,它在测试集中的性能已经开始恶化了。
因此,在训练过程中增加了提前停止的方法。
具体而言,当验证损失在预设评估时间内时,停止训练。
这样既防止了过拟合现象,又能在几十个历元内找到最佳模型。
分片培训
Sharded Training基于微软的ZeRO研究和DeepSpeed库。
它的显著效果是使大模型的训练变得可扩展和容易。
否则,这些模型不适合单个GPU。
在Pytorch Lightning的1.2版本中,增加了对共享培训的支持。
虽然在哥哥的实验中,我没有看到训练时间和记忆占用有任何改善。
可是,他认为这种方法在其他实验中可能会有所帮助,尤其是在不使用单个GPU的大型模型中。
模型评估和推理的优化。
在模型评估和推理过程中,模型的正向转移不需要梯度。
因此,评估代码可以包装在torch.no_grad上下文管理器中。
这可以防止正向传输过程中的存储梯度,从而减少内存占用。
通过这种方式,可以将更大的批次输入到模型中,使评估和推理更快。
效果如何。
介绍了这么多,你一定想知道这些方法的具体功能。
为此,小哥做了一个表格,详细说明了方法的加速效果。
那么,这些方法对你做机器学习实验有帮助吗。
去试试吧~
参考链接: