Pytorch填坑

时隔一年半,现在遇到的不能解决的BUG基本少之又少,似乎没有什么要补充的了。大多数人会遇到的BUG主要在安装包、显存爆、维度不匹配、forward不规范、调用函数不规范、cuda驱动没有正确安装。深入一点的话,会遇到梯度计算问题、多线程问题、fp16/32不匹配问题等等,在此做个留言贴,欢迎大家互助填坑。

---------------------------------------分割线---------------------------------------------------

记录实验中遇到的pytorch可能的问题及解决办法,持续更新,欢迎大家在评论区补充。

1、UserWarning: Using a target size (torch.Size([64])) that is different to the input size (torch.Size([64, 1])). This will likely lead to incorrect results due to broadcasting. Please ensure they have the same size.
  return F.mse_loss(input, target, reduction=self.reduction)

问题描述:训练时batch大于1 时,loss就不下降,训练效果很差。而batch =1 时可以正常训练。后发现提示警告,预测的batch维度与真实的batch维度不同,按照提示需要统一维度,可用squeeze将预测维度从(64,1)压缩为(64),操作方法为  predict = predict.squeeze(-1)   。

问题原因:因为线性回归网络的输出是1维,而在读取target数据时,默认读取为了一维向量,而预测的结果是tensor,是在一维的基础上unsuqeeze了batch维度得到的,而在计算mseloss时候,维度不同时计算loss可能导致错误。

2、RuntimeError. CUDA error:an illegal memory access was encountered。

问题描述:在自己代码上新增了一个算法,后来代码跳转到这个部分总会报错。按理说不应该是显存问题,但是把batch调到8时候可以运行,调到16就不行,而且从单卡调到4卡时,仍只能batch为8。初步排除是显存不够的原因,应该是代码问题。

问题解决:

1)网上说有可能是batch大的原因,调小batch后确实可以运行,但是会有精度损失,所以想调大batch。

2)网上说有可能是有运算将GPU上张量和CPU上张量进行了运算,检查代码,发现并无此类运算。将所有变量置于GPU上,仍然报错,将所有变量置于CPU上,可运行,但太慢了,不可取。

3)尝试重新coding,一步步实现这个算法。发现可以运行,但是少了一个np.random.choice(np.range(len(tensors), 1, p=num_weights))的操作,即按概率选取一个index。在本地调试,加上这个代码后,有时候会爆出ths sum of probability is not 1的错误。但是我的概率是归一化过的,错误原因不明。把这个部分代码加上后,在本地运行,有时报错有时不报错。而在GPU上运行时,会报错CUDA error:an illegal memory access was encountered。这可能是因为GPU上batchsize比较大,报错机率增加。

总结:报错原因为代码问题,多在本地CPU上调试,GPU上有些错误直接报CUDA错误,不好定位原因。

4)补充。发现直接去掉np.random.choice还是不好,上面这个方法过于玄学。仔细查看代码,发现有一个op爆了显存,但是不应该一个op能搞掉我10G的显存吧…发现这个op爆出显存错误后,如果尝试调用它的返回值,就会爆illegal memory access 的错误。所以把这个op调试好后,就没有报错了。

3、RuntimeError: Expected to have finished reduction in the prior iteration before starting a new one.

两个解决办法:

1)在DDP模型定义中写find_unuse_parameter=True

2)forward得到的多个输出,没有全部用来计算损失。导致报错,设置一下forward输出即可。

  • 14
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 18
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值