모델을 학습하기 위해서는 GPU에 크게 3가지가 올라가야 합니다.
Model Parameters
Gradients
⇒ Model Parameters와 Gradients는 동일한 memory footprints를 차지합니다.
Optimizers
⇒ 어떤 optimizer를 사용하느냐에 따라 크게 달라지는데요, Adam과 같이 gradient의 (1) first order moments(기울기의 지수평균)와 (2) second order moments(기울기 제곱의 지수 평균: 크기가 큰 기울기에는 작은 학습률을, 작은 기울기에는 큰 학습률을 적용:how? 이 term을 분모로 씀)를 동시에 활용하는 optimizer는 Model Parameters의 2배를 memory footprints로 차지시킵니다.
Model Parameters과 Gradients의 memory footprints를 감소시키기 위해 parameters(config에 따라 다름)와 activations을 half precision으로 쓰는 Mixed Precision이 많이 활용되기도 하는데요.
Activations
Temporary buffers
Memory Fragmentation
Deepspeed는 위에서 설명한 문제점들을 해결하기 위해 code 몇줄만 추가하면 pytorch 위에 wrapping을 진행해 줌으로써 ‘distributed training, mixed precision, gradient accumulation와 같이 모델 개발에 있어서 필요한 기능을 효율적으로 지원해주도폴 개발된 프레임워크라고 생각하시면 됩니다.
논문에서 베이스라인으로 두는 방법론은 DP(Data Parallelism)으로 (1) Model, Optimizer를 모두 여러 device에 복사한 후 (2) 각 device에서 다른 Mini-batch로 forward와 backward를 진행한 후 (3) gradient 평균으로 모델을 동기화하는 방법을 언급하고 있습니다.
그렇다면 DeepSpeed에서는 대규모 모델의 memory footprint문제를 해결하기 위해서 어떤 테크닉을 제시했을까요?