Multi-GPU 학습

정현호·2022년 9월 30일
0

Multi-GPU 학습

Single vs Multi
GPU vs Node
Single Node Singe GPU
Single Node Multi GPU
Multi Node Multi GPU

다중 GPU에 학습을 분산하는 두 가지 방법 (병렬화)

Multi GPU에서 배치를 의미있게 해야한다. -> 파이프 라인을 잘 만들어야 한다. ( 병목현상 방지 )
1. Model parallel
2. Data parallel
데이터를 나눠 GPU에 할당 후 결과의 평균을 취함
minibatch를 병렬적으로 돌리는 느낌

  • DataParallel : 단순히 데이터를 분배한 후 합쳐서 평균을 냄
  • DistributedDataParallel : 분배 후 개별적으로 평균을 냄

Hyperparameter tuning

성능을 올리는 방법
1. model
2. data 추가
3. Hyperparameter tuning

1번의 경우 좋은 모델은 거의 고정되어 있다.
가장 큰 영향을 미치는 것은 data.

모델 스스로 학습하지 않는 값 : learning rate, 모델의 크기, optimizer

최근은 하이퍼 파라미터에 의해 크게 좌우되지는 않는다.

Grid vs Random

Ray

ML/DL의 병렬 처리를 위한 모듈 in Python


OOM (Out Of Memory) 해결

  1. GPUUtil 사용하기
    GPU의 상태를 보여주는 모듈
    Colab에서는 환경에서 GPU를 보여주기 편함
    iter마다 메모리가 늘어나는지 확인
!pip install GPUtil

import GPUtil
GPUtil.showUtilization()
  1. torch.cuda.empty_cache() 써보기
    사용되지 않은 GPU상 cache 정리
    가용 메모리 확보
    별개로 del은 관계를 끊어버림 이후 garbage collector가 작동해야 메모리가 비워짐
    reset 대신 쓰기 좋음
import torch

for i in range(10):
	tensorList.append(torch.randn(1000000,10.cuda()) # 메모리 할당
    
del tensorList # 즉시 메모리가 비워지지 않음

torch.cuda.empty_cache() # 메모리를 강제로 비워줌

traing loop에 tensor로 축적되는 변수 확인

tensor로 처리된 변수는 GPU 상에 메모리 사용
해당 변수가 loop 안에 있을 시 GPU에 computational graph를 생성시켜 메모리 잠식

해결법

  1. 1-d tensor의 경우 python 기본 객체로 변환하여 처리 - .item or float()
  2. del 명령어 사용 - python 메모리 배치 특정상 loop이 끝나도 메모리 차지
  3. 가능 batch 사이즈 실험
    batch size를 1로 해보기
oom = false
try:
	run_model(batch_size)
except RuntimeError: # OOM
	oom = True

if oom:
	for _ in range(batch_size):
    	run_model(1)
  1. torch.no_grad() 사용하기
    학습이 아닌 inference 시점에는 torch.no_grad() 구문을 사용하여 backward pass로 인하여 메모리에 쌓이지 않음

이 외에도 CUDNN_STATUS_NOT_INIT이나 device-side-assert 등 존재

profile
반갑습니다.

0개의 댓글