[Memory 오류] CUDA out of memory

최윤진·2023년 2월 17일

ERROR

목록 보기
3/3
post-thumbnail

딥러닝 모델을 학습 시키다보면 "cuda out of memory"라는 오류를 만날 수 있다. 말 그대로 메모리가 부족해 모델을 돌리지 못한다는 것이다.

📌 문제점

[정리]
먼저, 정리해보자면 메모리를 확인해보면 어딘가 메모리가 할당되어 있지만, Process에는 막상 아무것도 존재하지 않는다는 것이다.

GPU가 어떤 process에서 사용되고 있는지 확인하기 위해

!nvidia-smi

GPU 1을 사용했고,이렇게 코드를 실행시켜 보면 process에는 아무것도 뜨지 않았지만, 메모리는 20047MiB가 할당되어 있었다.

Kernel을 restart하면 된다고 해서 kernel을 끊고 restart 해봤지만 마찬가지로 메모리가 할당되어 있어 계속해서 cuda out of memory의 오류가 뜨며 중단됐다.

조사해보면서 많은 사람들이 올려놓은 해결방법을 따라해봤지만, 메모리가 조금 없어질 뿐 학습을 하기에 충분한 메모리가 확보되지 않았다.

📌 문제파악

여러가지 생각해보며 해결방법을 찾았고, 확인한 결과이다.

num_workers의 사용

[나의 환경 기준]
데이터를 다루며 여러가지 파라미터를 사용할 수 있는데, 현재 num_workers를 사용하고 있었다.

num_workers는 멀티 프로세싱과 관련된 파라미터로, 학습 중 cpu의 작업을 몇 개의 코어를 사용해 진행할 것인지에 대한 파라미터이다. 쉽게 말해, 데이터를 불러오는 과정을 빠르게 할려는 것이다.

num_workers의 수 만큼 프로세스들을 n개 생성해 그 프로세스들이 병렬적으로 데이터를 불러오기 때문이다.

여기서, num_workers를 사용해 실행하다가 코드를 중단시키면 각각의 프로세스들이 한 번에 중단되므로 조금의 시간이 걸린다. (바로 종료되지 않고, 시간이 조금 걸렸음)

여기서 또 중단을 시키게 되면 bash에서 python 자체는 종료가 된 것처럼 보이게 된다. 하지만 각각 내부에서 종료되고 있던 process들이 제대로 종료되지 않게 되고, 코드는 중단시킨 것이 맞기
때문에 process에는 확인되지 않는 것이다.

📌 해결 방법

제대로 종료되지 않은 프로세스를 KILL 해버리면 된다.

  • PID 찾는 법
    shell에서 실행되거나 주피터에서 확인하거나 pid 찾기는 자신의 실행 환경 등에 따라 간단히 찾으면 된다. 일단 많이 사용되는 것을 정리해보았다.
$ ps
$ ps -ef | grep user_name | grep process_name
import os
print(os.getpid())

(이외에도 여러가지 방법이 있음)

20047MiB에서 465MiB로 급격하게 줄어든 것을 확인할 수 있다!
(전부 다 종료시키지 않았기 때문에 0은 아님)

메모리 문제가 발생하기 전, 가장 좋은 방법은 중간 중간 메모리를 확인하면서 모델을 작동시키는 것라고 생각한다.

  • 참고
torch.cuda.empty_cache()
import gc
gc.collect()

이 방법도 사용했으나 메모리 문제를 해결해주진 않았음

profile
yunjin.log

1개의 댓글

comment-user-thumbnail
2023년 2월 21일

감사하게 보고 갑니다..

답글 달기