Pytorch——报错解析:RuntimeError: Expected to mark a variable ready only once. This error is caused by one

我在做Semi-Supervised任务时遇到了该BUG,因为在写模型时将student的model运行了两次,分别对两组image进行了forward train并计算了loss,因此出现了如下错误,以此记录。

报错截图

Pytorch——报错解析:RuntimeError: Expected to mark a variable ready only once. This error is caused by one_第1张图片

问题原因

可以看到底下报错中写了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.weightimg_backbone的最后一层,说明是backbone反传的问题。
    Pytorch——报错解析:RuntimeError: Expected to mark a variable ready only once. This error is caused by one_第2张图片

解决方法

明确了问题,就知道,解决方法就是将两组img合并,使模型前向一次计算loss即可。

你可能感兴趣的:(pytorch,pytorch,深度学习,机器学习)