끄적/모델 최적화 및 경량화

데이터 병렬화

uvumbu 2024. 12. 31. 22:00

 

1. 정의

데이터 병렬화는 3가지 단계로 나뉜다.

 

(1) 초기화 

모든 모델을 GPU에 복제해서 넣어주는 과정

즉 우리가 처리해야하는 데이터를 각 GPU의 개수에 맞게 더 작은 단위로 나눠서 할당하는 과정 

  • 모델을 모든 GPU에 복제하고, 데이터셋을 각각에 나눠 할당

 

(2) Forward Pass

각 GPU가 모델도 받았고 데이터도 받았으니, 그에 대한 각각의 연산을 병렬적으로 진행하는 과정

  • 각 GPU들은 할당받은 데이터에 대해 병렬적으로 연산을 수행

 

(3) Backward Pass

Gradient를 구하고 모델을 업데이트하는 과정

결과적으로 Forward 과정에서 얻은 결과들을 합치는 것이 필요하다.

그리고, 모델을 업데이트 해야 한다.

  • 각 GPU에서 계산된 Gradient를 하나의 Gradient로 합치고, 모델 업데이트 수행

 

 

2. 워크플로우

Backward Pass에서는 연산했던 것들을 합치고, 모델 업데이트하는 과정이 지속적으로 들어간다.

데이터 분할을 해서, 복제된 모델에 각 데이터들을 처리하면, Gradient 들을 구할 수 있을 것이다.

그리고 Forward를 통해서 나오는 Logit 값들이 있을텐데, 이들을 Backpropagation(역전파)를 통해 Gradient 들을 각각 구할 수 있다. 

그렇게 각각 구한 Gradient들을, 마스터 노드라고 해서 일종의 리더 역할을 하는 부분에 전달을 해주게 되면, 모든 Gradient값들을 전달 받아서, 이 값을 토대로 모델을 업데이트 시킨다.

즉, 파라미터를 업데이트한다.

우리가 지정하지 않는다면 보통 GPU 0번이 리더 역할을 한다.

그럼 그 리더는 다양한 GPU들이 갖고 있는 Gradient들을 통합하는 과정, 스왑하는 과정과 파라미터 업데이트하는 과정을 추가적으로 진행한다.

 

 

 

 

(1) 초기화

초기화는 2가지로 나뉜다.

처리해야 하는 데이터를 더 작은 단위로 나눠줘야 한다.

다음과 같은 예시가 있다고 하자.

 

 

기존의 배치 사이즈를 4개의 GPU를 사용하므로, 4로 쪼개서 넣어준다.

여기서 빨간색은 마스터 노드가 추가적으로 하는 역할이 있다는 것이다.

이 마스터 노드는 데이터를 전달해주고, 그 다음으로는 모델의 가중치들도 전달해준다.

0번이 갖고 있는 모델의 가중치들을 계속 전달해준다.

그 이유는 업데이트를 지속적으로 하는 과정과 그 결과를 배포하는 과정, 모두 0번이 해줄 것이기 때문이다.

 

결론적으로 마스터 노드가 데이터초기 모델들이 업데이트될때마다 지속적으로 배포하는 역할을 한다.

 

 

(2) Forward Pass

초기화를 거치면, 각 GPU에 모든 모델이 복사가 되고, 처리해야 하는 데이터들도 들어간다.

그럼 모델을 업데이트하려면 Forward Pass를 통해서  Logit 값들을 구해야 한다.

그리고 Logit에 대한 Loss 값을 계산해야 하고, 그 Loss로부터 Gradient를 구한다.

이를 통해 Backpropagation하면서 모델이 업데이트된다.

우리가 이것들을 나눠서 진행하다보니 Logit 값들도 나눠서 구하게 되고, 마스터 노드가 이들을 합치는 작업을 한다.

Loss뿐만 아니라 Gradient도 마찬가지다.

 

Forward와 같은 중심적인 연산은 각각 진행하고, 모든 모델들이 데이터를 처리한 Logit 값들을 마스터 노드에게 전달

각 GPU가 자기 데이터, 모델에 대해서 Reduction을 통해 loss를 구하게 되고, 마스터 노드는 이들을 합치는 작업을 진행한다.

  • 각 GPU는 Logit 값 계산 후, 마스터 노드에게 전달
  • 마스터 노드는 모든 Logit 값 취합
  • 마스터 노드는 전체 Logit에 대한 Loss값 계산

 

(3) Backward Pass

  • 마스터 노드가 자기가 계산한 Loss값을 각 GPU에 전달
  • 각 GPU는 각 Loss에 대해서 Backward 연산을 통해서 Gradient를 구하게 된다.
  • 마스터 노드는 각 Gradient들을 취합해서 최종 Gradient를 구한다.
  • 해당 Gradient를 기반으로 스스로 모델을 업데이트한다.

 

이렇게 업데이트된 모델은 마스터 노드만 갖고 있고, 나머지는 업데이트되지 않은 모델을 갖고 있는 상태다.

이를 동기화하기 위해서 이전의 초기화 작업을 다시 진행한다.

즉, 모델을 다시 한번 보내주고, 데이터도 다시 쪼개서 보내준다.

 

 

 

 

 

3. 문제점

마스터 노드 역할의 GPU가 너무 많은 일을 한다는 것이 문제다.

이로 인해 오버헤드가 발생한다.

  • 모든 GPU의 Logit, Gradient 취합 및 전체 Loss계산
  • 모델 파라미터 업데이트와 업데이트된 가중치 전달

 

 

4. 개선안 : DDP

위 문제점을 해결하기 위해 나온 것이 DDP(Distributed Data Parallelism)라는 것이다.

마스터 노드가 하는 일이 너무 많으니 마스터 노드를 없애자! 라는 것이다.

 

그럼 누가 그 역할을 대체할까?

모델 업데이트 : 한 명이 다 하는 것이 아니라, 모델 업데이트에 필요한 값들을 서로 주고 받고 각자 모델 업데이트를 한다.

 

 

 

 

'끄적 > 모델 최적화 및 경량화' 카테고리의 다른 글

PEFT 1 : 개요  (0) 2024.12.27
Quantization 2 : Quantization Mapping 기법들  (0) 2024.12.27
Quantization 1 : 개요  (0) 2024.12.26
KD 4 : Imitation Learning  (3) 2024.12.26
KD 3 : Feature - based KD  (0) 2024.12.26