加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

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

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

(https://williamfalcon.github.io/pytorch-lightning/Trainer/Distributed%20training/?source=post_page---------------------------#16-bit-mixed-precision),不需对你的模型做任何修改,也不用完成上述操作。

  1. trainer = Trainer(amp_level=’O2', use_amp=False) 
  2. trainer.fit(model) 

8. 移至多GPU

现在,事情就变得有意思了。有3种(也许更多?)方式训练多GPU。

(1) 分批量训练

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

A)在每个GPU上复制模型;B)给每个GPU分配一部分批量。

第一种方法叫做分批量训练。这一策略将模型复制到每个GPU上,而每个GPU会分到该批量的一部分。

  1. # copy model on each GPU and give a fourth of the batch to each 
  2. model = DataParallel(model, devices=[0, 1, 2 ,3]) 
  3.  
  4. # out has 4 outputs (one for each gpu) 
  5. out = model(x.cuda(0)) 

在Lightning中,可以直接指示训练器增加GPU数量,而无需完成上述任何操作。

  1. # ask lightning to use 4 GPUs for training 
  2. trainer = Trainer(gpus=[0, 1, 2, 3]) 
  3. trainer.fit(model) 

(2) 分模型训练

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

将模型的不同部分分配给不同的GPU,按顺序分配批量

有时模型可能太大,内存不足以支撑。比如,带有编码器和解码器的Sequence to Sequence模型在生成输出时可能会占用20gb的内存。在这种情况下,我们希望把编码器和解码器放在单独的GPU上。

  1. # each model is sooo big we can't fit both in memory 
  2. encoder_rnn.cuda(0) 
  3. decoder_rnn.cuda(1) 
  4.  
  5. # run input through encoder on GPU 0 
  6. out = encoder_rnn(x.cuda(0)) 
  7.  
  8. # run output through decoder on the next GPU 
  9. out = decoder_rnn(x.cuda(1)) 
  10.  
  11. # normally we want to bring all outputs back to GPU 0 
  12. outout = out.cuda(0) 

对于这种类型的训练,无需将Lightning训练器分到任何GPU上。与之相反,只要把自己的模块导入正确的GPU的Lightning模块中:

  1. class MyModule(LightningModule): 
  2.  
  3. def __init__():  
  4.         self.encoder = RNN(...) 
  5.         self.decoder = RNN(...) 
  6.  
  7. def forward(x): 
  8.  
  9.     # models won't be moved after the first forward because  
  10.         # they are already on the correct GPUs 
  11.         self.encoder.cuda(0) 
  12.         self.decoder.cuda(1)      
  13.     
  14. out = self.encoder(x) 
  15.         out = self.decoder(out.cuda(1)) 
  16.  
  17. # don't pass GPUs to trainer 
  18. model = MyModule() 
  19. trainer = Trainer() 
  20. trainer.fit(model) 

(3) 混合两种训练方法

(编辑:PHP编程网 - 黄冈站长网)

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

热点阅读