09月26, 2020

Pytorch训练技巧汇总

pytorch的训练过程有一些固定的模式和技巧,当没有遵守时会出现一些奇怪的问题,本文对工业实践中容易犯的错误进行汇总。

问题一:Pytorch 训练迭代几个batch后梯度没有下降

在每个batch的训练过程中,都必须完成下面的梯度更新步骤: 1、通过网络结构计算logit和loss 2、对loss计算所有输入变量的梯度 3、使用optimizer更新变量的梯度 4、更新scheduler的参数 5、梯度重置为0

如果缺少任意步骤,梯度不会更新,并且损失也不会下降; 具体代码如下:

loss = loss_calc(output, trg)
loss.backward()            
torch.nn.utils.clip_grad_norm_(model.parameters(), args.max_grad_norm)

optimizer.step()
scheduler.step()
model.zero_grad()

问题二: 训练中随着step增加,内存占用也持续增加

通常,在训练过程中,我们都是将 loss 的添加到一个 list 里保存。记住在保存前,先 detach,然后仅使用其数值。否则,你添加的就不仅仅是 loss,而是整个计算图

正确用法:

loss = F.mse_loss(prd, true)
epoch_loss += loss.detach().item()
training_log.append(epoch_loss)

错误用法:

loss = F.mse_loss(prd, true)
epoch_loss += loss
training_log.append(epoch_loss)

问题三:有没有训练和评估过程的高层封装模块

Lightning automates 40+ parts of DL/ML research

  • GPU training
  • Distributed GPU (cluster) training
  • TPU training
  • EarlyStopping
  • Logging/Visualizing
  • Checkpointing
  • Experiment management
  • Full list here

本文链接:http://57km.cc/post/Pytorch training tricks.html

-- EOF --

Comments