Parallelism vs Sharding
LLM 학습 문맥에서 parallelism과 sharding은 겹치지만 같은 말은 아니다.
Parallelism
여러 GPU가 일을 나눠 수행한다.
GPU 0
data A GPU 1
data B GPU 2
data C
예: DP는 같은 모델 복사본들이 서로 다른 데이터를 처리한다. data A GPU 1
data B GPU 2
data C
Sharding
큰 tensor나 state를 조각내 저장한다.
GPU 0
state 0 GPU 1
state 1 GPU 2
state 2
예: ZeRO는 optimizer state, gradient, parameter를 DP rank에 나눠 저장한다. state 0 GPU 1
state 1 GPU 2
state 2
핵심 구분은 다음과 같다.
parallelism = 일을 여러 GPU가 나눠 수행하는 전략
sharding = tensor나 state를 여러 GPU에 조각내 저장하는 방법
DP는 병렬화지만 샤딩은 아니다
vanilla DP에서는 모델이 GPU마다 복제된다.
GPU 0: full model
GPU 1: full model
GPU 2: full model
GPU 3: full model
나눠지는 것은 데이터다.
GPU 0: micro-batch A
GPU 1: micro-batch B
GPU 2: micro-batch C
GPU 3: micro-batch D
그래서 DP는 병렬화다. 하지만 parameter, gradient, optimizer state를 기본적으로 shard하지는 않는다.
ZeRO는 DP 위의 샤딩이다
ZeRO는 DP rank 사이의 중복 메모리를 줄이기 위해 optimizer state, gradient, parameter를 shard한다.
ZeRO-1: optimizer state sharding
ZeRO-2: optimizer state + gradient sharding
ZeRO-3: optimizer state + gradient + parameter sharding
즉 ZeRO는 DP와 무관한 별도 세계가 아니라, DP 축을 따라 중복된 학습 state를 나눠 저장하는 방법이다.
TP는 왜 헷갈리는가
Tensor Parallelism은 weight matrix를 나눠 계산하므로 물리적으로는 sharding처럼 보인다.
GPU 0: W의 일부
GPU 1: W의 일부
하지만 TP의 주목적은 단순히 저장 공간을 줄이는 것이 아니라, 한 layer의 matmul 계산을 여러 GPU가 함께 수행하는 것이다. 그래서 보통 parallelism 전략으로 분류한다.
확인
- DP에서 모델 parameter는 기본적으로 복제되는가, shard되는가?
- ZeRO가 shard하는 세 가지 큰 대상은 무엇인가?
- TP가 sharding처럼 보이지만 parallelism으로 불리는 이유는 무엇인가?