位置: IT常识 - 正文

让PyTorch训练速度更快,你需要掌握这17种方法(pytorch训练yolov3)

编辑:rootadmin
让PyTorch训练速度更快,你需要掌握这17种方法

推荐整理分享让PyTorch训练速度更快,你需要掌握这17种方法(pytorch训练yolov3),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:pytorch训练太慢,pytorch训练慢,pytorch训练函数,pytorch训练太慢,pytorch训练速度,pytorch训练速度,pytorch训练进度条,pytorch训练太慢,内容如对您有帮助,希望把文章链接给更多的朋友!

掌握这 17 种方法,用最省力的方式,加速你的 Pytorch 深度学习训练。

近日,Reddit 上一个帖子热度爆表。主题内容是关于怎样加速 PyTorch 训练。原文作者是来自苏黎世联邦理工学院的计算机科学硕士生 LORENZ KUHN,文章向我们介绍了在使用 PyTorch 训练深度模型时最省力、最有效的 17 种方法。

该文所提方法,都是假设你在 GPU 环境下训练模型。具体内容如下。

17 种加速 PyTorch 训练的方法

1. 考虑换一种学习率 schedule

学习率 schedule 的选择对模型的收敛速度和泛化能力有很大的影响。Leslie N. Smith 等人在论文《Cyclical Learning Rates for Training Neural Networks》、《Super-Convergence: Very Fast Training of Neural Networks Using Large Learning Rates 》中提出了周期性(Cyclical)学习率以及 1Cycle 学习率 schedule。之后,fast.ai 的 Jeremy Howard 和 Sylvain Gugger 对其进行了推广。下图是 1Cycle 学习率 schedule 的图示:

Sylvain 写到:1Cycle 包括两个等长的步幅,一个步幅是从较低的学习率到较高的学习率,另一个是回到最低水平。最大值来自学习率查找器选取的值,较小的值可以低十倍。然后,这个周期的长度应该略小于总的 epochs 数,并且,在训练的最后阶段,我们应该允许学习率比最小值小几个数量级。

与传统的学习率 schedule 相比,在最好的情况下,该 schedule 实现了巨大的加速(Smith 称之为超级收敛)。例如,使用 1Cycle 策略在 ImageNet 数据集上训练 ResNet-56,训练迭代次数减少为原来的 1/10,但模型性能仍能比肩原论文中的水平。在常见的体系架构和优化器中,这种 schedule 似乎表现得很好。

Pytorch 已经实现了这两种方法:「torch.optim.lr_scheduler.CyclicLR」和「torch.optim.lr_scheduler.OneCycleLR」。

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

2. 在 DataLoader 中使用多个 worker 和页锁定内存

当使用 torch.utils.data.DataLoader 时,设置 num_workers > 0,而不是默认值 0,同时设置 pin_memory=True,而不是默认值 False。

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

来自 NVIDIA 的高级 CUDA 深度学习算法软件工程师 Szymon Micacz 就曾使用四个 worker 和页锁定内存(pinned memory)在单个 epoch 中实现了 2 倍的加速。人们选择 worker 数量的经验法则是将其设置为可用 GPU 数量的四倍,大于或小于这个数都会降低训练速度。请注意,增加 num_workers 将增加 CPU 内存消耗。

3. 把 batch 调到最大

把 batch 调到最大是一个颇有争议的观点。一般来说,如果在 GPU 内存允许的范围内将 batch 调到最大,你的训练速度会更快。但是,你也必须调整其他超参数,比如学习率。一个比较好用的经验是,batch 大小加倍时,学习率也要加倍。

OpenAI 的论文《An Empirical Model of Large-Batch Training》很好地论证了不同的 batch 大小需要多少步才能收敛。在《How to get 4x speedup and better generalization using the right batch size》一文中,作者 Daniel Huynh 使用不同的 batch 大小进行了一些实验(也使用上面讨论的 1Cycle 策略)。最终,他将 batch 大小由 64 增加到 512,实现了 4 倍的加速。

然而,使用大 batch 的不足是,这可能导致解决方案的泛化能力比使用小 batch 的差。

4. 使用自动混合精度(AMP)

PyTorch 1.6 版本包括对 PyTorch 的自动混合精度训练的本地实现。这里想说的是,与单精度 (FP32) 相比,某些运算在半精度 (FP16) 下运行更快,而不会损失准确率。AMP 会自动决定应该以哪种精度执行哪种运算。这样既可以加快训练速度,又可以减少内存占用。

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

