개인공부&프로젝트

GPU 병렬화 기법

백악기작은펭귄 2025. 2. 4.
반응형

GPU 병렬화 기법

GPU 병렬화는 수천 개의 코어를 활용하여 대규모 데이터를 동시에 처리하는 기술로, 딥러닝과 같은 고성능 컴퓨팅에서 필수적인 최적화 방식이다. 특히 LLM(Large Language Models)과 같은 대형 모델을 학습하거나, 방대한 데이터를 처리할 때 필수적인 기술로, 여러 작업을 병렬로 수행함으로써 전체 처리 시간을 크게 단축할 수 있다. 이러한 병렬화 기법에는 데이터 병렬 처리(DP), 모델 병렬 처리(MP), 파이프라인 병렬 처리(PP), 텐서 병렬 처리(TP), 그리고 완전 공유 데이터 병렬 처리(FSDP) 등이 있다.

 

데이터 병렬 처리

데이터 병렬 처리(Data Parallelism, DP)대규모 데이터셋을 여러 개의 작은 배치로 나누고, 동일한 모델을 여러 GPU에 복사하여 병렬로 학습하는 기법이다. 각 GPU는 동일한 모델 구조와 초기값을 갖고 독립적으로 순전파와 역전파를 수행하며, 이후 개별적으로 계산된 그래디언트를 수집하여 모든 모델 복사본의 파라미터를 동기화한다.

 

이 방식은 여러 GPU가 데이터를 동시에 처리하여 학습 속도를 단축할 수 있으며 데이터셋 크기에 따라 쉽게 확장할 수 있다는 장점이 있다. 하지만 모델이 GPU마다 동일하게 복사되므로 VRAM 사용량이 크며, 각 GPU의 VRAM보다 큰 모델은 DP 방식으로 학습할 수 없다는 단점이 존재한다. 또한 그래디언트 동기화 과정에서 네트워크 오버헤드가 발생하여 GPU 수가 많아질수록 성능이 선형적으로 증가하지 않는 문제가 있다.

 

모델 병렬화

모델 병렬화(Model Parallerism, MP) 대규모 신경망 모델을 여러 GPU에 나누어 처리하는 방식이다. 이 방법은 모델을 레이어(layer) 단위로 분할해 각 부분을 서로 다른 GPU에서 실행한다. 즉, 연산이 순차적으로 진행되며 결과가 다음 GPU로 전달되게 된다. 주로 `.to()` 메서드를 활용해 모델의 각 레이어를 특정 GPU에 직접 할당하는 방식을 사용하는데, 이러한 방식으로 모델을 나누어 처리하는 것을 수직 모델 병렬화(Vertical Model Parallerism)라고 한다.

 

이 방식을 사용하면 모델이 너무 커서 개별 GPU의 VRAM에 적재할 수 없을 때 유용하며, 데이터 병렬 처리와 결합하여 사용할 수도 있다. 하지만 앞 GPU가 연산을 끝내야 다음 GPU가 실행 가능하므로 GPU 활용률이 낮아지는 문제(Bubble Issue)가 발생할 수 있으며, 추가적인 연산 속도 향상을 기대하기 어렵다는 단점이 있다.

 

파이프라인 병렬화

파이프라인 병렬화(Pipeline Parallerism, PP)는 모델의 레이어를 여러 GPU에 나누어 배치하고, 여러 미니배치(mini-batch)를 동시에 처리함으로써 GPU의 활용도를 높이는 기법이다. 기본적으로는 MP 방식과 유사하지만, GPU가 유휴(idle) 상태로 대기하는 시간을 최소화하기 위해 여러 미니배치를 동시에 처리하는 마이크로 배칭(Micro-Batching) 방식을 사용한다는 점이 차별점이다. 즉, MP에서는 한 배치의 연산이 완료될 때까지 다음 GPU가 대기해야 하지만, PP에서는 여러 개의 미니배치 단위로 계산을 실행하고 다음 GPU로 작업을 넘겨주어 대기 시간을 최소화한다. 이를 통해 각 GPU가 최대한 동시에 연산을 수행하도록 최적화된다.

 

이 방식을 활용하면 GPU 활용률을 향상시켜 MP 대비 더 높은 성능을 기대할 수 있으며, Bubble Issue를 완화할 수 있다. 하지만 여전히 초기 워밍업 단계에서는 일부 GPU가 유휴 상태가 될 가능성이 있으며, GPU 간 네트워크 오버헤드가 증가할 수 있다는 단점이 있다.

 

텐서 병렬 처리

