Pytorch闪电的基础上深度学习管道的速度提升了10倍!

2021-10-02 15:48:46 IT之家
imgad2

做机器学习研究的你可能经常会遇到这种问题。

就在最近,一个外国兄弟提出了一个建议:

在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上下文管理器中。

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

通过这种方式,可以将更大的批次输入到模型中,使评估和推理更快。

效果如何。

介绍了这么多,你一定想知道这些方法的具体功能。

为此,小哥做了一个表格,详细说明了方法的加速效果。

那么,这些方法对你做机器学习实验有帮助吗。

去试试吧~

参考链接: