Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[DeepLearning] cpu, single gpu, multi gpu(data parallel, custom data parallel, distributed parallel, apex) 를 통한 학습 #7

Open
heojae opened this issue Feb 7, 2021 · 5 comments

Comments

@heojae
Copy link
Owner

heojae commented Feb 7, 2021

대주제 : 다양한 경우의 환경에서, 학습을 돌릴 수 있는 방법을 정리하고 싶다.

소주제 : cpu, single gpu, multi gpu(data parallel, custom data parallel, distributed parallel, apex) 의 각각의 환경에서, 학습을 돌리는 방법을 정리하고 싶다. + 각각의 GPU 상에 잡히는 메모리들을 실험하여 확인해보고 싶다.

작성 계기

당근 마켓, pytorch multi gpu 학습 제대로 하기

이 글을 읽고, 단순히, 학습코드를 구현하는 것보다는 좀 더 다양한 경우에 맞게 코드를 작성하는 것이 맞다고 생각하여, 시도하게 되었습니다.

또한, Multi GPU 를 다루는 방법에 대해서, 더 공부를 하고 싶었고,

이번 기회를 통해서, pytorchmulti 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_acc99 ~ 100에 가까이 수렴한 것에 비해,

    test_acc58-61 에 머물러 있는 것을 확인할 수 있었습니다.

분석

이에 대해서 분석해보았을 때, local minimum 에 빠졌다고, 판단할 수 있었습니다.

batch size =1 이기 때문에, 이미지 input 한개 한개 에 대해서, 많은 영향을 받을 수 밖에 없으며,

또한, 이와 같은 환경에서, 여러번 실험 해보았으나, 각 epoch 마다, accuracy 가 10-20% 이상 증가하고, 감소 하는것으로 보아

local minimum 에 빠져, 위와 같은 결과가 나온것이라 판단합니다.

접기/펼치기 버튼

스크린샷 2021-02-09 오후 11 00 38

Loaded pretrained weights for efficientnet-b0
Epoch: [0][   0/1596]	Time  0.281 ( 0.281)	Data  0.000 ( 0.000)	Loss 1.4905e+00 (1.4905e+00)	Acc@1   0.00 (  0.00)
Epoch: [0][ 200/1596]	Time  0.203 ( 0.181)	Data  0.000 ( 0.000)	Loss 1.3444e+00 (1.3959e+00)	Acc@1 100.00 ( 24.38)
Epoch: [0][ 400/1596]	Time  0.169 ( 0.181)	Data  0.000 ( 0.000)	Loss 1.1246e+00 (1.3934e+00)	Acc@1 100.00 ( 25.44)
Epoch: [0][ 600/1596]	Time  0.199 ( 0.180)	Data  0.000 ( 0.000)	Loss 1.2768e+00 (1.3892e+00)	Acc@1 100.00 ( 25.79)
Epoch: [0][ 800/1596]	Time  0.159 ( 0.180)	Data  0.000 ( 0.000)	Loss 1.3381e+00 (1.3823e+00)	Acc@1   0.00 ( 26.72)
Epoch: [0][1000/1596]	Time  0.160 ( 0.180)	Data  0.000 ( 0.000)	Loss 1.1534e+00 (1.3685e+00)	Acc@1 100.00 ( 29.97)
Epoch: [0][1200/1596]	Time  0.179 ( 0.180)	Data  0.000 ( 0.000)	Loss 7.6266e-01 (1.3463e+00)	Acc@1 100.00 ( 33.81)
Epoch: [0][1400/1596]	Time  0.190 ( 0.181)	Data  0.000 ( 0.000)	Loss 1.4622e+00 (1.3193e+00)	Acc@1   0.00 ( 36.83)
Test: [  0/184]	Time  0.089 ( 0.089)	Loss 1.2842e+00 (1.2842e+00)	Acc@1   0.00 (  0.00)
 * Acc@1 51.630
