加入收藏 | 设为首页 | 会员中心 | 我要投稿 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/Training%20Loop/?source=post_page---------------------------#accumulated-gradients

  1. trainer = Trainer(accumulate_grad_batches=16) 
  2. trainer.fit(model) 

5. 保留计算图

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

撑爆内存很简单,只要不释放指向计算图形的指针,比如……为记录日志保存loss。

  1. losses = [] 
  2.  
  3. ... 
  4. losses.append(loss) 
  5.  
  6. print(f'current loss: {torch.mean(losses)'}) 

上述的问题在于,loss仍然有一个图形副本。在这种情况中,可用.item()来释放它。

  1. # bad 
  2. losses.append(loss) 
  3.  
  4. # good 
  5. losses.append(loss.item()) 

Lightning会特别注意,让其无法保留图形副本 (示例:

https://github.com/williamFalcon/pytorch-lightning/blob/master/pytorch_lightning/models/trainer.py?source=post_page---------------------------#L767-L768)

6. 单GPU训练

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

一旦完成了前面的步骤,就可以进入GPU训练了。GPU的训练将对许多GPU核心上的数学计算进行并行处理。能加速多少取决于使用的GPU类型。个人使用的话,推荐使用2080Ti,公司使用的话可用V100。

刚开始你可能会觉得压力很大,但其实只需做两件事: 1)将你的模型移动到GPU上,2)在用其运行数据时,把数据导至GPU中。

  1. # put model on GPU 
  2. model.cuda(0) 
  3.  
  4. # put data on gpu (cuda on a variable returns a cuda copy) 
  5. xx = x.cuda(0) 
  6.  
  7. # runs on GPU now 
  8. model(x) 

如果使用Lightning,则不需要对代码做任何操作。只需设置标记

(https://williamfalcon.github.io/pytorch-lightning/Trainer/Distributed%20training/?source=post_page---------------------------#single-gpu):

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

在GPU进行训练时,要注意限制CPU和GPU之间的传输量。

  1. # expensive 
  2. xx = x.cuda(0) 
  3.  
  4. # very expensive 
  5. xx = x.cpu() 
  6. xx = x.cuda(0) 

例如,如果耗尽了内存,不要为了省内存,将数据移回CPU。尝试用其他方式优化代码,或者在用这种方法之前先跨GPUs分配代码。

此外还要注意进行强制GPUs同步的操作。例如清除内存缓存。

  1. # really bad idea.Stops all the GPUs until they all catch up 
  2. torch.cuda.empty_cache() 

但是如果使用Lightning,那么只有在定义Lightning模块时可能会出现这种问题。Lightning特别注意避免此类错误。

7. 16位精度

16位精度可以有效地削减一半的内存占用。大多数模型都是用32位精度数进行训练的。然而最近的研究发现,使用16位精度,模型也可以很好地工作。混合精度指的是,用16位训练一些特定的模型,而权值类的用32位训练。

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

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

热点阅读