티스토리 뷰

728x90

 

RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation: [torch.cuda. HalfTensor [64, 512]], which is output 0 of DivBackward0, is at version 1; expected version 0 instead. Hint: the backtrace further above shows the operation that failed to compute its gradient. The variable in question was changed in there or anywhere later. Good luck!

 

이 오류의 의미는 gradient를 계산하기 위해 필요한 변수 중 하나가 수정되었고, 문제되는 변수가 나중에 또 변경되었다고 알려주고 있다. 즉, backward를 하며 gradient를 계산해야하는데 그 계산해야하는 변수 중 일부가 inplace 연산에 의해 수정되고 있다는 점이었다.

 

나는 생성한 텐서를 nn.Parameter(tensor)를 통해 파라미터로 바꾸어서 학습 가능하도록 만들었고, inplace 연산으로 인해 새로운 텐서를 생성하지 않고 입력 텐서를 직접 수정하는 연산이 반복되었다는 점에서 오류가 발생했다.

 

해결 방법은 두 가지가 있다.

1. 문제가 되는 연산의 값을 그대로 복사해서 사용하는 법

간단하게 clone()을 통해 해결할 수 있다.

 

2. 연산을 풀어서 적어주기

내가 문제가 되었던 연산은 아래 부분이어서 연산을 풀어주었다.

# 수정 전
text_direction /= text_direction.norm(dim=-1, keepdim=True)
# 수정 후
text_direction = text_direction / text_direction.norm(dim=-1, keepdim=True)

 

 

Tensor와 gradient가 계산되는 함수는 이렇다. w와 b가 최적화해야 하는 매개변수이고, 이 변수들에 대한 손실 함수의 변화도를 계산하여 학습이 이뤄져야 한다.

 

요즘 코드를 보며 배운 것

1. 학습되어야 하는 텐서는 requires_grad(True) 설정을 해줘야 한다는 점

2. 학습되어야 하는 텐서는 연산이 중복되지 않게 inplace 연산을 피해주어야 한다는 점

  

생각보다 간단한 문제였는데 오랫동안 헤맸다. 다들 잘 해결하시길!

728x90
댓글