ZeRO 의 역할과 최적화 단계

ZeRO 는 데이터 병렬 (data parallelism) 처리의 계산 및 메모리 자원을 활용하여 모델 학습 시 각 장치 (GPU) 의 메모리와 계산 요구 사항을 줄여줍니다. 이를 위해 ZeRO 는 모델 학습에 필요한 다양한 상태 (가중치, 그래디언트, 옵티마이저 상태) 를 분산된 학습 하드웨어 (GPU 및 CPU) 에 걸쳐 분할하여 각 GPU 의 메모리 사용량을 감소시킵니다.

구체적으로, ZeRO 는 최적화를 단계별로 점진적으로 구현하고 있으며, 초기 단계에서 적용된 최적화는 이후 단계에서도 계속 사용할 수 있습니다. ZeRO 에 대한 더 자세한 내용은 논문 을 참고하세요.

ZeRO-DP(Data Parallelism) 는 기존의 Data Parallelism 과 Model Parallelism 이 가진 메모리 문제를 해결하기 위한 솔루션입니다. 일반적인 Data Parallelism 에서는 모델 상태 (model states) 가 각 디바이스에 복제되면서 메모리 낭비가 발생하는데, ZeRO-DP 는 이러한 model states 를 분할하여 메모리 중복을 제거합니다.

ZeRO-DP 는 디바이스의 메모리가 충분히 크다면 매우 큰 모델도 처리할 수 있습니다. ZeRO 는 세 가지 주요 최적화 단계를 통해 이를 실현합니다.

B) 주요 최적화 단계

  1. Optimizer States Partitioning (Stage-1): 4 배의 메모리 절감
  2. Optimizer States Partitioning + Gradient Partitioning (Stage-2): 8 배의 메모리 절감
  3. Optimizer States Partitioning + Gradient Partitioning + Parameter Partitioning (Stage-3): GPU 개수에 따라 최대 64 배까지 메모리 절감 가능 (예: 64 개의 GPU 사용 시). 다만, 통신량 (Comm. Volume) 은 약 50% 증가합니다.

C) ZeRO-1

ZeRO-1 은 Optimizer States Partitioning 기법을 적용한 첫 번째 단계로, 주로 optimizer 상태를 분할하여 메모리를 절약하는 방식입니다.

D) ZeRO-2

ZeRO-2 는 기존 ZeRO-1 보다 더 큰 모델을 학습할 수 있도록 설계되어 있으며, 학습 효율성을 두 배로 향상시킵니다. 특히 Residual States 문제를 해결하고 gradient, activation 및 fragmented memory(메모리 단편화) 와 같은 다양한 학습 중 발생하는 메모리 소비 문제를 개선합니다.

D.1) 세부 최적화 내용

  • Model State Memory: ZeRO-1 에서 사용된 Optimizer States Partitioning(Stage-1) 에 추가적으로 Gradient Partitioning(Stage-2) 을 적용하여 디바이스당 소비되는 메모리를 두 배 더 줄입니다.

  • Activation Memory: Activation partitioning 기법을 통해 model parallelism 에서 발생하는 activation 복제를 제거합니다. 만약 모델 크기가 매우 크거나 GPU 메모리가 부족한 경우에는 activation 데이터를 CPU 로 옮겨서 처리할 수도 있습니다.

  • Fragmented Memory: 학습 중 tensor 들의 생명 주기가 달라지면서 발생하는 메모리 단편화를 해결합니다. 이로 인해 가용한 연속적인 공간이 부족해지는 상황에서도 효율적으로 공간을 활용할 수 있게 됩니다.

  • Constant Size Buffer: All-reduce 과정에서 사용하는 Bucket 사이즈를 일정하게 유지함으로써 성능을 최적화합니다. Bucket 사이즈가 어느 정도 크게 유지되기만 해도 충분히 좋은 효율성을 얻을 수 있습니다.

E) With Megatron

Megatron-LM 은 tensor-slicing model parallelism 를 사용한다. Megatron-LM 의 tensor-slicing model parallelism 에 DeepSpeed ZeRO-2 의 data parallelism 을 추가하면 DeepSpeed 가 Megatron-LM 보다 10x 더 빠르다.

F) ZeRO

G) Zero2

zero2-bf16.yaml

H) DeepSpeed ZeRO: 메모리 최적화 기법

ZeRO(Zero Redundancy Optimizer)는 데이터 병렬 처리(Data Parallelism) 상황에서 발생하는 메모리 중복을 제거하여 각 GPU의 메모리 부담을 획기적으로 줄이는 기술입니다. 훈련에 필요한 구성요소(모델 파라미터, 그래디언트, 옵티마이저 상태)를 여러 GPU에 분산하여 저장하는 방식입니다.

