티스토리 뷰

MLOps

4.5. Distribution Strategy

seoyoung02 2023. 1. 22. 11:52

※ 이 포스트는 머신러닝 디자인 패턴을 기반으로 작성되었습니다.

 

 

딥러닝이 점점 발전해 오면서 모델의 크기는 점점 증가하고, 학습시간 및 추론시간도 점점 증가했다. 예를 들어 ImageNet 데이터셋으로 ResNet-50을 학습시키려면 14일이 소요된다고 한다. 이것은 새로운 아이디어를 반복하거나 parameter를 조절하여 실험하기 위해서 2주를 기다려야 한다는 의미이다. 학습에 걸리는 시간 또한 비용이므로 대규모 신경망의 학습 속도를 높이기 위해 분산처리 전략이 등장했다.

 

Data parallism

데이터를 node(GPU)의 수로 나누어 각 node에 서로 다른 데이터를 할당해 학습시키는 방식이다. 주로 convolution layer가 관련된 것과 같이 가중치당 계산량이 많을 때 유리하다. 데이터 패럴리즘이 valid한 수학적 이유는 링크에 잘 정리되어 있다. 방법은 크게 동기식과 비동기식 두 개로 나누어 볼 수 있다.

 

동기식

워커들이 서로 다른 입력 데이터의 일부를 병렬로 학습하고, 각 학습 단계가 모든 워커에서 완료되면 기울깃값을 집계(평균 등등의 방식으로)해 모델을 업데이트한다. 여기서 사용되는 알고리즘이 All-reduce이다.

All-reduce 알고리즘에는 parameter server와 worker(GPU)가 있다. Parameter server가 모든 worker로부터 계산된 기울기값을 취합한 뒤 다시 worker에게 재분배하는 단순한 방식이다. 단순한 구조인 것인 장점이지만, worker의 수가 늘어나면 parameter server의 메모리 사용량 및 네트워크 부하가 비례하여 증가하여 병목현상이 일어날 수 있다는 것이 단점이다.

이것을 보완하기 위해 나온 알고리즘이 Ring-All-reduce이다. 이 알고리즘은 worker를 링 형태로 구성한다. 각 worker에서 gradient를 계산하는 것은 All-reduce와 동일하나, 이 값을 취합(혹은 분배)하는 방식에 차이가 있다. 각 worker에서 계산한 gradient array를 worker의 수(여기서는 P라고 하자.)만큼 subarray로 나눈다. 아래 예시 이미지에서는 worker(process)의 수가 4개이므로 array를 4개로 나누었다. 이렇게 분할을 하고 나면 각 subarray 중 서로 다른 순서에 위치한 것들을 옆에 있는 worker로 옮겨준다. subarray를 받은 worker는 자신이 받은 subarray gradient와 같은 위치의 subarray를 합산(혹은 평균과 같이 원하는 연산)한다. 합산한 결과를 다시 옆에 있는 worker로 넘겨준다. 이 과정을 P-1번 반복하면 각 subarray가 서로 다른 worker에서 모든 worker에 의해 계산된 값의 종합을 가지게 된다. 그리고 종합된 값을 옆에 있는 worker에 전달해 주기 위해서  subarray를 다시 P-1번 옆에 있는 worker에게 전달해 주면 모든 worker가 동일한 gradient array를 가지게 된다. 

Ring All-reduce, 그림 순서: 1→2
3→4(출처: https://tech.preferred.jp/en/blog/technologies-behind-distributed-deep-learning-allreduce/)

 

비동기식

비동기식은 동기식과는 다르게 다른 워커의 학습이 끝나는 것을 기다리지 않는다. 각 워커의 학습의 종료와 상관없이 주기적으로 gradient를 업데이트해 새 모델 파라미터를 계산한다. 따라서 느린 워커에 의한 병목이 발생하지 않아 동기식보다 시간당 처리량이 높다. 

 

Model parallism

출처: https://static.googleusercontent.com/media/research.google.com/en//archive/large_deep_networks_nips2012.pdf

이 방식은 모델을 여러 부분으로 나누어 각 부분을 서로 다른 GPU에 올리는 방식이다. 동일한 미니 배치 데이터로 서로 다른 개별 구성요소를 학습한다. 나누어 놓았던 모델을 다시 하나로 연결시키는 작업도 필요하므로 데이터 분산에 비해서 더 복잡하고, 모호한 면이 있다. 어떤 원론적인 이론이라고 할 것은 없는 것 같고, 여러 방법론이 존재한다고 한다.

모델 패럴리즘은 fully connected layer가 많은 큰 규모의 모델같이 뉴런의 활동당 계산량이 많은 경우 효율이 높다. 또한, 매우 큰 모델에서 inference의 속도도 빠르다는 장점이 있다.

 

그 외 더 좋은 성능(속도..?)을 위한 고려 요소가 있다.

ASIC

하드웨어를 강화하는 방식으로 Application-specific integrated circuit을 사용하는 것이다. 머신러닝을 위한 ASIC는 대형 행렬 계산에 최적화된 형태를 가진다. 

배치 사이즈

출처: https://papers.readthedocs.io/en/latest/others/AccurateLargeMinibatchSGD/

동기식 데이터 패럴리즘에서는 모든 워커가 업데이트된 모델을 공유해야 하므로 전송에 의한 지연시간이 발생한다. 이를 줄이기 위해서는 데이터 전송을 유발하는 학습 반복 횟수를 줄여야 하는데, 배치 사이즈가 커지면 한 epoch당 반복 횟수가 줄어 총 반복 횟수를 줄일 수 있다. 하지만 배치 사이즈가 너무 크면 error가 오히려 증가할 수 있어(위의 표) 적절한 크기의 배치를 선택해야 한다.

배치 사이즈를 설정하는 것은 모델의 통계적 정확도, 하드웨어 효율성에 모두 영향을 미치므로 나름 복잡한 최적화 영역이다. 이러한 최적화의 연구로 LAMB라는 optimizer가 있다. 매우 큰 배치 크기에서는 error가 오히려 높아지는 이유는 큰 배치는 업데이트 횟수가 적으므로 learning-rate값을 크게 정해야 하지만 learning-rate가 너무 크면 수렴을 하지 않기 때문이라고 한다. 따라서 LAMB에서는 layer 별 gradient를 전체 gradient로 noramlization 하고, AdamW로 업데이트를 계산하고, LARS(layer별로 lr을 scaling 하는 것)를 추가했다고 한다.

I/O 대기 최소화

I/O에 의한 병목을 최소화하는 파이프라인을 구축해야 한다. 예를 들면, 학습 단계의 모데 실행(GPU/TPU)과 전처리 작업(CPU)을 병렬화 시키는 것이다. N단계 학습이 진행되는 동안 N+1단계 전처리를 같이 진행한다고 보면 된다.

'MLOps' 카테고리의 다른 글

6.6. Feature Store  (0) 2023.01.10
6.5. ML Workflow Pipeline  (1) 2023.01.04
ML Pipeline Solution  (0) 2023.01.04
머신러닝 디자인 패턴(Machine Learning Design Patterns) 개요  (0) 2022.12.12
2.4 Hashed Feature  (0) 2022.12.03
댓글
최근에 올라온 글
Total
Today
Yesterday
최근에 달린 댓글
링크
공지사항
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함