设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 重新 试卷 文件
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

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

发布时间:2019-08-19 04:12 所属栏目:21 来源:读芯术
导读:https://williamfalcon.github.io/pytorch-lightning/Trainer/Training%20Loop/?source=post_page---------------------------#accumulated-gradients trainer=Trainer(accumulate_grad_batches=16) trainer.fit(mo

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位训练。

要想在Pytorch中用16位精度,先从NVIDIA中安装 apex 图书馆 并对你的模型进行这些更改。

  1. # enable 16-bit on the model and the optimizer 
  2. model, optimizers = amp.initialize(model, optimizers, opt_level='O2') 
  3.  
  4. # when doing .backward, let amp do it so it can scale the loss 
  5. with amp.scale_loss(loss, optimizer) as scaled_loss:                        
  6.     scaled_loss.backward() 

amp包会处理大部分事情。如果梯度爆炸或趋于零,它甚至会扩大loss。

在Lightning中, 使用16位很简单

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读