import torch# Creates once at the beginning of trainingscaler = torch.cuda.amp.GradScaler()for data, label in data_iter:optimizer.zero_grad()# Casts operations to mixed precisionwith torch.cuda.amp.autocast():loss = model(data)# Scales the loss, and calls backward()# to create scaled gradientsscaler.scale(loss).backward()# Unscales gradients and calls# or skips optimizer.step()scaler.step(optimizer)# Updates the scale for next iterationscaler.update()

5. 考虑使用另一种优化器

AdamW 是由 fast.ai 推广的一种具有权重衰减(而不是 L2 正则化)的 Adam,在 PyTorch 中以 torch.optim.AdamW 实现。AdamW 似乎在误差和训练时间上都一直优于 Adam。

Adam 和 AdamW 都能与上面提到的 1Cycle 策略很好地搭配。

目前,还有一些非本地优化器也引起了很大的关注,最突出的是 LARS 和 LAMB。NVIDA 的 APEX 实现了一些常见优化器的融合版本,比如 Adam。与 PyTorch 中的 Adam 实现相比,这种实现避免了与 GPU 内存之间的多次传递,速度提高了 5%。

6. cudNN 基准

如果你的模型架构保持不变、输入大小保持不变,设置 torch.backends.cudnn.benchmark = True。

7. 小心 CPU 和 GPU 之间频繁的数据传输

让PyTorch训练速度更快,你需要掌握这17种方法(pytorch训练yolov3)

当频繁地使用 tensor.cpu() 将张量从 GPU 转到 CPU(或使用 tensor.cuda() 将张量从 CPU 转到 GPU)时,代价是非常昂贵的。item() 和 .numpy() 也是一样可以使用. detach() 代替。

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

如果你需要传输数据,可以使用. to(non_blocking=True),只要在传输之后没有同步点。

8. 使用梯度 / 激活 checkpointing

Checkpointing 的工作原理是用计算换内存,并不存储整个计算图的所有中间激活用于 backward pass,而是重新计算这些激活。我们可以将其应用于模型的任何部分。

具体来说,在 forward pass 中,function 会以 torch.no_grad() 方式运行,不存储中间激活。相反的是, forward pass 中会保存输入元组以及 function 参数。在 backward pass 中,输入和 function 会被检索,并再次在 function 上计算 forward pass。然后跟踪中间激活,使用这些激活值计算梯度。

因此,虽然这可能会略微增加给定 batch 大小的运行时间,但会显著减少内存占用。这反过来又将允许进一步增加所使用的 batch 大小,从而提高 GPU 的利用率。

尽管 checkpointing 以 torch.utils.checkpoint 方式实现,但仍需要一些思考和努力来正确地实现。Priya Goyal 写了一个很好的教程来介绍 checkpointing 关键方面。

Priya Goyal 教程地址:

https://github.com/prigoyal/pytorch_memonger/blob/master/tutorial/Checkpointing_for_PyTorch_models.ipynb

9. 使用梯度积累

增加 batch 大小的另一种方法是在调用 optimizer.step() 之前在多个. backward() 传递中累积梯度。

Hugging Face 的 Thomas Wolf 的文章《Training Neural Nets on Larger Batches: Practical Tips for 1-GPU, Multi-GPU & Distributed setups》介绍了如何使用梯度累积。梯度累积可以通过如下方式实现:

model.zero_grad() # Reset gradients tensorsfor i, (inputs, labels) in enumerate(training_set):predictions = model(inputs) # Forward passloss = loss_function(predictions, labels) # Compute loss functionloss = loss / accumulation_steps # Normalize our loss (if averaged)loss.backward() # Backward passif (i+1) % accumulation_steps == 0: # Wait for several backward stepsoptimizer.step() # Now we can do an optimizer stepmodel.zero_grad() # Reset gradients tensorsif (i+1) % evaluation_steps == 0: # Evaluate the model when we...evaluate_model() # ...have no gradients accumulate

这个方法主要是为了规避 GPU 内存的限制而开发的。

10. 使用分布式数据并行进行多 GPU 训练

加速分布式训练可能有很多方法,但是简单的方法是使用 torch.nn.DistributedDataParallel 而不是 torch.nn.DataParallel。这样一来,每个 GPU 将由一个专用的 CPU 核心驱动,避免了 DataParallel 的 GIL 问题。

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

11. 设置梯度为 None 而不是 0

