CUDA 11.1
Pytorch : 1.8.1 CU11.1
GPU : A10
OS : Linux 18.04
Model : AlexNet, ResNet20
Data : CIFAR10
Training Method : DP(DataParallel), DDP(DataDistributedParallel)
1 epoch time : 5 epoch time avg
Model | Batch | # GPU | 1 epoch time | # GPU | 1 epoch time |
---|---|---|---|---|---|
AlexNet | 256 | 4 | 15.90s | 8 | 19.45s |
512 | - | 13.90s | - | 15.07s | |
1024 | - | 12.50s | - | 13.57s | |
2048 | - | 12.05s | - | 12.20s | |
4096 | - | 11.60s | - | 11.60s | |
8192 | - | 11.52s | - | 11.20s | |
ResNet2e0 | 256 | - | 16.56s | - | 20.25s |
512 | - | 13.67s | - | 16.55s | |
1024 | - | 12.16s | - | 12.66s | |
2048 | - | 11.88s | - | 11.70s | |
4096 | - | 11.87s | - | 11.14s | |
8192 | - | 11.90s | - | 11.05s |
Model | Batch | # GPU | 1 epoch time | # GPU | 1 epoch time |
---|---|---|---|---|---|
AlexNet | 256 | 4 | 4.65s | 8 | 4.92s |
512 | - | 3.42s | 3.12s | ||
1024 | - | 2.50s | 2.51s | ||
2048 | - | 2.10s | out of shared mm | ||
4096 | - | out of shared mm | out of shared mm | ||
8192 | - | out of shared mm | out of shared mm | ||
ResNet20 | 256 | - | 3.95s | - | 4.42s |
512 | - | 2.45s | - | 2.66s | |
1024 | - | 2.25s | - | 1.81s | |
2048 | - | 2.50s | - | out of shared mm | |
4096 | - | out of shared mm | - | out of shared mm | |
8192 | - | out of shared mm | - | out of shared mm |
이 때, GPU의 개수를 늘려서 빠르게 가능한지, 어떠한 기법을 적용했을 때 보다 모델 학습이 빨라질지 척도로 참고했으면 하는 바람으로 포스트를 하게 되었다.
가장 간단한 모델이면서 파라미터의 개수와 연산량이 Fullcy connected layer에 몰려있으며, 별다른 matrix 연산이 없는 AlexNet과 BatchNorm과 Residual connection, Convolution 연산이 주를 이루는 ResNet(20)을 사용하였으며, 데이터는 CIFAR10을 사용하였다.
DP와 DDP를 모두 구현해서 돌려보았을 때, DDP가 DP 보다 학습 시간 측면에서 상당히 빠르다는 점이다. GPU를 많이 사용하였을 때, 얻는 장점과 모델의 특징을 생각하여 GPU개수와 batch크기를 잘 고려해서 사용해야 한다는 것이 이번 실험의 중요 내용이다.
실험하는 중 계속 GPU util을 계속 체크해본 결과 DDP가 DP보다 압도적으로 성능을 끌어내었다.
간혹 GPU util은 batch 크기를 키우면 높아진다고 생각하는 사람이 있는데, 절대 그렇지 않다는 것을 알아두면 좋겠다. 어느 연산에 대해서 Bottleneck이 있는지 확인 후 해결해야 하는 문제이다.
DP는 구현하기 매우 쉬우나 학습 시간 측면에서는 DDP보다 한참 오래 걸린다. DDP도 구현하는데 오래 걸리지는 않으니 DDP를 사용하는 것을 권장한다.
해당 글은 실험에 관한 글로 추후 분산학습 지식에 관한 글을 포스트 할 예정이다.