[3주차] 8.20 금
✏️Multi-GPU
- 오늘날의 딥러닝은 엄청난 데이터와의 싸움
- 최근 많아진 데이터로 인해 많은 GPU로 학습하는 것이 일상화가 된 시대에 도래했다.
- 개념정리
- Single vs. Multi
-> 1개 vs. 2개 이상 - GPU vs. Node
-> GPU vs. System(computer with GPU) - Single Node Single GPU
-> 1대의 컴퓨터에 single GPU - Single Node Multi GPU
-> 1대의 컴퓨터에 multi GPU
-> 주로 우리가 사용할 환경 - Multi Node Multi GPU
-> Multi computer & Multi GPU
-> ex) 서버실
- Single vs. Multi
Model parallel (모델 병렬화)
- 다중 GPU에 학습을 분산하는 2가지 방법 중 하나
- 예전부터 써왔음 (Alexnet)
- 모델의 병목(bottleneck), 파이프라인의 어려움 등으로 인해 고난이도 과제에 속함
Data parallel (데이터 병렬화)
- 데이터를 나눠 GPU에 할당 후 결과의 평균을 취하는 방법
- minibatch 수식과 유사; serial한 minibatch 학습을 한 번에 여러 GPU에서 parallel하게 수행한다고 생각하면 편함
- Pytorch에서는 2가지 방식을 제공
- DataParallel
- DistributedDataParallel
- DataParallel
-> 단순히 데이터 분배 연산 후 취합해서 평균을 취함
-> 한 coordinator GPU가 취합을 하기 때문에 GPU 사용 불균형 문제 발생 & Batch 사이즈 감소 → GPU 병목 & GIL - DistributedDataParallel
-> 각 CPU마다 process 생성하여 개별 GPU에 할당
-> 개별적으로 연산의 평균을 냄
✏️Hyperparameter Tuning
- 모델 스스로 학습하지 않는 값(hyperparameter)은 사람이 지정
-> learning rate, layer input/output dimension, optimizer 등
- hyperparameter를 조정하는 실험을 통해 조금이라도 좋은 성능의 모델을 학습하자!
- 예전엔 insufficient data로 인해 hyperparameter로 값이 크게 좌우 될 때도 있었음. 요즘은 그닥?
- 마지막 0.01을 쥐어짤 때 도전해볼만!
-> Acc ⬆, Loss ⬇
Hyperparameter Tuning Methods
- 가장 기본적인 방법 - grid vs. random
-> random으로 space찾고 grid로 찾는 것이 보편적(old school)
- 최근에는 베이지안 기반 기법들이 주도 (BOHB - 2018 논문)
Hyperparameter Tuning Tool - Ray
- multi-node multi processing 지원 모듈
- ML/DL의 병렬 처리를 위해 개발된 모듈
- 기본적으로 현재의 분산병렬 ML/DL 모듈의 표준
- Hyperparameter Search를 위한 다양한 모듈 제공
🔗Image Reference
-> learning rate, layer input/output dimension, optimizer 등
-> Acc ⬆, Loss ⬇
-> random으로 space찾고 grid로 찾는 것이 보편적(old school)
✏️Pytorch Troubleshooting
Out Of Memory(OOM)
- 왜, 어디서 발생했는지 알기 어려움
- Error backtracking이 이상한 곳으로 감
- 메모리의 이전상황의 파악이 어려움
-> 보통 iteration 간 발생해서 어렵다.
- 제일 편한 방법:
Batch Size ⬇ → GPU clean → Run
GPUtil 사용하기
- nvidia-smi 처럼 GPU의 상태를 보여주는 모듈
!pip install GPUtil
import GPUtil
GPUtil.showUtilization()
torch.cuda.empty_cache() 사용하기
- 사용되지 않은 GPU상 cache를 정리
- 가용 메모리를 확보
- del 과는 구분이 필요
→ graph와 관계를 아예 끊는 명령어
- reset 대신 쓰기 좋은 함수
training loop에 tensor로 축적 되는 변수는 확인할 것
- tensor로 처리된 변수는 GPU 메모리 사용
- 1-d tensor의 경우 python 기본 객체로 변환하여 처리할 것
total_loss = 0
for i in range(10000):
optimizer.zero_grad()
output = model(input)
loss = criterion(output, label)
loss.backward()
optimizer.step()
total_loss += loss # should be float(loss) or loss.item() to make it tensor → float
del 명령어를 적절히 사용하기
- 필요가 없어진 변수는 적절한 삭제가 필요
# python의 메모리 배치 특성 상 loop이 끝나도 메모리를 차지
for x in range(10):
i = x
print(i) # 9 is printed
가능 batch 사이즈 실험해보기
- 학습 중 OOM 발생 시 batch 사이즈를 1로 해서 실험
oom = False
try:
run_model(batch_size) # 64 → 32 → ...
except: RuntimeError:
oom = True
if oom:
for _ in range(batch_size):
run_model(1)
torch.no_grad() 사용하기
- inference 시점에서는 torch.no_grad() 구문을 사용
- backward pass로 인해 쌓이는 메모리에서 자유로움
- 반드시 사용하자!
그 외
- colab에서 너무 큰 사이즈는 실행하지 말 것
-> pretrained model 추천
- CNN의 대부분의 에러는 크기가 안 맞아서 발생
-> torchsummary 사용 추천
- tensor의 float precision을 16 bit로 줄일 수 있다.
-> 큰 모델 아니면 잘 안씀
주간 학습 정리
-> 보통 iteration 간 발생해서 어렵다.
Batch Size ⬇ → GPU clean → Run
!pip install GPUtil
import GPUtil
GPUtil.showUtilization()
→ graph와 관계를 아예 끊는 명령어
total_loss = 0
for i in range(10000):
optimizer.zero_grad()
output = model(input)
loss = criterion(output, label)
loss.backward()
optimizer.step()
total_loss += loss # should be float(loss) or loss.item() to make it tensor → float
# python의 메모리 배치 특성 상 loop이 끝나도 메모리를 차지
for x in range(10):
i = x
print(i) # 9 is printed
oom = False
try:
run_model(batch_size) # 64 → 32 → ...
except: RuntimeError:
oom = True
if oom:
for _ in range(batch_size):
run_model(1)
-> pretrained model 추천
-> torchsummary 사용 추천
-> 큰 모델 아니면 잘 안씀
과제 수행 과정 / 결과물 정리
- 필수 과제 : 완료 및 제출
- 선택 과제 : 진행 중
피어세션 정리
이번 주는 pytorch를 사용하여 model을 만들고, dataset과 dataloader를 사용하는 법을 배우는 등 pytorch를 제대로 배워볼 수 있는 과제여서 양이 엄청 많았다. 강의 리뷰 및 과제 코드 리뷰로 피어 세션 거의 대부분의 시간을 할애했다. 많이 배우고 많이 얻어어갈 수 있어서 좋았다.
학습회고
시간이 흐르면서 점점 아는게 많아지고 윤곽이 어렴풋이 잡혀지는 느낌이 들긴 하는데.. 뭔가 불안하다. 급히 배워 체하는 걸까라는 생각도 들고.. 좀 더 복습하고 정리하고 싶은데 매일 주어지는 학습량이 어마무시하니 따라가기 벅차 100% 마음에 드는 복습과 정리가 안되고 있다. 어쩔 수 없다. 시간을 더 투자해서 만드는 수 밖에.. 다음 주도 화이팅!
Author And Source
이 문제에 관하여([3주차] 8.20 금), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@blackpudding96/3주차-8.20-금저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)