let me graduate

Loss.backward() 할 때 inplace modification Error 해결 본문

DL/Pytorch

Loss.backward() 할 때 inplace modification Error 해결

daeheepark 2020. 6. 28. 15:45

네트워크 학습시 loss.backward() 를 하다보면 변수에 inplace modification이 존재해서 gradient계산 과정에서 에러가 뜨는 상황이 발생한다.

RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation

첫번째로, inplace modification이 발생한 variable을 찾기 위해서, loss.backward()가 일어나는 코드에 다음 코드를 추가한다.

import torch


with torch.autograd.set_detect_anomaly(True):
    a = torch.rand(1, requires_grad=True)
    c = torch.rand(1, requires_grad=True)

    b = a ** 2 * c ** 2
    b += 1
    b *= c + a

    d = b.exp_()
    d *= 5

    b.backward()

만약, network.forward()와 loss.backward()가 다른 파일에 정의되어 있다면,

forward()가 정의된 부분에 torch.autograd.set_detect_anomaly(True)를, backward()가 실행되는 부분에 torch.autograd.detect_anomaly를 위 그림과 같이 추가한다.

sys:1: RuntimeWarning: Traceback of forward call that caused the error:
    File "tst.py", line 13, in <module>
        d = b.exp_()

Traceback (most recent call last):
    File "tst.py", line 16, in <module>
        b.backward()
    File "/Users/fmassa/anaconda3/lib/python3.6/site-packages/torch/tensor.py", line 102, in backward
        torch.autograd.backward(self, gradient, retain_graph, create_graph)
    File "/Users/fmassa/anaconda3/lib/python3.6/site-packages/torch/autograd/__init__.py", line 93, in backward
        allow_unreachable=True) # allow_unreachable flag
RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation

위와 같이 에러 메세지가 발생하면 d=b.exp_()에서 inplace modification이 발생했다는 의미이다.

 

해결법은 inplace modification 연산을 실시할 때 loss에 사용되는 변수의 clone을 사용하면 된다.

clone은 해당 연산에 사용하는 변수와 코드의 나머지 부분에서 사용되는 변수간의 메모리를 공유하지 않도록 하기 때문에 해당 연산이 inplace operation에 문제를 발생시키지 않는다. 

 

출처 : https://discuss.pytorch.org/t/tensor-gather-triggers-in-place-operation-error-when-calling-backward/58436/3

Comments