背景:
最近在修改BEVDet,由于任务需要进行两次forward_train操作,遇到了RuntimeError: Expected to mark a variable ready only once.报错,原因很明显,对网络的某些部分进行了两次计算图的标注,在backward时出现问题。之前在2d上做类似的事情并没有碰到这样的问题。
解决方式
1.参考这位老哥的解决方式网页链接,但我发现这么写会导致后期任务出现问题,且对bevdet的数据已经进行了split操作,再次进行sup和student的数据结合,会增加程序运行时间。
2.在github issue 上发现类似的问题网页链接,经过实践发现只需要关闭backbone的with_cp即可。
究其根本
单纯的解决问题没有任何意义。
mmdetection中提到,在 backbone 中设置 with_cp=True。 这使用 PyTorch 中的 sublinear strategy 来降低 backbone 占用的 GPU 显存。
import torch.utils.checkpoint

在修改BEVDet时遇到RuntimeError,由于两次forward_train操作导致。问题根源在于backbone的with_cp设置。关闭with_cp可以解决,此设置原本用于减少GPU显存占用。使用torch.utils.checkpoint的目的是在forward时不存储中间激活值,而在backward时重新计算并计算梯度。两次forward创建的计算图无法在一次backward中处理。
最低0.47元/天 解锁文章
3412





