우노
[DL] Distributed Training (분산 학습) 이란? 본문
Distributed Training (분산 학습) 이란?
- 딥러닝 모델 설계 과정에는 많은 시간이 소요됩니다.
- 따라서, 모델의 학습 과정을 가속화하는 것은 매우 중요합니다.
- 분산 학습은 이러한 딥러닝 모델의 학습 시간을 단축하는데 필수적인 기술 중 하나입니다.
Distributed Training
- 분산 학습의 핵심 개념은 크게 3가지로 분류할 수 있습니다.
- 작업 분할 방식
- Model Parallelism
- Data Parallelism
- Parameter 동기화 방식
- Synchronous replication
- Asynchronous replication
- Gradient 취합 방식
- All-Reduce (Parameter Server)
- Ring-AllReduce
- 작업 분할 방식
작업 분할 방식
- 작업 분할 방식은 2가지로 분류됩니다.
- Model Parallelism
- 모델을 여러 GPU 에 분산하여 처리하는 방법
- Data Parallelism
- 데이터를 여러 GPU 에 분산하여 처리하는 방법
- Model Parallelism
Model Parallelism
- 모델을 여러 GPU 에 분산하여 처리하는 방법이며, 입력 데이터는 동일합니다.
- 즉, 전체 신경망 모델을 분리한 뒤, 각각의 모델을 여러 GPU 가 할당 밭아 처리하는 방법입니다.
- 모델이 큰 경우에 사용 가능하며, 모델을 "잘" 분리하는게 관건입니다.
Data Parallelism
- 데이터를 여러 GPU 에 분산하여 처리하는 방법입니다.
- 모델 학습은 다음과 같은 순서로 진행됩니다.
- 각각의 모델은 동일하며, 각기 다른 입력 데이터를 받아, 모델을 학습합니다.
- 모델 학습 시, 순전파와 역전파를 통해, 모델의 파라미터가 결과값에 미치는 영향 (Gradient) 을 계산합니다.
- 각각의 모델로부터 나온 Gradient 의 평균을 구합니다.
- Gradient 의 평균을 사용해, 모델의 파라미터를 업데이트합니다.
Parameter 동기화 방식
- Parameter 동기화 방식은 2가지로 분류됩니다.
- Synchronous replication
- 분산처리가 모두 끝났을 때, Gradient 의 평균을 사용해 Parameter 를 업데이트
- 수렴이 빠르다.
- Asynchronous replication
- 각 분산 처리에서 Gradient 계산이 끝난 건, 먼저 사용해서 Parameter 를 업데이트
- 수렴이 느릴 수도 있다.
- Synchronous replication
- Sync 방식은 모든 Worker(GPU)의 Job 이 끝날 때까지 대기했다가 Parameter 를 업데이트하므로,
- 분산 되어있는 Worker(GPU)가 많을 수록 Async 방식이 효율적입니다.
Gradient 취합 방식
- Gradient 취합 방식은 크게 2가지로 분류됩니다.
- All-Reduce (Parameter Server)
- Parameter Server 가 모든 Gradient 를 취합하여 재분배
- Ring-AllReduce
- 모든 GPU 를 Ring 형태로 구성한 뒤, Gradient 전달을 통해 공유
- All-Reduce (Parameter Server)
All-Reduce (Parameter Server)
- All-Reduce 는 단순히,
- Parameter Server 가 모든 Worker(GPU) 로부터 계산 된 Gradient 를 취합한 뒤,
- Worker(GPU) 에게 재분배하는 방식입니다.
- 단순한 구조라는 것이 장점이지만,
- Worker(GPU) 수에 따라, Parameter Server 의 메모리 사용량 및 네트워크 부하가 비례하여 증가하기 때문에,
- 병목 현상이 발생할 수 있다는 점이 단점입니다.
Ring-AllReduce
- Ring-AllReduce 는 AllReduce 의 병목 현상을 제거한, 빠르고 확장 가능한 알고리즘입니다.
- Ring-AllReduce 알고리즘의 순서는 아래와 같습니다.
- 모든 GPU 를 Ring 형태로 구성합니다.
- GPU 에서 계산된 Gradient 를, 총 GPU 개수만큼 분리합니다.
- 각각의 GPU 는 분리된 Gradient 의 일부를, 옆 GPU 에게 전달합니다.
- Gradient 를 넘겨받은 GPU 는, 본인의 Gradient 와 전달 받은 Gradient 를 합산한 뒤, 다시 옆 GPU 에게 Gradient 를 전달합니다.
- 이러한 과정을 2(P-1) 번 진행합니다. [ N : GPU 개수 ]
- 위의 그림을 예로 들었을 때,
- Start 그림에서 GPU0 의 a0 + b0 + c0 + d0 + e0 은, GPU0 에서 계산된 Gradient 를 의미합니다.
- 저희는 GPU0 ~ GPU4 가 가진 모든 Gradient 를 우측 Goal 그림처럼 취합하는게 목표입니다.
Ring-AllReduce 순서 예시
참고
'AI > Deep Learning' 카테고리의 다른 글
[DL] Tensorflow version 확인 (0) | 2021.11.04 |
---|---|
[DL] Tensorflow 모델 저장/불러오기 (0) | 2021.08.12 |
[DL] DNN Grid Search (3) | 2021.07.16 |
[DL] Semantic Segmentation (FCN, U-Net, DeepLab V3+) (8) | 2021.03.19 |
[DL] Autoencoder (오토인코더) (0) | 2021.03.03 |
Comments