用PytorchLightning的这6个技巧让深度学习流水线提速10倍面对上亿的图片数据,应该用什么方法快速进行实验呢?做机器学习研究的你可能经常会遇到这样的问题。而就在最近,一位国外小哥提出了一个建议:在Pytorchlightning的基础上,让深度学习流水线提速10倍!用他自己的话说——“爬楼梯就像给你搭了一部电梯”。怎么这么“酸”?优化机器学习管道非常重要。无论你是在学术界还是工业界,时间、资源等各种因素往往会成为你实验的桎梏。特别是随着数据集规模和机器学习模型越来越大、越来越复杂,实验变得费时费力。加快这件事变得非常重要。例如,在2012年,训练一个AlexNet需要5到6天。如今,只需几分钟即可在更大的数据集上训练更大的图像模型。这位小哥认为,从某种角度来说,这是因为各种“利器”的出现。比如PytorchLingtning就是其中之一。于是,他“死磕”管道,总结出“闪电加速”实验循环的六种方法。并行数据加载数据加载和扩充通常被认为是训练管道中的瓶颈之一。典型的数据管道包括以下步骤:从磁盘加载数据动态创建随机增强可以通过与多个CPU进程并行加载数据来优化此过程中的每个样本的批处理。但同时,你也可以通过以下方式来加速这个过程:1.将DataLoader中的num_workers参数设置为CPU的数量。2.使用GPU时,将DataLoader中的pin_memory参数设置为True。这会将数据分配到页面锁定内存中,从而加快向GPU传输数据的速度。使用分布式数据并行的多GPU训练与CPU相比,GPU大大加快了训练和推理时间。但是有没有比GPU更好的方法呢?也许答案是:多个GPU!在PyTorch中,有多种范例可以使用多个GPU训练您的模型。两个更常见的范例是“DataParallel”和“DistributedDataParallel”。小弟采用的方法是后者,因为他认为这是一种可扩展性更强的方法。但在PyTorch(和其他平台)中修改训练管道并非易事。必须考虑以分布式方式加载数据以及权重、梯度和度量的同步等问题。然而,使用PyTorchLightning,在多个GPU上训练PyTorch模型非常容易,几乎不需要修改代码!混合精度默认情况下,输入张量和模型权重以单精度(float32)定义。但是,某些数学运算可以半精度执行(float16)。这会在不牺牲模型性能的情况下显着加快速度并减少模型内存带宽。通过在PyTorchLightning中设置混合精度标志,它会在可能的情况下自动使用半精度,同时在其他地方保留单精度。通过最少的代码修改,模型训练的速度可以提高1.5到2倍。EarlyStopping我们在训练深度学习神经网络时,通常希望获得最好的泛化性能。但是所有标准的深度学习神经网络架构,例如完全连接的多层感知器,都容易出现过度拟合。当网络在训练集上的表现越来越好,错误率越来越低的时候,实际上在某个时刻,它在测试集上的表现已经开始变差了。因此在训练过程中加入了提前停止的方法(EarlyStopping)。具体来说,当验证损失达到预设的评估次数(在我的例子中是10次评估)时,停止训练。这样不仅防止了过拟合现象,而且可以在几十个epoch内找到最好的模型。ShardedTrainingShardedTraining基于微软的ZeRO研究和DeepSpeed库。它的显着效果是使训练大型模型具有可扩展性和容易性。否则,模型不适合在单个GPU上使用。在PytorchLightning1.2版本中,增加了对SharedTraining的支持。尽管在我的实验过程中,我没有看到训练时间或内存使用有任何改善。但他认为这种方法可能有助于其他实验,尤其是对于不使用单个GPU的大型模型。模型评估和推理中的优化在模型评估和推理过程中,模型的前向传递不需要梯度。因此,评估代码可以包装在torch.no_grad上下文管理器中。这可以防止在前向传播过程中存储梯度,从而减少内存占用。这允许将更大的批次输入模型,从而加快评估和推理速度。效果如何?介绍了这么多,你一定很想知道上面这些方法是如何工作的。小哥为此做了一个表格,详细说明了该方法的加速效果。那么,这些方法对做机器学习实验的你有帮助吗?去试试~
