Machine learning/Deep Learning

[DeepLearning]. GPU 메모리와 배치사이즈(Batch_size)의 관계

Acdong 2021. 9. 16. 11:26
728x90

사건의 발단 : PyTorch 모델 학습 중 에러 발생

RuntimeError: CUDA out of memory

 

KcBERT-Large모델을 학습시키는 도중 이러한 에러가 발생했고

KcELECTRA-base 모델 학습시에는 발생하지 않았던 에러가 발생해서 당황 스러웠다.

 

나는 바로 구글링을 했고 해결점을 찾았다.

https://twinparadox.tistory.com/606

 

TensorFlow, Keras GPU 메모리 문제(Out of Memory) 발생 시 시도해볼 방법

빅데이터 처리나 딥러닝을 하다보면 자연스럽게 마주하는 문제가 바로 메모리 문제다. 빅데이터 처리 같은 경우 그냥 파이썬에서 Numpy나 Dataframe을 사용하는 과정에서 발생하는 일이 흔하고, 그

twinparadox.tistory.com

 

에러 내용의 해석은 이렇다.

OOM(out of memory) : 내가 가지고 있는 GPU가 감당할 수 있는 메모리를 초과했을 때 발생함.

 

해결책 :

(1). 다른 프로세스의 GPU 점유를 제거한다.

(2). Batch Size를 낮춘다.

 

1번의 경우는 다른 프로세스가 GPU를 메모리를 사용할 경우 해제시켜서 메모리를 확보하는 방법인데.

나는 딱히 다른 프로세스가 GPU를 차지하고 있지 않았다.

 

그래서 해결책 2번을 사용했다. 배치사이즈를 32에서 16으로 조정함.

그랬더니 잘 해결되었다.

 

자 에러가 해결되었으니 끝인가?

아니다 더 깊게 에러가 왜 발생했고 GPU메모리가 Batch size와 어떤 연관이 있는 지 알아야한다.

다행히 팀장님께서 설명해주셔서 이해할 수 있었다.

 

먼저 GPU 메모리의 개념에 대해 알아보자.

GPU를 구매할때 보면 옆에 메모리가 표시된다. 16G , 12G

이건 살때는 몰랐는 데 GPU를 사용할 때 한 번에 가질 수 있는 메모리 양이라고 보면 된다.

GPU 버전 RAM 같은 존재?

 

딥러닝 학습에서 GPU를 사용하는 이유는 수많은 행렬연산을 한번에 처리하기 위해서다.

한 번에 처리한다는 것은 메모리에 전부 올려놓고 계산한다는 뜻이다.

 

즉, GPU 메모리에

모델 , 데이터 , 가중치값, 각각 퍼셉트론의 에러값(Backpropagation을 위한)등을

올려놔야(들고있어야) 한 번에 계산할 수 있다.

 


Batch Size와의 연관성

Batch Size가 많으면 메모리가 들고있어야할 양이 많아진다.

 

만약 Batch size가 32면 들고있어야할 메모리 양이 32배(정확한 수치는 아님)늘어난다.

대신의 속도가 향상된다.(미니 배치 기본개념)

그래서 필요한 메모리 양보다 그래픽카드 메모리가 적을 경우 OOM(out of memory)에러를 발생시킨 것이다.

 

그럼 왜 KcELECTRA-base 는 에러가 안나고 KcBERT-Large 만 에러가 나는 것일까?

답은 쉽게 찾을 수 있었다.

모델의 용량차이가 많이 났다.(용량이 크다는 건 그만큼 많은 파라미터를 사용했다는 뜻)

 

실제 위 참조글에서도 이런 문제를 찾아 볼 수 있었습니다.

 

예를 들어 메모리가 12G인 TITAN XP에서는 BERT base model을 batch size 30 이하로 돌릴 수 있습니다.

BERT 논문에서 batch size 256으로 학습시킨 것과는 상당한 차이가 있습니다.

반응형