Epoch: [1][   0/1596]	Time  0.281 ( 0.281)	Data  0.000 ( 0.000)	Loss 2.7238e+00 (2.7238e+00)	Acc@1   0.00 (  0.00)
Epoch: [1][ 200/1596]	Time  0.173 ( 0.182)	Data  0.000 ( 0.000)	Loss 6.4961e-01 (7.2235e-01)	Acc@1 100.00 ( 79.10)
Epoch: [1][ 400/1596]	Time  0.174 ( 0.182)	Data  0.000 ( 0.000)	Loss 3.2509e-01 (6.6445e-01)	Acc@1 100.00 ( 81.80)
Epoch: [1][ 600/1596]	Time  0.206 ( 0.182)	Data  0.000 ( 0.000)	Loss 6.6027e-02 (6.1535e-01)	Acc@1 100.00 ( 83.19)
Epoch: [1][ 800/1596]	Time  0.182 ( 0.181)	Data  0.000 ( 0.000)	Loss 4.2142e-01 (5.5878e-01)	Acc@1 100.00 ( 84.52)
Epoch: [1][1000/1596]	Time  0.180 ( 0.181)	Data  0.000 ( 0.000)	Loss 6.2518e-01 (5.2224e-01)	Acc@1 100.00 ( 85.51)
Epoch: [1][1200/1596]	Time  0.175 ( 0.181)	Data  0.000 ( 0.000)	Loss 4.2768e-02 (5.0426e-01)	Acc@1 100.00 ( 85.93)
Epoch: [1][1400/1596]	Time  0.194 ( 0.181)	Data  0.000 ( 0.000)	Loss 6.1021e-02 (4.9043e-01)	Acc@1 100.00 ( 85.94)
Test: [  0/184]	Time  0.096 ( 0.096)	Loss 1.5377e-01 (1.5377e-01)	Acc@1 100.00 (100.00)
 * Acc@1 57.065
Epoch: [2][   0/1596]	Time  0.277 ( 0.277)	Data  0.000 ( 0.000)	Loss 7.8205e-02 (7.8205e-02)	Acc@1 100.00 (100.00)
Epoch: [2][ 200/1596]	Time  0.206 ( 0.183)	Data  0.000 ( 0.000)	Loss 1.6911e-01 (1.5629e-01)	Acc@1 100.00 ( 97.01)
Epoch: [2][ 400/1596]	Time  0.186 ( 0.183)	Data  0.000 ( 0.000)	Loss 4.7998e-02 (2.1530e-01)	Acc@1 100.00 ( 94.01)
Epoch: [2][ 600/1596]	Time  0.186 ( 0.183)	Data  0.000 ( 0.000)	Loss 1.1497e-02 (1.9376e-01)	Acc@1 100.00 ( 94.34)
Epoch: [2][ 800/1596]	Time  0.164 ( 0.183)	Data  0.000 ( 0.000)	Loss 9.5126e-03 (1.7779e-01)	Acc@1 100.00 ( 95.01)
Epoch: [2][1000/1596]	Time  0.183 ( 0.184)	Data  0.000 ( 0.000)	Loss 1.4673e-02 (1.7213e-01)	Acc@1 100.00 ( 94.91)
Epoch: [2][1200/1596]	Time  0.192 ( 0.184)	Data  0.000 ( 0.000)	Loss 8.1333e-02 (1.6600e-01)	Acc@1 100.00 ( 95.25)
Epoch: [2][1400/1596]	Time  0.197 ( 0.183)	Data  0.000 ( 0.000)	Loss 1.3153e-01 (1.8279e-01)	Acc@1 100.00 ( 94.93)
Test: [  0/184]	Time  0.101 ( 0.101)	Loss 1.5524e-02 (1.5524e-02)	Acc@1 100.00 (100.00)
 * Acc@1 58.696
