pytorch distributeddataparallel (DDP) 와 dataparallel (DP) or Model 일 경우 확인 해야하는 것들 - jinwooklim/my-exp GitHub Wiki

참고 :

https://forums.pytorchlightning.ai/t/effective-learning-rate-and-batch-size-with-lightning-in-ddp/101/14

https://github.com/facebookresearch/moco/blob/master/main_moco.py#L174

--

pytorch에는 Model Distributeddataparallel (DDP) dataparallel (DP)

세가지 모델 표현 방법? 이 있다.

기본 모델 표현 방법은 Model 이고, 이를 wraping 하여 DP와 DDP를 만들게 된다.

그리고 실제 동작의 경우는 Model과 DP는 유사하다. Single Process / Single Process - multi threading 방식이기 때문이다.

하지만, DDP의 경우에는 조금 골치아파진다. 바로 Multi Process 방법이기 때문이다.

예를 들면, DP의 경우에는 batch를 각 gpu로 나누어 보내고 나중에 한 gpu로 다시 모아와 loss를 계산하고, 이를 이용해서 gradient를 구하고, 모델 parameter update를 진행한다. (즉, 단순하게 모든 gradient의 sum을 이용한다고 할 수 있다.)

하지만 DDP의 경우에는 data loader부터 data를 쪼개서 각 gpu로 보내고 그 각 gpu에서 loss를 계산하고, gradient들만 average를 취해 모델 parameter update를 진행한다. (즉, 각 gpu에서의 gradient의 average를 이용한다고 할 수 있다.)

ex) 8 gpu DDP == 1 gpu DP 를 갖게 만드는 법

number of gpu : 8

per gpu batch size : 32

per gpu learning rate : 3e-2 == 0.03

per gpu gradient : g/8

per gpu parameter delta : lr * g/8


number of gpu : 1

batch size : 256

learning rate : 0.03 / 8 == 0.00375

gradient : g

parameter delta : lr * g

즉, 실제 문제는 논문등에 나와있는 Batch size, learning rate 가 어떻게 구현했냐에 따라 영향을 받는다는 것이다.

그런데, 실제 이를 정확하게 아는 사람이 많은 것같지는 않다. 그러다 보니 논문에서 상세히 얘기가 없는 경우도 많고, 결과적으로 다시 성능을 재현하려고 보니 .. 실제로 보면 난감한 경우가 많다.