PyTorch Inplace Operation Notes
最近在跑实验的时候遇到了这样一个Bug花了很久才解决,记录一下学习一波以免以后再遇到。
1 | RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation: [torch.cuda.FloatTensor [3 |
关于Inplace Operation
首先,这个问题从报错中可以看到是由于inplace operation导致的。经过查找,inplace operation指的就是PyTorch在计算一个值的时候不创建新的变量进行复制,而是直接改变原来的变量的值。比如以下代码,第一个就不是inplace operation而后两个就是inplace operation。
1 | x = torch.rand(2) |
解决过程
首先在网上搜到的资料都是说尽量移除掉所有的inplace
operation,包括把Activation
Layer的inplace=True
去掉等等,但是都无法解决。然后就根据报错中的提示,使用torch.autograd.set_detect_anomaly(True)
查找在哪里发生了inplace
operation (参考Debugging feature
for "modified by an inplace operation" errors · Issue #15803 ·
pytorch/pytorch · GitHub),最后提示如下报错
1 | [W python_anomaly_mode.cpp:104] Warning: Error detected in CudnnConvolutionBackward. Traceback of forward call that caused the error: |
然后发现貌似是在conv层发生了inplace operation,但是实在没有头绪,最后又找到一篇博文与我的情况非常类似(RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation - Js2Hou - 博客园 (cnblogs.com)),最后发现是代码执行的顺序问题,原本的代码
1 | def optimize_parameters(self): |
修改后的代码
1 | def optimize_parameters(self): |
终于顺利解决!!!