梯度设置为. zero_grad(set_to_none=True) 而不是 .zero_grad()。这样做可以让内存分配器处理梯度,而不是将它们设置为 0。正如文档中所说,将梯度设置为 None 会产生适度的加速,但不要期待奇迹出现。注意,这样做也有缺点,详细信息请查看文档。

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

12. 使用. as_tensor() 而不是. tensor()

torch.tensor() 总是会复制数据。如果你要转换一个 numpy 数组,使用 torch.as_tensor() 或 torch.from_numpy() 来避免复制数据。

13. 必要时打开调试工具

PyTorch 提供了很多调试工具,例如 autograd.profiler、autograd.grad_check、autograd.anomaly_detection。请确保当你需要调试时再打开调试器,不需要时要及时关掉,因为调试器会降低你的训练速度。

14. 使用梯度裁剪

关于避免 RNN 中的梯度爆炸的问题,已经有一些实验和理论证实,梯度裁剪(gradient = min(gradient, threshold))可以加速收敛。HuggingFace 的 Transformer 实现就是一个非常清晰的例子,说明了如何使用梯度裁剪。本文中提到的其他一些方法,如 AMP 也可以用。

在 PyTorch 中可以使用 torch.nn.utils.clip_grad_norm_来实现。

15. 在 BatchNorm 之前关闭 bias

在开始 BatchNormalization 层之前关闭 bias 层。对于一个 2-D 卷积层,可以将 bias 关键字设置为 False:torch.nn.Conv2d(..., bias=False, ...)。

16. 在验证期间关闭梯度计算

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

17. 使用输入和 batch 归一化

要再三检查一下输入是否归一化?是否使用了 batch 归一化?

本文链接地址:https://www.jiuchutong.com/zhishi/297894.html 转载请保留说明!

上一篇:Redis的两种持久化方案 RDB & AOF(redis两种持久化方式的优缺点)

