기본 콘텐츠로 건너뛰기
인공지능, AI, NLP, 논문 리뷰, Natural Language, Leetcode
모델 학습 중에 갑자기 out-of-memory 발생
- (pytorch 상황에서 설명)
- 최근에 모델을 학습하는데, 중간에 CUDA out-of-memory 에러가 발생했다.
- 내가 코드를 잘못짰나? 살펴보았지만, 딱히 잘못짠 거 같지도 않고 잘못 구성했으면 초반부터 에러가 났어야할 것 같다.
- 딥러닝 배운지 얼마 안됐을때에도 비슷한 상황이 있었던 것 같은데..
- 이 때는 내가 잘못짰고 GPU가 딸려서 그런가보다 하고 넘어갔던 거 같다.
- 아무튼 그래서 구글신에게 물어봤는데 비슷한 증상이 많다.
- 결론!!
- nvidia-smi 등으로 학습 중간에 메모리 사용량을 확인해보라고 한다.
- 확인해보니 매우 조금씩 점점 늘어나는 것이 아닌가?
- 또 누군가는 detach 함수를 써보라고 한다.
- detach를 쓰면 거기서 부터는 backprop이 일어나지 않도록 하는 것이다.
- 즉 업데이트할 필요없는 evaluation 부분이라든지 이런 부분을 detach 처리하라는 거다.
- 혹은 with torch.no_grad(): 을 쓰라는 것이다.
- 나하곤 크게 관련이 없을 것 같아서 더 찾아보니 del해서 메모리를 날리라는 글도 있다.
- 만약 loss = loss_calculate(output, label)이라고 하면
- 이것으로 loss.backward() 한 후, del loss를 하라는 것이다.
- 또한 학습 중간에 torch.cuda.empty_cache()을 하라고한다.
- 그러나 링크2에서 보듯이, 이 방법은 속도가 느려지기 때문에 효율적이지 않다는 것 같다.
- 왜 효율적이지 않을까 생각해보면 캐시에 있어서 학습에는 쓰이지 않아도 뭐 딴데 쓰인다고 했을 때, 그걸 empty_cache()로 날리면 다시 계산해야하니까 그런걸까?
- 즉 내 어디 부분이 cache인지 알면, no_grad로 묶으면 될 것 같은데 어디 부분지 잘 모르겠다면 그냥 간단히 empty_cache()도 한 방법일듯..
- 내가 봤던 링크
댓글
댓글 쓰기