Epoch: [3][   0/1596]	Time  0.281 ( 0.281)	Data  0.000 ( 0.000)	Loss 8.8166e-01 (8.8166e-01)	Acc@1   0.00 (  0.00)
Epoch: [3][ 200/1596]	Time  0.166 ( 0.180)	Data  0.000 ( 0.000)	Loss 2.4514e-03 (1.0979e-01)	Acc@1 100.00 ( 96.52)
Epoch: [3][ 400/1596]	Time  0.166 ( 0.181)	Data  0.000 ( 0.000)	Loss 8.4549e-02 (9.7078e-02)	Acc@1 100.00 ( 96.76)
Epoch: [3][ 600/1596]	Time  0.158 ( 0.181)	Data  0.000 ( 0.000)	Loss 4.6538e-02 (1.0783e-01)	Acc@1 100.00 ( 96.34)
Epoch: [3][ 800/1596]	Time  0.194 ( 0.181)	Data  0.000 ( 0.000)	Loss 2.5155e-03 (1.0136e-01)	Acc@1 100.00 ( 96.88)
Epoch: [3][1000/1596]	Time  0.170 ( 0.181)	Data  0.000 ( 0.000)	Loss 8.7595e-03 (9.6627e-02)	Acc@1 100.00 ( 97.00)
Epoch: [3][1200/1596]	Time  0.159 ( 0.181)	Data  0.000 ( 0.000)	Loss 2.9581e-01 (1.0998e-01)	Acc@1 100.00 ( 96.42)
Epoch: [3][1400/1596]	Time  0.196 ( 0.181)	Data  0.000 ( 0.000)	Loss 8.5525e-02 (1.0266e-01)	Acc@1 100.00 ( 96.79)
Test: [  0/184]	Time  0.088 ( 0.088)	Loss 1.2429e-01 (1.2429e-01)	Acc@1 100.00 (100.00)
 * Acc@1 57.065
Epoch: [4][   0/1596]	Time  0.285 ( 0.285)	Data  0.000 ( 0.000)	Loss 7.8266e-04 (7.8266e-04)	Acc@1 100.00 (100.00)
Epoch: [4][ 200/1596]	Time  0.158 ( 0.183)	Data  0.000 ( 0.000)	Loss 3.1997e-02 (6.3708e-02)	Acc@1 100.00 ( 99.00)
Epoch: [4][ 400/1596]	Time  0.178 ( 0.182)	Data  0.000 ( 0.000)	Loss 1.6696e-03 (7.3866e-02)	Acc@1 100.00 ( 98.00)
Epoch: [4][ 600/1596]	Time  0.190 ( 0.182)	Data  0.000 ( 0.000)	Loss 3.9160e-03 (6.4712e-02)	Acc@1 100.00 ( 98.34)
Epoch: [4][ 800/1596]	Time  0.180 ( 0.182)	Data  0.000 ( 0.000)	Loss 9.8097e-04 (6.5225e-02)	Acc@1 100.00 ( 98.25)
Epoch: [4][1000/1596]	Time  0.208 ( 0.181)	Data  0.000 ( 0.000)	Loss 9.1725e-04 (6.1493e-02)	Acc@1 100.00 ( 98.40)
Epoch: [4][1200/1596]	Time  0.200 ( 0.181)	Data  0.000 ( 0.000)	Loss 2.0247e-02 (6.2357e-02)	Acc@1 100.00 ( 98.25)
Epoch: [4][1400/1596]	Time  0.162 ( 0.181)	Data  0.000 ( 0.000)	Loss 9.7323e-04 (6.9955e-02)	Acc@1 100.00 ( 97.72)
Test: [  0/184]	Time  0.098 ( 0.098)	Loss 4.3770e-02 (4.3770e-02)	Acc@1 100.00 (100.00)
 * Acc@1 48.913
Epoch: [5][   0/1596]	Time  0.284 ( 0.284)	Data  0.000 ( 0.000)	Loss 2.0039e-03 (2.0039e-03)	Acc@1 100.00 (100.00)
Epoch: [5][ 200/1596]	Time  0.188 ( 0.180)	Data  0.000 ( 0.000)	Loss 2.7880e-03 (2.5582e-02)	Acc@1 100.00 ( 99.00)
Epoch: [5][ 400/1596]	Time  0.176 ( 0.180)	Data  0.000 ( 0.000)	Loss 9.5200e-03 (2.9331e-02)	Acc@1 100.00 ( 99.00)
Epoch: [5][ 600/1596]	Time  0.164 ( 0.180)	Data  0.000 ( 0.000)	Loss 6.2982e-04 (3.2622e-02)	Acc@1 100.00 ( 99.17)
Epoch: [5][ 800/1596]	Time  0.159 ( 0.180)	Data  0.000 ( 0.000)	Loss 1.1086e-01 (3.5885e-02)	Acc@1 100.00 ( 99.25)
Epoch: [5][1000/1596]	Time  0.175 ( 0.180)	Data  0.000 ( 0.000)	Loss 2.7320e-03 (4.1057e-02)	Acc@1 100.00 ( 99.00)
Epoch: [5][1200/1596]	Time  0.160 ( 0.180)	Data  0.000 ( 0.000)	Loss 3.0799e-04 (5.5722e-02)	Acc@1 100.00 ( 98.50)
Epoch: [5][1400/1596]	Time  0.166 ( 0.180)	Data  0.000 ( 0.000)	Loss 2.1393e-02 (6.7442e-02)	Acc@1 100.00 ( 98.07)
Test: [  0/184]	Time  0.103 ( 0.103)	Loss 3.9239e-02 (3.9239e-02)	Acc@1 100.00 (100.00)
 * Acc@1 61.957

  • batch_size = 16

    batch_size=1 과는 다르게, 빠른 속도로 학습이 되어가는 것을 확인할 수 있었습니다.

    5 epoch 를 학습하였지만,

    train_acc95 ~ 96에 가까이 수렴하였고,

    test_acc96~97 가까이 올라간 것을 확인할 수 있었습니다.