下一篇:【蓝牙系列】蓝牙5.4到底更新了什么(2)(蓝牙11)

  • 联想小新air14 2021款多少寸(联想小新air14 2020)

    联想小新air14 2021款多少寸(联想小新air14 2020)

  • 华为mate40的处理器是什么(华为mate40的处理器)

    华为mate40的处理器是什么(华为mate40的处理器)

  • 苹果12无线充电多少w(苹果12无线充电怎么用不了)

    苹果12无线充电多少w(苹果12无线充电怎么用不了)

  • 小米9se有没有红外线功能(小米9se有没有红外发射器)

    小米9se有没有红外线功能(小米9se有没有红外发射器)

  • 闲鱼可以退货吗(闲鱼可以退货吗没签收)

    闲鱼可以退货吗(闲鱼可以退货吗没签收)

  • 微信领红包提醒怎么删除(微信领红包提醒怎么关闭)

    微信领红包提醒怎么删除(微信领红包提醒怎么关闭)

  • 网桥工作在osi的哪一层(网桥工作在互联网络的什么层)

    网桥工作在osi的哪一层(网桥工作在互联网络的什么层)

  • 电脑腾讯会议听不到主持人声音(电脑腾讯会议听不到别人声音)

    电脑腾讯会议听不到主持人声音(电脑腾讯会议听不到别人声音)

  • 手机qq咋关闭所在地(手机qq咋关闭所有的消息)

    手机qq咋关闭所在地(手机qq咋关闭所有的消息)

  • ipad pencil充电多久(apple pencil用ipad充电多久能充满)

    ipad pencil充电多久(apple pencil用ipad充电多久能充满)

  • qq注销后会被别人注册吗(qq注销后会被别人登录吗)

    qq注销后会被别人注册吗(qq注销后会被别人登录吗)

  • e51650v2相当于什么cpu(e51650v2相当于什么水平)

    e51650v2相当于什么cpu(e51650v2相当于什么水平)

  • ipad2018怎么扩展内存(ipad air扩展)

    ipad2018怎么扩展内存(ipad air扩展)

  • hryal00t是什么型号(hryal00是什么型号)

    hryal00t是什么型号(hryal00是什么型号)

  • 快手不上热门跟号有关系吗(快手不热门跟WiF有关系吗)

    快手不上热门跟号有关系吗(快手不热门跟WiF有关系吗)

  • iphone7掉水里了影响吗(iphone7掉水里了应该怎么处理)

    iphone7掉水里了影响吗(iphone7掉水里了应该怎么处理)

  • 视频跟照片怎么一起拼(视频跟照片怎么压缩)

    视频跟照片怎么一起拼(视频跟照片怎么压缩)

  • 苹果11手机有必要贴镜头膜吗(苹果11手机有必要换13pro吗)

    苹果11手机有必要贴镜头膜吗(苹果11手机有必要换13pro吗)

  • 华为手机扰码在哪里(华为手机扰码是什么意思)

    华为手机扰码在哪里(华为手机扰码是什么意思)

  • 苹果app购买怎么关闭(苹果APP购买怎么付款)

    苹果app购买怎么关闭(苹果APP购买怎么付款)

  • 安居客怎么注销经纪人账号(安居客怎么注销手机号)

    安居客怎么注销经纪人账号(安居客怎么注销手机号)

  • 电脑存储空间不足怎么办(电脑存储空间不够买什么硬盘)

    电脑存储空间不足怎么办(电脑存储空间不够买什么硬盘)

  • 苹果8快充伤电池吗(苹果8手机快充伤电池吗)

    苹果8快充伤电池吗(苹果8手机快充伤电池吗)

  • 3865u处理器是第几代(386 处理器)

    3865u处理器是第几代(386 处理器)

  • 【控制】自适应控制基本概念(什么叫自适应控制)

    【控制】自适应控制基本概念(什么叫自适应控制)

  • 哪些情况可免征增值税
  • 天然气管道维修收费标准
  • 摄影服务属于哪个开票类目
  • 资产负债表月报期末余额怎么填
  • 现金日记账承前页过次页
  • 固定资产投资会计处理
  • 深圳重工业企业有哪些
  • 保险中介的保险可以买吗
  • 其他综合收益不能重分类进损益的有哪些
  • 汇兑损益需要缴税吗
  • 门店活动经费计入什么
  • 预付房租收到发票后如何做账
  • 人力资源劳务费发票税率
  • 计入在建的工资会计科目
  • 什么费用需要进行摊销
  • 去税务局税种认定需要带什么资料
  • 股权转让需要什么资料
  • 小规模未开票收入要交增值税吗
  • 员工罚款可以从工资里扣吗
  • 个人装修可以开发票吗?
  • 劳动报酬个人所得税由扣缴义务人预扣预缴
  • 什么是短期借款利率
  • 如何设置老板键
  • 只有土地使用权房子拆了怎么办
  • macos big sur怎么升级
  • 核定征收的企业利润怎么处理
  • 所得税和应交所得税
  • 黑马程序员前端工程师简历
  • php日期时间函数
  • thinkphp i方法
  • 收到国税退回的发票
  • 代理业务怎么记账
  • 哪些情况进项税不可以抵扣?
  • 社保退回的款怎么继承
  • 购买的优惠卷到期后退款
  • 结转成本计入
  • 经营性现金流量为什么要加上折旧
  • 民间非营利组织会计制度
  • 增值税进项税销项税月末需要结转吗
  • 年度亏损计提所得税吗
  • 实收资本实务处理办法
  • 材料成本差异会计处理
  • 预付工程款该怎么记账
  • 机场员工家属机票
  • 存货取得长期股权投资
  • 债券溢价摊销有什么影响
  • 没签劳动合同的后果
  • 公司给员工结婚红包
  • 公司变更名字后,公账怎么办
  • 职工医保门诊一年报销多少钱
  • 一般纳税人外购货物发生非正常损失,不包括
  • 坏账确认方法有哪些?
  • 生产成本工时怎么算
  • 出纳需要遵循的原则
  • 买断式转贴现业务目的一般为
  • 哪些发票必须注销
  • 如何搭建mybatis
  • 关于sql的几道小知识
  • sql server数据库监控
  • ssh debian
  • 电脑游戏战争策略游戏
  • linux日期与时间
  • CentOS 6.x 到 CentOS 7 的升级过程
  • lowleverfatal error怎么解决
  • win7桌面右下角
  • 如何将windows 10
  • win10无法启动diagnostic policy service
  • json对象如何取值
  • JavaScript中的变量名不区分大小写
  • bat判断变量的值
  • 怎么用node.js写接口
  • nodejs readfile
  • jquery easyui插件
  • Unity for Absolute Beginners(二)
  • java 把对象存到数据库
  • 河北省国家税务局电子税务局
  • 二手车公司如何运营
  • 财税招商专员是做什么的
  • 税务登记表格怎么填写
  • 个体如何申请税收优惠
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设