加入收藏 | 设为首页 | 会员中心 | 我要投稿 衡阳站长网 (https://www.0734zz.cn/)- 数据集成、设备管理、备份、数据加密、智能搜索!
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

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

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

事实上,你的模型可能还停留在石器时代的水平。估计你还在用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中,这些已经自动执行了。只需设置标记:

(编辑:衡阳站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读