Open heojae opened 3 years ago
batch_size = 128
에서 터진것을 확인할 수 있었습니다.
RuntimeError: CUDA out of memory. Tried to allocate 32.00 MiB (GPU 0; 11.93 GiB total capacity; 11.08 GiB already allocated; 22.50 MiB free; 11.32 GiB reserved in total by PyTorch)
Data Parallel 의 경우, loss 를 gather 를 하기 때문에, 각각의 GPU에 다른 양의 Memory 가 할당이 되었던것을 확인할 수 있었습니다.
균등하게 메모리가 할당이 되지 않는 것을 확인할 수 있었습니다.
batch_size = 210
까지 올렸더니, 확실하게, Loss
가 하나의 GPU 에 몰리는 것을 확인할 수 있었습니다.
data paraellel
과는 다른게, 각각의 GPU 상에서, loss, back propagation(grad) 등등을 하기에,
각각의 GPU 상에 잡힌 메모리가 다른 것을 확인 할 수 있었습니다.
data parallel
과 data parallel seperate
보다도,
확실하게, 균등하게 각 GPU 상에 Memory 가 잡히는 것을 확인 할 수 있었습니다.
이부분의 환경설정은 https://github.com/NVIDIA/apex 에 있는대로 참고하여, 설정하였습니다.
거의 균등하게, GPU 상에 메모리가 잡히는 것을 확인할 수 있었지만,
distributed_data_parallel.py
보다, 같은 batch_size
일 때, 더 많은 양의 Memory
가 GPU 상에 잡히는 것을 확인할 수 있었습니다.
또한, GPU-Util
을 100%
가까이 활용하고 있다는 것 또한 확인할 수 있었습니다.
작성 계기
당근 마켓, pytorch multi gpu 학습 제대로 하기
이 글을 읽고, 단순히, 학습코드를 구현하는 것보다는 좀 더 다양한 경우에 맞게 코드를 작성하는 것이 맞다고 생각하여, 시도하게 되었습니다.
또한, Multi GPU 를 다루는 방법에 대해서, 더 공부를 하고 싶었고,
이번 기회를 통해서,
pytorch
의multi gpu
를 다루는 방법에 대해서, 좀 더 깊게 이해할 수 있는 시간이 되었습니다.참고자료
https://pytorch.org/tutorials/beginner/blitz/data_parallel_tutorial.html
https://pytorch.org/tutorials/intermediate/dist_tuto.html
https://pytorch.org/tutorials/intermediate/ddp_tutorial.html
참고 gihub
https://github.com/zhanghang1989/PyTorch-Encoding/blob/master/encoding/parallel.py
https://github.com/pytorch/examples/blob/master/imagenet/main.py
https://github.com/NVIDIA/apex/blob/master/examples/imagenet/main_amp.py
추천자료
https://yangkky.github.io/2019/07/08/distributed-pytorch-tutorial.html
Paper(좀더 심화적으로 이해하고 싶을 경우, 읽어보세요.)
https://arxiv.org/pdf/2006.15704.pdf
Train Acc 와 Test Acc 그리고 Batch Size 실험
cpu - only
batch_size =1
아래와 같이, 학습의 속도가 더딘 것을 확인할 수 있으며,
5 epoch 가 지난후,
train_acc
는99 ~ 100
에 가까이 수렴한 것에 비해,test_acc
는58-61
에 머물러 있는 것을 확인할 수 있었습니다.분석
이에 대해서 분석해보았을 때,
local minimum
에 빠졌다고, 판단할 수 있었습니다.batch size =1
이기 때문에, 이미지input
한개 한개 에 대해서, 많은 영향을 받을 수 밖에 없으며,또한, 이와 같은 환경에서, 여러번 실험 해보았으나, 각
epoch
마다,accuracy
가 10-20% 이상 증가하고, 감소 하는것으로 보아local minimum
에 빠져, 위와 같은 결과가 나온것이라 판단합니다.접기/펼치기 버튼
batch_size = 16
batch_size=1
과는 다르게, 빠른 속도로 학습이 되어가는 것을 확인할 수 있었습니다.5 epoch
를 학습하였지만,train_acc
는95 ~ 96
에 가까이 수렴하였고,test_acc
는96~97
가까이 올라간 것을 확인할 수 있었습니다.접기/펼치기 버튼
single-gpu
batch_size = 32, epoch =20
아래와 같이, test_accuracy 가 이미 충분히 수렴을 한것을 확인할 수 있었습니다.
train_acc
는99
에 가까이 수렴하는 등, noise 를 고려한다면, 이미 충분히 수렴을 하였고,test_acc
는99.457
에 수렴한 것으로 보아, 더 이상 학습은 무의미하다고 판단을 하였기에앞으로는, GPU Memory 할당을 중점적으로 살펴보겠습니다.
접기/펼치기 버튼