Pytorch——报错解析:RuntimeError: Expected to mark a variable ready only once. This error is caused by one
Aria
下载可以很简单
项目地址:https://gitcode.com/gh_mirrors/ar/Aria
免费下载资源
·
我在做Semi-Supervised任务时遇到了该BUG,因为在写模型时将student的model运行了两次,分别对两组image进行了forward train并计算了loss,因此出现了如下错误,以此记录。
报错截图
问题原因
可以看到底下报错中写了student中img_backbone有个layer运行了两次,并且都计算了loss,因此反向梯度回传时发生了错误。
给大家翻译一下:
RuntimeError
:应仅将变量标记为就绪一次。此错误是由以下原因之一引起的:
1)在“转发”函数之外使用模块参数。请确保模型参数不在多个并发向前向后传递之间共享。或者尝试使用_set_static_graph()
作为变通方法,如果此模块图在训练循环期间没有改变。
2)在多个可重入向后传递中重用参数。例如,如果使用多个“检查点”函数包装模型的同一部分,则会导致不同的可重入向后传递多次使用同一组参数,从而多次标记变量就绪。默认情况下,DDP不支持此类用例。如果模块图不随迭代而变化,可以尝试使用_set_static_graph()
作为解决方法。
索引340处名为student.img_backbone.layer4.2.bn3.weight
的参数已被标记为就绪两次。这意味着在这个迭代过程中,多个自动签名引擎钩子已经为这个特定参数触发。
如果你的报错信息没有具体的报错位置,需要在运行分布式bash文件前加一个前置:TORCH_DISTRIBUTED_DEBUG=DETAIL
,完整示例命令为:
TORCH_DISTRIBUTED_DEBUG=DETAIL bash tools/dist_train.sh configs/bevdet/bevdet_baseline.py 1
运行即可获取具体的报错位置。
- 报错的
student.img_backbone.layer4.2.bn3.weight
是img_backbone
的最后一层,说明是backbone反传的问题。
解决方法
明确了问题,就知道,解决方法就是将两组img合并,使模型前向一次计算loss即可。
GitHub 加速计划 / ar / Aria
5.52 K
861
下载
下载可以很简单
最近提交(Master分支:3 个月前 )
b0d3c6dd - 5 个月前
8fd9634d - 5 个月前
更多推荐
已为社区贡献23条内容
所有评论(0)