8강. Multi-GPU 학습
- GPU vs. Node (하나의 시스템)
- Node는 컴퓨터 한 대를 의미하며, “GPU를 사용한다” = 하나의 Node 안에 있는 하나의 GPU를 사용한다.
- 다중 GPU에 학습을 분산하는 방법에는 모델을 나누는 방법, 데이터를 나누는 방법 2가지가 있다.
1. Model Parallel: 모델을 나누는 것(alexnet)
- 모델의 병목, 파이프라인 등의 어려움으로 인해 모델 병렬화는 고난이도 과제이다.
- sequential1, sequential2를 각각 다른 cuda에 할당한 후에 두 모델을 연결한다.
2. Data Parallel: 데이터를 나누는 것
- 데이터를 나눠 GPU에 할당한 후에 결과의 평균을 취하는 방법으로 minibatch 수식과 유사하며, 한 번에 여러 GPU에서 수행한다.
- PyTorch DataParallel: 단순히 데이터를 분배한 후 평균을 취함, GPU 사용 불균형 문제가 발생함
- PyTorch DistributedDataParallel: 각 CPU마다 process를 생성해 개별 GPU에 할당함
9강. Hyperparameter Tuning
- 데이터 추가/변경 > 모델 변경 > hyperparameter tuning → 좋은 모델은 정해져있기 때문에 데이터를 바꾸는게 가장 성능을 많이 향상시킴
1. hypterparameter
- 학습할 때 모델이 스스로 학습하지 않아 사람이 지정해주는 파라미터로 learning rate, optimizer, 모델의 크기 등이 있다.
- Grid search: 어떤 값을 찾을 때 일정한 간격으로 바꾸면서 최적의 값을 찾는 것
- Random search: 값을 일정하게 찾지 않고 랜덤하게 찾는 것
- 최근에는 베이지안 기반 기법들을 사용함

2. Ray
- multi-node multi processing을 지원하는 모듈
- ML/DL의 병렬 처리를 위해 개발된 모듈로 현재 분산병렬 ML/DL 모듈의 표준이다.
10강. PyTorch Troubleshooting
- OOM 에러는 iteration을 돌면서 발생하는데, 메모리 이전상황 파악이 어려워 해결하기 어려움
- batch size를 줄이고, GPU clean → run 또는 코랩에서는 런타임을 초기화해 해결
1. GPUUtil
- nvidia-smi처럼 GPU의 상태를 보여주는 모듈로 iteration마다 캐시가 얼마나 쌓이는지/메모리 사용량을 보여줌.
- nvidia-smi는 현재의 스냅샷은 보여주지만 iteration을 돌면서 캐시가 쌓이는건 보여주지 않음.
2. torch.cuda.empty_cache()
- GPU상 사용되지 않는 메모리/cache 정리
- 가용 메모리를 확보할 수 있고 reset 대신 사용하기 좋은 함수, 학습 loop 전에 한 번 사용하는걸 추천함.
- del은 관계를 끊어 메모리를 free 상태로 만드는 것으로 메모리를 비우는 empty_cache와는 다름.
3. training loop에 tensor로 축적되는 변수 확인
- tensor로 처리된 변수는 GPU 상의 메모리를 사용하기 때문에 1-d tensor는 파이썬 기본 객체로 변환해 처리하는게 좋음.
4. del 명령어를 적절히 사용하기
필요가 없는 변수는 적절히 삭제하기, 파이썬의 메모리 배치 특성상 loop이 끝나도 메모리를 차지하기 때문이다.
5. 가능한 배치 사이즈 실험하기
- batch size=1로 해서 실험한 후 batch size 늘리기
6. torch.no_grad() 사용하기
- inference 시점에서는 torch.no_grad()을 사용하면 backward propagation이 일어나지 않아 OOM error, 메모리에서 자유롭다.
7. 다른 에러 메시지
- CUDNN_STATUS_NOT_INIT: gpu를 잘못 설치한 경우
- device-side-assert: cuda와 관련해 OOM의 일종으로 생각할 수 있음
- 참고: GPU 에러 정리