设为首页 - 加入收藏 潍坊站长网 (http://www.0536zz.com)- 国内知名站长资讯网站,提供最新最全的站长资讯,创业经验,网站建设等!
热搜: 用的 故障
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

代码详解:用Pytorch训练快速神经网络的9个技巧

发布时间:2019-08-19 11:57 所属栏目:[优化] 来源:读芯术
导读:事实上,你的模型可能还停留在石器时代的水平。估计你还在用32位精度或*GASP(一般活动仿真语言)*训练,甚至可能只在单GPU上训练。如果市面上有99个加速指南,但你可能只看过1个?(没错,就是这样)。但这份终极指南,会一步步教你清除模型中所有的(GP模型)。

事实上,你的模型可能还停留在石器时代的水平。估计你还在用32位精度或*GASP(一般活动仿真语言)*训练,甚至可能只在单GPU上训练。如果市面上有99个加速指南,但你可能只看过1个?(没错,就是这样)。但这份终极指南,会一步步教你清除模型中所有的(GP模型)。

代码详解:用Pytorch训练快速神经网络的9个技巧

这份指南的介绍从简单到复杂,一直介绍到你可以完成的大多数PITA修改,以充分利用你的网络。例子中会包括一些Pytorch代码和相关标记,可以在 Pytorch-Lightning训练器中用,以防大家不想自己敲码!

这份指南针对的是谁? 任何用Pytorch研究非琐碎的深度学习模型的人,比如工业研究人员、博士生、学者等等……这些模型可能要花费几天,甚至几周、几个月的时间来训练。

指南(从易到难)

  • 使用DataLoader。
  • DataLoader中的进程数。
  • 批尺寸。
  • 累积梯度。
  • 保留计算图。
  • 转至单GPU。
  • 16位混合精度训练。
  • 转至多GPU(模型复制)。
  • 转至多GPU节点(8+GPUs)。
  • 有关模型加速的思考和技巧

Pytorch-Lightning

代码详解:用Pytorch训练快速神经网络的9个技巧

文中讨论的各种优化,都可以在名为Pytorch-Lightning

(https://github.com/williamFalcon/pytorch-lightning?source=post_page) 的Pytorch图书馆中找到。

Lightning是基于Pytorch的一个光包装器,它可以帮助研究人员自动训练模型,但关键的模型部件还是由研究人员完全控制。

参照此篇教程,获得更有力的范例

(https://github.com/williamFalcon/pytorch-lightning/blob/master/examples/new_project_templates/single_gpu_node_template.py?source=post_page)。

Lightning采用最新、最尖端的方法,将犯错的可能性降到最低。

MNIST定义的Lightning模型

(https://github.com/williamFalcon/pytorch-lightning/blob/master/examples/new_project_templates/lightning_module_template.py?source=post_page),可适用于训练器。

  1. from?pytorch-lightning?import?Trainer?
  2. ?
  3. model?=?LightningModule(…)?
  4. trainer?=?Trainer()?
  5. ?
  6. trainer.fit(model)?

1. DataLoader

代码详解:用Pytorch训练快速神经网络的9个技巧

这可能是最容易提速的地方。靠保存h5py或numpy文件来加速数据加载的日子已经一去不复返了。用 Pytorch dataloader

(https://pytorch.org/tutorials/beginner/data_loading_tutorial.html?source=post_page)加载图像数据非常简单。(关于NLP数据,请参照TorchText:

https://torchtext.readthedocs.io/en/latest/datasets.html?source=post_page)

  1. dataset?=?MNIST(root=self.hparams.data_root,?traintrain=train,?download=True)?
  2. ?
  3. loader?=?DataLoader(dataset,?batch_size=32,?shuffle=True)?
  4. ?
  5. for?batch?in?loader:??
  6. ??x,?y?=?batch?
  7. ??model.training_step(x,?y)?
  8. ??...?

在Lightning中,你无需指定一个训练循环,只需定义dataLoaders,训练器便会在 需要时调用它们

(https://github.com/williamFalcon/pytorch-lightning/blob/master/examples/new_project_templates/lightning_module_template.py?source=post_page---------------------------#L163-L217)。

2. DataLoaders中的进程数

代码详解:用Pytorch训练快速神经网络的9个技巧

加快速度的第二个秘诀在于允许批量并行加载。所以,你可以一次加载许多批量,而不是一次加载一个。

  1. #?slow?
  2. loader?=?DataLoader(dataset,?batch_size=32,?shuffle=True)?
  3. ?
  4. #?fast?(use?10?workers)?
  5. loader?=?DataLoader(dataset,?batch_size=32,?shuffle=True,?num_workers=10)?

3. 批量大小(Batch size)

在开始下一步优化步骤之前,将批量大小调高到CPU内存或GPU内存允许的最大值。

接下来的部分将着重于减少内存占用,这样就可以继续增加批尺寸。

记住,你很可能需要再次更新学习率。如果将批尺寸增加一倍,最好将学习速度也提高一倍。

4. 累积梯度

代码详解:用Pytorch训练快速神经网络的9个技巧

假如已经最大限度地使用了计算资源,而批尺寸仍然太低(假设为8),那我们则需为梯度下降模拟更大的批尺寸,以供精准估计。

假设想让批尺寸达到128。然后,在执行单个优化器步骤前,将执行16次前向和后向传播(批量大小为8)。

  1. #?clear?last?step?
  2. optimizer.zero_grad()?
  3. ?
  4. #?16?accumulated?gradient?steps?
  5. scaled_loss?=?0?
  6. for?accumulated_step_i?in?range(16):??
  7. ?????out?=?model.forward()?
  8. ?????loss?=?some_loss(out,y)?????
  9. ?????loss.backward()??????
  10. ?
  11. ???????scaled_loss?+=?loss.item()?
  12. ?
  13. #?update?weights?after?8?steps.?effective?batch?=?8*16?
  14. optimizer.step()?
  15. ?
  16. #?loss?is?now?scaled?up?by?the?number?of?accumulated?batches?
  17. actual_loss?=?scaled_loss?/?16?

而在Lightning中,这些已经自动执行了。只需设置标记:

【免责声明】本站内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

网友评论
推荐文章