Pytorch生僻bug记录「NoneType、Cannot re-initialize、cannot pin、can’t optimize」

Pytorch生僻bug记录

  1. 稍微改动了原先的代码然后用到一个新的数据集上,结果在一个完整的epoch结束前报错:OSError: Unrecognized data stream contents when reading image file
    解决方案:在确认代码没有可能导致报错的改动之后,感觉应该是数据集的问题。将数据集部分图片移除,只保留两个类,训练正常进行。逐步增加类数目直至报错。在不断缩小范围之后,最后终于抓出了导致报错的那一张图片,拉下来打开之后发现该图片被污染了,可能是下载过程中受损或者因其他原因受损。重新下载并更换该图片,报错解除。

  2. 网络能跑能更新参数,使用自己写的check_grad函数时却会报错:AttributeError: ‘NoneType’ object has no attribute ‘abs’
    可能问题:可能是forward的部分做过修改,比如把最后的fc去掉了,但是在init部分没有注释掉self.fc的定义,所以这个fc虽然没有启用,但一直存在,且它的grad是None,检查一下是不是这个问题,如果是的话注释掉没有使用的网络层的定义即可。已经因为这个问题出过两次类似的bug了。

  3. RuntimeError: Cannot re-initialize CUDA in forked subprocess. To use CUDA with multiprocessing, you must use the ‘spawn’ start method
    原因:dataloader里面不能出现.cuda(),只能一直在cpu上运行。这是CUDA的基本局限,只能避开,目前无法解决。
    解决方案:把num_workers设成1,或者去掉.cuda()

  4. RuntimeError: cannot pin ‘torch.cuda.FloatTensor’ only dense CPU tensors can be pinned
    原因:是pin_memory的问题
    解决方案:初始化dataloader的时候设置pin_memory=False,不过num_workers还是要设成0或者1

  5. 用一个在gpu上的张量而非torch定义的网络参数作为optimizer的参数时,报错 “ValueError: can’t optimize a non-leaf Tensor”
    原因:原始张量跟.cuda()后的张量不是同一个变量,.requires_grad=True的操作只对当前变量有效,所以先改成True再cuda()就报错了,改成先.cuda()再True就可以了
    PS: 若a.requires_grad=True, b=a.cuda(), 则backward后a是能正常有梯度的

  6. OMP: Warning #190: Forking a process while a parallel region is active is potentially unsafe.
    可能问题:同时使用多个dataloader时,有时候会出现这个警告,同时cpu占用率飙升。
    解决方案:将DataLoader初始化参数中的pin_memory设为False,问题解决。

  7. RuntimeError: Caught RuntimeError in replica 2 on device 2.
    可能问题:数据目录没设对,导致读不到图片,导致没有label,所以info没有下标不可迭代(常见于搬来人家的github,在自己的数据集上跑一开始没设对目录)
    解决方案:把数据目录改对

你可能感兴趣的:(深度学习,Pytorch,bug)