사건의 발단 : PyTorch 모델 학습 중 에러 발생
RuntimeError: CUDA out of memory
KcBERT-Large모델을 학습시키는 도중 이러한 에러가 발생했고
KcELECTRA-base 모델 학습시에는 발생하지 않았던 에러가 발생해서 당황 스러웠다.
나는 바로 구글링을 했고 해결점을 찾았다.
https://twinparadox.tistory.com/606
에러 내용의 해석은 이렇다.
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으로 학습시킨 것과는 상당한 차이가 있습니다.
'Machine learning > Deep Learning' 카테고리의 다른 글
[딥러닝]. 효과적인 학습(training) 방법 모음 (0) | 2022.05.11 |
---|---|
[PyTorch]. Dataset 과 Dataloader 사용하여 전처리하기 (1) | 2021.09.21 |
[PyTorch] . Tensorflow(텐서플로) PyTorch(파이토치) 차이점 비교 (0) | 2021.09.15 |
[Deep Learning] Tensorflow 자주 사용하는 Tensor 함수 정리 (0) | 2021.08.21 |
[Deep Learning] Weight Initialization(기울기 초기화), Xavier , He (0) | 2021.08.17 |