heojae / FoodImageRotationAdmin

Food Image Rotation (음식이미지 회전) 이라는 주제에 대해서. 실제로 딥러닝(deeplearning)을 어떻게 도입하고, 이를 API(backend)로서 서버에 올리며, 웹(frontend) 를 통해서 올리는 과정을 구현하기 위해서 만든 프로젝트입니다.
0 stars 0 forks source link

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

Open heojae opened 3 years ago

heojae commented 3 years ago

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

소주제 : 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 이기 때문에, 이미지input 한개 한개 에 대해서, 많은 영향을 받을 수 밖에 없으며,

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

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

접기/펼치기 버튼
![스크린샷 2021-02-09 오후 11 00 38](https://user-images.githubusercontent.com/41981538/107374189-ab335a80-6b2a-11eb-9c6d-c65fdd12f9a8.jpg) ``` 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 ```
접기/펼치기 버튼
![스크린샷 2021-02-09 오후 11 05 33](https://user-images.githubusercontent.com/41981538/107374835-63610300-6b2b-11eb-8ca1-14b15f1a0754.jpg) ``` 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

접기/펼치기 버튼
![스크린샷 2021-02-09 오후 11 23 36](https://user-images.githubusercontent.com/41981538/107377754-a53f7880-6b2e-11eb-8b54-b79c39e1a0c3.jpg)
heojae commented 3 years ago

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

Single Gpu

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

heojae commented 3 years ago

Data Parallel

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

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

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

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

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

heojae commented 3 years ago

Data Parallel Seperate (Custom Data Parallel)

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

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

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

heojae commented 3 years ago

Distributed Data Parallel

data paralleldata parallel seperate 보다도,

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

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

heojae commented 3 years ago

Nvidia Apex


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


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

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

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

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