본문 바로가기

PYTHON/PYTORCH

[PYTORCH] 2개 이상의 Loss를 사용할때 주의할 점

model을 모델링할때 loss function을 2개 이상 사용하는 경우가 있다. 이때 아래와 같은 로그가 뜰 수 있다.

 

RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation: [torch.cuda.FloatTensor [64, 128, 512]], which is output 0 of PermuteBackward, is at version 89; 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!

위와 같은 오류가 발생한 이유는 첫번째 loss 계산 이후 (혹은 두번째 Loss) 에 inplace=True 상태의 Tensor가 변형되어, backward()를 수행할 수 없는 상태가 되었기 때문이다. 

 

해결방법은 여러가지가 있다. clone().detach()를 통해서 Tensor를 복사할 수 도 있다. 이때는 computational graph에서 더이상 필요하지 않을때 사용된다. 혹은 두개의 loss에 흐르는 데이터들을 분리시켜주면 된다. 필자는 후자를 선택했으며, 약간의 GPU RAM 사용량 증가는 있었지만 성능에 문제가 있진 않았다.