概述
PyTorch训练加速的17种方法
整理了几个现阶段实用的:
- torch.optim.lr_scheduler.CyclicLR 和 torch.optim.lr_scheduler.OneCycleLR. 传送门:Optim
- 当使用 torch.utils.data.DataLoader 时,设置 num_workers > 0,而不是默认值 0,同时设置
pin_memory=True
,而不是默认值 False。 传送门:DataLoader, CUDA页锁定内存, - 把 batch 调到最大的做法颇有争议。一般来说,如果在 GPU 内存允许的范围内将 batch 调到最大,你的训练速度会更快。但是,你也必须调整其他超参数,比如学习率。一个比较好用的经验是,batch 大小加倍时,学习率也要加倍。然而,使用大 batch 可能导致解决方案的泛化能力比使用小 batch 的差。
- 使用AdamW代替Adam。AdamW 是由 fast.ai 推广的一种具有权重衰减(而不是 L2 正则化)的 Adam,在 PyTorch 中以
torch.optim.AdamW
实现。Adam 和 AdamW 都能与1Cycle 策略很好地搭配 - 打开cudNN基准测试: 如果你的模型架构保持不变、输入大小保持不变,设置 torch.backends.cudnn.benchmark = True。
- 避免CPU 和 GPU 之间频繁的数据传输:tensor.cpu()代价昂贵,.item()和.numpy()也是如此,可使用
.detach()
代替;对于新创建的张量,可以使用关键字参数device=torch.device('cuda:0')
将其分配给 GPU。如果你需要传输数据,可以使用. to(non_blocking=True),【只要在传输之后没有同步点就行】 - 使用
.as_tensor()
或torch.from_numpy()
代替.tensor(), 用. tensor()转换numpy数组会复制。
以下是很有价值的进阶用法,有待仔细研究:
- 使用分布式数据并行进行多 GPU 训练:加速分布式训练可能有很多方法,但是简单的方法是使用 torch.nn.DistributedDataParallel而不是 torch.nn.DataParallel。这样一来,每个 GPU 将由一个专用的 CPU 核心驱动,避免了 DataParallel 的 GIL 问题。传送门:分布式训练文档; 使用示例
- 使用自动混合精度(AMP): PyTorch 1.6 版本包括对 PyTorch 的自动混合精度训练的本地实现。与单精度 (FP32) 相比,某些运算在半精度 (FP16) 下运行更快,而不会损失准确率。AMP 会自动决定应该以哪种精度执行哪种运算。这样既可以加快训练速度,又可以减少内存占用。
DDP和AMP示例
最后
以上就是迷路蜜粉为你收集整理的《PyTorch训练加速的17种方法》读后感的全部内容,希望文章能够帮你解决《PyTorch训练加速的17种方法》读后感所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复