PyTorch 训练时中遇到的卡住停住等问题

前言

在实际训练中遇到了各种各样的卡住问题,在此总结一下,PyTorch 训练时遇到的卡住停住等问题可以从以下几个方面根据情况具体分析 (参考PyTorch训练时,Dataloader卡死、挂起,跑一个epoch停了,问题解决方案):

  • 前一进程还未处理完,又进入下一个导致互锁:在每个Epoch后,或每个 batch 后暂停一下: time.sleep(0.003)
  • 内存问题:使用开关,pin_memory=True/False
  • 多进程导致互锁问题:减少进程数或者不用,num_workers=0/1
  • OpenCV与Pytorch互锁;
  • batch size 的设置;

1. PyTorch 训练时在第一个 epoch 的最后一个 batch 卡死

- 问题描述

使用 PyTorch 框架训练模型,训练第一个 epoch 时,在最后一个 batch 处卡死,卡了一天都没有动弹,而 CPU 和 GPU 都处于正常运行的状态,程序也没有报错,并且之前训练一直都是正常的。最终,只能通过 Ctrl+C 强制性暂停。如下图所示。在这里插入图片描述

- 可能的原因

  1. 搜索文章发现,有人出现这种问题是和 cv2.imread 有关,用 OpenCV 的接口进行数据读取,而没有用 PIL,导致出现 OpenCV与Pytorch互锁的问题,关闭OpenCV的多线程即可解决问题1 2
  2. 但是我们的代码中并没有使用 OpenCV,通过 Debug 发现,出现问题的时候,最后一个 batch =1,而我们使用的是四块 GPU 进行训练,原因就在此。

- 解决方法

Pytorch 的多 GPU 处理接口是 torch.nn.DataParallel(module, device_ids),具体并行机制可参考:Pytorch多GPU并行处理
该接口还要求输入数据的 batch 数量要不小于所指定的 GPU 数量。另根据官网解释和注释 (The batch size should be larger than the number of GPUs used.),batch的数量会均分到每块GPU上进行处理,因此要保证一个整数的关系。

故,一定要注意在使用多块 GPU 训练时,注意 batch_size 的取值,避免出现最后一个 batch 的实际size小于所指定的 GPU 数量的情况。

多 GPU 并行训练中其他比较坑的地方可参考:pytorch多GPU数据并行模式 踩坑指南和nn.DataParallel说再见

2. 使用命令行运行时,卡在第一个 epoch

- 问题描述

使用 PyTorch 框架训练模型,在 Pycharm 里面可以正常运行,但是在命令行中运行时,在第一个 epoch 处卡死。
在这里插入图片描述

- 原因分析

经过定位,发现卡死的地方是PyTorch自带的 DataLoader 处有问题, 使用batch和 num_works参数的原理可参考此文3,DataLoader的函数定义如下4

DataLoader(dataset, batch_size=1, shuffle=False, sampler=None,
num_workers=0, collate_fn=default_collate, pin_memory=False,
drop_last=False)

其中 num_workers 表示使用多进程加载的进程数,0代表不使用多进程,pin_memory 表示是否将数据保存在pin memory区,pin memory中的数据转到GPU会快一些。

- 解决方法

把 num_workers 改为 0 即可正常运行,如何设置还是要靠具体实验。


  1. Pytorch dataloader在加载最后一个batch时卡死 ↩︎

  2. 在PyTorch训练一个epoch时,模型不能接着训练,Dataloader卡死 ↩︎

  3. pytorch dataloader 使用batch和 num_works参数的原理是什么? - 孟paper的回答 - 知乎 ↩︎

  4. pytorch DataLoader num_workers 出现的问题 ↩︎

  • 57
    点赞
  • 204
    收藏
    觉得还不错? 一键收藏
  • 28
    评论
当 YOLOv3 训练过程中卡住时,可能有以下几个原因: 1. 数据加载问题:检查数据加载部分的代码,确保数据加载正确,并且没有出现死循环或者数据读取错误的情况。可以尝试打印一些相关信息,例如数据路径、标签等,以便排查问题。 2. 参数配置问题:检查训练参数的设置是否正确。特别是关于学习率、批大小、迭代次数等参数,确保它们的取值合理。过大或过小的学习率可能导致训练过程不收敛或者卡住。 3. GPU 内存不足:YOLOv3 是一个计算密集型模型,需要大量的 GPU 内存进行训练。如果你的 GPU 内存不足,可能导致训练过程中卡住。可以尝试减小批大小、降低图像分辨率或者使用更小的模型来减少内存占用。 4. 网络结构问题:检查 YOLOv3 网络结构的定义是否正确。可能存在输入输出尺寸不匹配、通道数错误等问题,导致模型无法正常训练。可以参考官方提供的模型定义或者其他可靠资源,确保网络结构正确无误。 5. 权重初始化问题:检查模型权重的初始化方式是否正确。如果权重初始化不合适,可能导致模型无法收敛。可以尝试使用预训练权重进行初始化,或者采用一些合适的初始化策略。 如果以上方法仍然无法解决问题,可以尝试使用调试工具(如 PyTorch 的 `torch.autograd.set_detect_anomaly(True)`)来定位具体的问题所在。另外,检查日志文件或者错误信息也是一种排查问题的有效方式。如果问题持续存在,你可以提供更多的细节和代码片段,以便更好地帮助你解决问题

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值