구분ZeRO-1ZeRO-2ZeRO-3
분할 대상옵티마이저 상태 (Optimizer States)ZeRO-1 대상 + 그래디언트 (Gradients)ZeRO-2 대상 + 모델 파라미터 (Parameters)
메모리 절약약 4배약 8배GPU 수(N)에 비례하여 크게 증가
핵심 아이디어옵티마이저 상태(예: Adam의 모멘텀, 분산)는 훈련 중 메모리를 많이 차지하지만, 업데이트 시에만 필요합니다. 이를 GPU들에 분할 저장하여 메모리 중복을 없앱니다.그래디언트 또한 파라미터 업데이트 시에만 전체가 필요하므로, 이 역시 분할하여 메모리 사용량을 더욱 줄입니다.모델의 파라미터(가중치) 자체를 분할합니다. 각 GPU는 전체 모델의 일부 파라미터만 보유하고, 순전파/역전파 시 필요한 파라미터를 다른 GPU로부터 가져와 사용합니다. 가장 높은 수준의 메모리 절약을 제공합니다.

I) 모델 병렬 처리 기법

모델 병렬 처리는 모델 자체가 너무 커서 단일 GPU에 올라가지 않을 때, 모델을 여러 GPU로 분할하는 기술입니다.

구분데이터 병렬 (DP)
Data Parallelism
텐서 병렬 (TP)
Tensor Parallelism
파이프라인 병렬 (PP)
Pipeline Parallelism
시퀀스 병렬 (SP)
Sequence Parallelism
개념동일한 모델을 여러 GPU에 복제하고, 데이터를 분할하여 처리모델의 **단일 레이어(연산)**를 여러 GPU로 분할하여 병렬 처리모델을 여러 레이어 청크로 나누어 각기 다른 GPU에 할당Transformer의 입력 시퀀스를 분할하여 병렬 처리
분할 단위미니배치 데이터행렬 연산 (텐서)모델 레이어 그룹입력 데이터의 시퀀스 차원
장점구현이 가장 간단하고 일반적입니다.매우 큰 레이어를 가진 모델(Wide Model)에 효과적입니다. GPU 간 통신량이 비교적 적습니다.매우 깊은 모델(Deep Model)에 효과적입니다. 활성화(Activation) 메모리를 절약할 수 있습니다.긴 시퀀스(Long Context)에서 급증하는 Attention 계산량과 활성화 메모리를 크게 줄여줍니다.
단점각 GPU가 모델 전체를 복제해야 하므로 메모리 비효율성이 발생합니다.구현이 복잡하고, 일부 레이어에만 적용 가능합니다.파이프라인 버블(bubble)로 인한 GPU 유휴 시간(idle time)이 발생할 수 있습니다.Transformer 아키텍처에 특화되어 있으며, 텐서 병렬(TP)과 함께 사용될 때 가장 효과적입니다.
주요 적용 대상대부분의 딥러닝 훈련거대한 은닉층을 가진 모델
(예: GPT의 MLP, Attention)
수백 개의 레이어를 가진 초거대 모델
(예: GPT-3)
문서 요약, 긴 대화 등 긴 컨텍스트를 처리하는 모델

*사용자께서 질문하신 컨텍스트 병렬 처리(Context Parallelism) 는 일반적으로 시퀀스 병렬 처리(Sequence Parallelism) 와 동일한 개념으로 사용됩니다. 특히 Transformer 모델에서 입력의 길이를 ‘Context’라고 부르기 때문입니다.


I.1.1) 기술들의 조합: 어떻게 함께 사용되는가?

현대의 초거대 모델 훈련은 위 기술들을 복합적으로 사용합니다.

  1. 기본은 데이터 병렬(DP): 훈련 속도 향상을 위해 여러 GPU로 데이터를 분산 처리하는 것이 기본입니다.

  2. 메모리 부족 해결사, ZeRO: DP 환경에서 각 GPU의 메모리가 부족하면 ZeRO를 적용하여 메모리 사용량을 줄입니다. (예: ZeRO-DP)

  3. 모델이 너무 클 때, PP와 TP: ZeRO를 사용해도 모델이 단일 GPU 메모리에 맞지 않으면, 모델 자체를 분할합니다.

    • 파이프라인 병렬(PP) 로 모델을 여러 GPU에 걸쳐 분산시키고,

    • 텐서 병렬(TP) 로 개별 레이어의 크기를 줄입니다.

  4. 컨텍스트가 너무 길 때, SP: 긴 문서나 대화를 처리해야 해서 입력 시퀀스가 길어지면, 시퀀스 병렬(SP) 을 추가하여 활성화 메모리 부담을 줄입니다.

결론적으로, 초거대 모델은 데이터 병렬(DP) + 파이프라인 병렬(PP) + 텐서 병렬(TP) + 시퀀스 병렬(SP) 을 모두 조합하고, 여기에 ZeRO를 더해 각 GPU의 메모리 효율을 극대화하는 방식으로 훈련됩니다. 이를 3D Parallelism (+ZeRO) 이라고도 부릅니다.

