当前位置: 首页 > 网络应用技术

Pytorch |17种优化神经网络训练的方法

时间:2023-03-07 12:59:42 网络应用技术

  学习率时间表的选择对模型的收敛速度和概括能力有很大的影响。在Fast.ai的Jeremy Howard和Sylvain Gugger之后。

  Sylvain写道:1循环包括两个同等步伐,一个是从较低的学习率到更高的学习率,另一个是返回最低水平。最大值来自学习率搜索者选择的值,较小的值值可能低十倍。然后,该周期的长度应略小于时期总数,在训练的最后阶段,我们应该允许学习率比最小值高几个。与传统的学习率计划相比,在最好的情况下,时间表达到了巨大的加速度(史密斯称为超级融合)。对于原始的1/10,但仍然可以将模型性能与肩膀基纸的水平进行比较。在常见的体系结构和优化器中,此时间表似乎表现出色。

  Pytorch实施了这两种方法:“ torch.optim.lr_scheduler.cliclr”和“ torch.optim.lr_scheduler.oneclelrr”。

  参考文档:https://pytorch.org/docs/stable/optim.html

  使用torch.utils.data.dataloader时,设置num_workers> 0而不是默认值0,并设置pin_memory = true而不是默认值。

  参考文档:https://pytorch.org/docs/stable/data.html

  Szymon Micacz是NVIDIA的高端CUDA深度学习算法软件工程师,使用了四名工人和页面锁定记忆(固定记忆)在一个时代加速。选择工人数量的体验是将其设置为四倍,是四倍。GPU的数量。大量或小于此数字将降低训练速度。请注意,添加num_worker将增加CPU内存消耗。

  将批量转换为最大值是一个非常有争议的点。从总体上讲,如果将批次调整为GPU内存范围内的最大值,训练速度将更快。但是,您还必须调整其他超级课程,例如学习价格。更好的经验是,当批次加倍时,学习率必须加倍。

  Openai的论文“大批量培训的经验模型”证明了不同批次大小需要多少步骤。不同的批量大小以执行一些实验(还使用上面讨论的1循环策略)。

  最后,他将批次的大小从64增加到512,达到了四倍的加速度。但是,使用大批的使用不足是,这可能会导致溶液的能力差,而不是使用小批次。

  Pytorch版本1.6包括Pytorch的自动混合培训的本地实现。我想在这里说,与单个精度(FP32)相比,某些操作的准确性更快(FP16),而无需损失的准确性。AMP会自动决定应该通过哪种准确性来执行哪些精度,这可以加快训练速度并降低记忆占用。

  在最好的情况下,AMP的使用如下:

  Adamw是一种Adam,由Fast.ai推广,它具有沉重的衰减(不是L2正则化),并且在Pytorch中使用Torch.optim.adamw.adamw实现

  似乎错误和训练时间总是比亚当更好。

  目前,一些非本地优化器引起了极大的关注。最突出的是Lars和Lamb.NVIDA的Apex实现了某些常见优化器的融合版本,例如Adam.com在Pytorch中实现了Adam实现,此实现避免了使用GPU内存的多次传输,GPU内存增加了5%。

  如果您的模型体系结构保持不变,并且输入大小保持不变,请设置torch.backends.cudnnnchmark = true。

  当使用Tensor.cpu()将张量从GPU传递到CPU(或使用Tensor.cuda())将张量从CPU传递到GPU)时,价格非常昂贵。Numpy()也可以使用。取代()。

  如果创建新的张量,则可以使用关键字参数设备= torch.device(cuda:0)将其分配给GPU。

  如果您需要传输数据,则可以使用。到(non_blocking = true),只要传输后没有同步点即可。

  检查点的工作原理是使用计算来替换内存。它不会存储向后通的整个计算图的所有中间激活,而是重新计算这些激活。我们可以将其应用于模型的任何部分。

  具体而言,在正向通行中,函数以torch.no_grad()方式运行,而无需存储中间激活。相反,输入配额和函数参数将保存在正向通行中。然后再次在函数上计算正向通行。然后遵循中间激活并使用这些激活值来计算梯度。

  因此,尽管这可能会稍微增加给定批处理的运行时间,但它将大大减少记忆职业。在转弯时,这将允许进一步增加批次的大小,从而增加GPU的利用率。

  尽管在torch.utils.checkpoint中实现了检查点,但仍需要正确实施一些思维和努力工作。

  Priya Goyal教程地址:https://github.com/prigoyal/pytorch_memonger/blob/master/master/tutorial/checkpointing_for_pytors.ipynb

  增加批量大小的另一种方法是将梯度积累多个。在调用Optimizer.Step()之前向后()。

  拥抱Face的托马斯·沃尔夫(Thomas Wolf)的文章“培训大批培训神经网:1-GPU,Multi-GPU和分布式设置的实用技巧介绍了如何累积梯度的方式。可以按照以下方式实施梯度积累:

  此方法主要是为了避免GPU内存的限制。

  可能有很多方法可以加速分布式培训,但是简单的方法是使用torch.nn.distributemdataparallel而不是torch.nn.dataparallear.ind.in.在这种方式上,每个GPU都会由专用的CPU核心驱动,以避免避免使用的GIL问题DataPapAparallear。

  分布式培训文档地址:https://pytorch.org/tutorials/beginner/dist_overview.html

  将梯度集设置为。ZERO_GRAD(set_to_none = true)而不是.zero_grad()。这允许内存分配来处理梯度,而不是将它们设置为0.正如文档中所述,将梯度设置为none会产生中等加速度,但不要期望一个奇迹注意到这样做有缺点。有关详细信息,请检查文档。

  文档地址:https://pytorch.org/docs/stable/optim.html

  TORCH.TENSOR()始终复制数据。如果要转换一个numpy数组,请使用torch.as_tensor()或torch.from_numpy()避免复制数据。

  Pytorch提供了许多调试工具,例如Autograph..profiler,Aptraph.grad_check,Aptograph.anomaly_detection.please.please请确保在需要调试时打开调试器,如果您不需要的话,请将其关闭,并将其关闭。,因为调试器将降低您的训练速度。

  关于避免RNN中梯度爆炸的问题,一些实验和理论确认已被证实,梯度切割(梯度= min(梯度,阈值))可以加速收敛。HuggingFaceFransfce的实施是一个非常明显的示例,说明了如何使用梯度切割的示例本文中提到的其他方法也可以使用。

  它可以使用torch.nn.utils.clip_grad_norm_在pytorch中实现。

  在启动批次统一层之前关闭偏置层。对于2-D卷积层,偏置关键字可以设置为false:torch.nn.conv2d(...,bilias = false,...)。

  在验证期间关闭梯度计算,设置:torch.no_grad()。

  检查输入是否一次又一次返回?您是否使用批处理Ingel?

  原始链接:https://efficitydl.com/faster-deep-rearning-pytorch-a-n