텐서 병렬 처리(Tensor Parallerism, TP)는 대규모 딥러닝 모델의 주요 계산 부하를 분산하는 데 사용되는 방법으로, 모델의 큰 텐서를 여러 GPU에 나눠 할당하는 방식으로 동작한다. 즉, 한 개의 연산을 GPU 여러 개가 나누어 계산한 후 결과를 합쳐서 최종 출력을 생성하는 방식이다. 각 GPU가 전체 텐서의 일부만 처리하므로 메모리 요구량이 줄고 계산 효율이 높아진다. 예를 들어, 입력 행렬 $x$와 가중치 행렬 $W$를 곱해서 결과 행렬 $y$를 출력하는 연산에서, 가중치 행렬 $W$를 $W_1$, $W_2$, $W_3$로 나눈 뒤 각각을 서로 다른 GPU에 할당해서 $x\times W_1=y_1$, $x\times W_2=y_2$, $x\times W_3=y_3$을 계산한 뒤 이를 합쳐서 $concat(y_1, y_2, y_3)=y$로 결과를 출력할 수 있다.

 

이처럼 TP 방식을 활용하면 각 GPU가 작은 크기의 연산만 수행하므로 VRAM을 절약할 수 있고, 병렬로 연산을 수행하기 때문에 전체 연산 속도가 빨라진다는 장점이 있다. 이 방식을 사용하면 매우 큰 모델도 여러 GPU에서 연산을 나누어 처리할 수 있으며, DP와 결합하여 활용할 수도 있다. 하지만 여전히 GPU 간 통신 오버헤드가 발생할 가능성이 존재하며, 텐서를 적절히 분할하는 최적화가 필요하다는 단점이 있다.

 

Fully Shared Data Parallel

Fully Shared Data Parallel(FSDP)는 딥러닝에서 사용되는 고급 데이터 병렬 처리 기법 중 하나로, 특히 대규모 모델 학습에 효과적이다. 이는 모델의 모든 파라미터를 GPU 간에 분할(Shared)하여 메모리 사용을 최적화하는 기법으로, 모델을 샤드(shards)라고 하는 더 작은 조각으로 분할하고 각 GPU에 샤드를 할당해 실행하는 방식으로 동작한다. 이는 모든 GPU가 전체 모델의 파라미터를 갖고 있어야 하는 기존의 DP 방식과 대비된다. 또한 FSDP 방식에서 각 GPU는 할당된 샤드의 파라미터만을 메모리에 로드해 메모리 사용을 최적화하여 큰 모델을 더 적은 수의 GPU로 학습할 수 있게 한다. 게다가, 동적 샤드 로딩을 통해 학습 과정에서 필요에 따라 파라미터 샤드를 GPU 메모리에 로드하고, 사용이 끝나면 메모리에서 제거할 수 있어 메모리 리소스가 제한적인 환경에서 유용하다. 각 GPU는 자체적으로 계산한 그래디언트의 일부만 통신하여 모델의 파라미터를 업데이트하는 데 사용하며, 이를 통해 네트워크 통신 비용을 최소화한다.

 

FSDP 방식은 매우 큰 모델을 다수의 GPU에서 효과적으로 학습할 수 있게 해주어 메모리 요구량이 매우 높은 최신 딥러닝 모뎅레 필수적이며, 각 GPU가 필요한 파라미터만을 로드하므로 전체적인 메모리 효율성을 크게 향상시킨다. 또한 GPU 간에 파라미터를 동적으로 이동할 수 있어 다양한 학습 시나리오와 하드웨어 설정에 적응할 수 있다는 장점 또한 존재한다. 하지만 구현이 복잡하며 올바른 샤딩 전략과 메모리 관리가 필요하다는 단점이 존재한다. 또한 디버깅과 오류 추적이 복잡해질 수 있다.

 

결론

GPU 병렬화 기법은 대규모 딥러닝 모델을 효율적으로 학습하기 위한 핵심 기술이다. 데이터 병렬 처리는 단순하고 확장성이 뛰어나지만, VRAM 한계와 네트워크 오버헤드가 발생할 수 있다. 모델 병렬 처리와 파이프라인 병렬 처리는 매우 큰 모델을 처리하는 데 적합하지만, GPU 간 동기화 문제를 고려해야 한다.

텐서 병렬화는 하나의 연산을 여러 GPU에 나누어 수행하는 방식으로, 모델 크기가 매우 클 때 유용하다. FSDP는 데이터 병렬 방식의 VRAM 문제를 해결하면서도 네트워크 성능을 고려해야 하는 방식이다.

최신 대규모 모델에서는 이러한 병렬 기법을 단독으로 사용하기보다, 데이터 병렬 처리, 텐서 병렬 처리, 파이프라인 병렬 처리 등을 조합하여 최적화된 성능을 제공하는 혼합 병렬 방식을 활용한다. 이를 통해 GPU 자원을 최대한 효율적으로 활용하면서도, 대규모 모델을 효과적으로 학습할 수 있다.

반응형

댓글