I.2) ZeRO-3 Vs 텐서 병렬(TP) 비교

 ZeRO-3와 TP는 같지 않습니다.

  • ZeRO-3데이터 병렬(Data Parallelism)의 메모리 최적화 기법입니다.

  • TP (Tensor Parallelism)모델 병렬(Model Parallelism)의 한 종류로, 연산 자체를 분할하는 기법입니다.

아래 비교를 통해 명확하게 이해하실 수 있습니다.

구분ZeRO-3 (메모리 최적화)텐서 병렬 (TP) (모델 병렬)
주요 목표메모리 절약. 데이터 병렬 처리 시 각 GPU가 모델 전체 파라미터를 복제해 갖는 메모리 중복을 제거하는 것이 목표입니다.모델 분할 및 연산 병렬화. 단일 GPU에 담을 수 없는 거대한 레이어(예: 20GB짜리 Weight 행렬)를 여러 GPU로 쪼개어 동시에 연산하는 것이 목표입니다.
동작 방식1. 평소에는 각 GPU가 전체 파라미터의 일부만 저장합니다(1/N).
2. 순전파(Forward) 시, 특정 레이어를 계산할 때 필요한 전체 파라미터를 다른 GPU로부터 All-Gather로 가져옵니다.
3. 가져온 전체 파라미터로 표준 연산을 수행합니다.
4. 연산이 끝나면 필요 없어진 파라미터를 **즉시 해제(Discard)**합니다.
1. 시작부터 거대한 파라미터(Weight 행렬)를 물리적으로 조각내어(Shard) 각 GPU가 나눠 갖습니다.
2. 순전파(Forward) 시, 입력 텐서(Activation)도 쪼개거나 복제하여 각 GPU가 자신이 가진 조각난 파라미터로 연산을 수행합니다.
3. 각 GPU에서 계산된 부분 결과를 All-Reduce 같은 통신으로 합쳐 최종 결과를 만듭니다.
기반 철학”파라미터는 연산하는 그 순간에만 전체가 필요하다. 평소에는 분산 저장하여 메모리를 아끼자.""하나의 행렬 곱셈이 너무 크다. 여러 GPU가 동시에 힘을 합쳐 이 계산을 해치우자.”
통신 오버헤드순전파/역전파 시 각 레이어마다 전체 파라미터를 모으고 흩뿌리는 통신이 발생합니다.연산 중간에 부분 결과를 합치는 통신이 발생합니다.
어떤 관계인가?데이터 병렬(DP)의 확장판입니다. ZeRO는 DP를 전제로 동작합니다.데이터 병렬(DP)과 직교(orthogonal) 관계입니다. DP와 함께 사용될 수 있습니다.

I.2.1) 비유를 통한 이해

  • ZeRO-3공용 창고와 개인 작업대

    • 여러 명의 기술자(GPU)가 있습니다. 거대한 엔진(모델)을 조립해야 하는데, 각자의 작업대(VRAM)는 좁습니다.

    • 그래서 모든 공구(파라미터)를 중앙 공용 창고(여러 GPU의 메모리 공간에 분산 저장)에 둡니다.

    • 기술자 A가 특정 부품(레이어)을 조립할 차례가 되면, 창고에 가서 필요한 모든 공구(해당 레이어의 전체 파라미터)를 빌려와 작업을 마친 뒤, 즉시 반납합니다.

    • 핵심은 ‘빌려와서 혼자 작업하고 반납’하는 것입니다.

  • 텐서 병렬(TP)거대한 부품을 동시에 조립하는 여러 기술자

    • 하나의 부품(하나의 큰 행렬)이 너무 커서 기술자(GPU) 한 명이 들거나 작업할 수 없습니다.

    • 그래서 이 부품을 네 조각으로 잘라 네 명의 기술자가 각자 한 조각씩 맡아 동시에 작업합니다.

    • 작업이 끝나면 각자의 결과물을 합쳐서 완전한 결과를 만듭니다.

    • 핵심은 ‘하나의 일을 동시에 나눠서 처리’하는 것입니다.

I.2.2) 결론: 어떻게 함께 사용되는가?

현대의 초거대 모델 훈련에서는 이 둘을 함께 사용합니다.

  1. 모델의 특정 레이어가 너무 커서 한 GPU의 VRAM에 올릴 수 없을 때, TP를 사용해 레이어 자체를 여러 GPU에 분할합니다.

  2. 이렇게 TP로 분할된 모델조차도 전체 파라미터의 양이 엄청나므로, 데이터 병렬 학습을 위해 여러 GPU에 모델을 복제하면 메모리가 부족해집니다.

  3. 이때 ZeRO-3를 적용하여, TP로 분할된 파라미터를 포함한 모든 파라미터, 그래디언트, 옵티마이저 상태를 여러 데이터 병렬 그룹(Data Parallel Ranks)에 걸쳐 분산 저장합니다.

즉, TP로 모델의 ‘너비’를 줄이고, ZeRO-3로 ‘메모리 사용량’을 최적화하는, 상호 보완적인 관계로 함께 활용됩니다.

J) References