접기/펼치기 버튼

스크린샷 2021-02-09 오후 11 05 33

Loaded pretrained weights for efficientnet-b0
Epoch: [0][  0/100]	Time  1.444 ( 1.444)	Data  0.000 ( 0.000)	Loss 1.4199e+00 (1.4199e+00)	Acc@1  18.75 ( 18.75)
Epoch: [0][ 50/100]	Time  1.174 ( 1.123)	Data  0.000 ( 0.000)	Loss 1.2743e+00 (1.3255e+00)	Acc@1  43.75 ( 41.05)
Test: [ 0/12]	Time  0.564 ( 0.564)	Loss 8.6686e-01 (8.6686e-01)	Acc@1  68.75 ( 68.75)
 * Acc@1 69.022
Epoch: [1][  0/100]	Time  1.677 ( 1.677)	Data  0.000 ( 0.000)	Loss 8.6776e-01 (8.6776e-01)	Acc@1  81.25 ( 81.25)
Epoch: [1][ 50/100]	Time  1.143 ( 1.115)	Data  0.000 ( 0.000)	Loss 5.6067e-01 (7.1666e-01)	Acc@1  81.25 ( 73.41)
Test: [ 0/12]	Time  0.598 ( 0.598)	Loss 4.9185e-01 (4.9185e-01)	Acc@1  81.25 ( 81.25)
 * Acc@1 81.522
Epoch: [2][  0/100]	Time  1.692 ( 1.692)	Data  0.000 ( 0.000)	Loss 3.8097e-01 (3.8097e-01)	Acc@1  87.50 ( 87.50)
Epoch: [2][ 50/100]	Time  1.118 ( 1.122)	Data  0.000 ( 0.000)	Loss 3.8521e-01 (4.6015e-01)	Acc@1  87.50 ( 82.60)
Test: [ 0/12]	Time  0.614 ( 0.614)	Loss 3.4018e-01 (3.4018e-01)	Acc@1  81.25 ( 81.25)
 * Acc@1 86.957
Epoch: [3][  0/100]	Time  1.736 ( 1.736)	Data  0.000 ( 0.000)	Loss 3.0147e-01 (3.0147e-01)	Acc@1  81.25 ( 81.25)
Epoch: [3][ 50/100]	Time  1.133 ( 1.150)	Data  0.000 ( 0.000)	Loss 2.3493e-01 (2.7778e-01)	Acc@1  93.75 ( 91.30)
Test: [ 0/12]	Time  0.617 ( 0.617)	Loss 2.4183e-01 (2.4183e-01)	Acc@1  93.75 ( 93.75)
 * Acc@1 96.196
Epoch: [4][  0/100]	Time  1.718 ( 1.718)	Data  0.000 ( 0.000)	Loss 2.1611e-01 (2.1611e-01)	Acc@1  93.75 ( 93.75)
Epoch: [4][ 50/100]	Time  1.141 ( 1.155)	Data  0.000 ( 0.000)	Loss 1.3752e-01 (1.6329e-01)	Acc@1 100.00 ( 94.85)
Test: [ 0/12]	Time  0.609 ( 0.609)	Loss 2.2088e-01 (2.2088e-01)	Acc@1  93.75 ( 93.75)
 * Acc@1 96.739
