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
Comments