Epoch: [5][  0/100]	Time  1.724 ( 1.724)	Data  0.000 ( 0.000)	Loss 1.6129e-01 (1.6129e-01)	Acc@1  93.75 ( 93.75)
Epoch: [5][ 50/100]	Time  1.146 ( 1.158)	Data  0.000 ( 0.000)	Loss 9.8415e-02 (1.5447e-01)	Acc@1 100.00 ( 95.22)
Test: [ 0/12]	Time  0.620 ( 0.620)	Loss 1.5108e-01 (1.5108e-01)	Acc@1  93.75 ( 93.75)
 * Acc@1 96.196

single-gpu

  • batch_size = 32, epoch =20

    아래와 같이, test_accuracy 가 이미 충분히 수렴을 한것을 확인할 수 있었습니다.

    train_acc99 에 가까이 수렴하는 등, noise 를 고려한다면, 이미 충분히 수렴을 하였고,

    test_acc99.457 에 수렴한 것으로 보아, 더 이상 학습은 무의미하다고 판단을 하였기에

    앞으로는, GPU Memory 할당을 중점적으로 살펴보겠습니다.
접기/펼치기 버튼

스크린샷 2021-02-09 오후 11 23 36

@heojae heojae changed the title [DeepLearning] cpu, single gpu, multi gpu(data parallel, custom data parallel, distributed parallel, apex) 를 통한 학습결과 정리 [DeepLearning] cpu, single gpu, multi gpu(data parallel, custom data parallel, distributed parallel, apex) 를 통한 학습 Feb 7, 2021
@heojae
Copy link
Owner Author

heojae commented Feb 9, 2021

GPU 메모리 할당 자세히 살펴보기

Single Gpu

batch_size = 128에서 터진것을 확인할 수 있었습니다.

  • batch_size = 32
    스크린샷 2021-02-09 오후 11 32 20
  • batch_size = 64
    스크린샷 2021-02-09 오후 11 34 35
  • batch_size = 96
    스크린샷 2021-02-09 오후 11 35 39
  • 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)

@heojae
Copy link
Owner Author

heojae commented Feb 9, 2021

Data Parallel

Data Parallel 의 경우, loss 를 gather 를 하기 때문에, 각각의 GPU에 다른 양의 Memory 가 할당이 되었던것을 확인할 수 있었습니다.

균등하게 메모리가 할당이 되지 않는 것을 확인할 수 있었습니다.

batch_size = 210 까지 올렸더니, 확실하게, Loss 가 하나의 GPU 에 몰리는 것을 확인할 수 있었습니다.

  • batch_size = 96, gpu =0,1

스크린샷 2021-02-09 오후 11 54 09

  • batch_size = 210, gpu =0,1,2

스크린샷 2021-02-10 오전 1 13 01

@heojae
Copy link
Owner Author

heojae commented Feb 9, 2021

Data Parallel Seperate (Custom Data Parallel)

data paraellel 과는 다른게, 각각의 GPU 상에서, loss, back propagation(grad) 등등을 하기에,

각각의 GPU 상에 잡힌 메모리가 다른 것을 확인 할 수 있었습니다.

  • batch_size=210, gpu=0,1,2

스크린샷 2021-02-10 오전 1 20 09

@heojae
Copy link
Owner Author

heojae commented Feb 9, 2021

Distributed Data Parallel

data paralleldata parallel seperate 보다도,

확실하게, 균등하게 각 GPU 상에 Memory 가 잡히는 것을 확인 할 수 있었습니다.

  • batch_size=210, gpu=0,1,2

스크린샷 2021-02-10 오전 1 27 10

@heojae
Copy link
Owner Author

heojae commented Feb 9, 2021

Nvidia Apex


이부분의 환경설정은 https://github.com/NVIDIA/apex 에 있는대로 참고하여,
설정하였습니다.


거의 균등하게, GPU 상에 메모리가 잡히는 것을 확인할 수 있었지만,

distributed_data_parallel.py 보다, 같은 batch_size 일 때, 더 많은 양의 Memory 가 GPU 상에 잡히는 것을 확인할 수 있었습니다.

또한, GPU-Util100% 가까이 활용하고 있다는 것 또한 확인할 수 있었습니다.

  • batch_size=210, gpu=0,1,2

스크린샷 2021-02-10 오전 1 31 58

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant