본문 바로가기

Deep Learning/Distributed Deep Learning

Large Scale Distributed Deep Networks

 

Dean, Jeffrey, et al. "Large scale distributed deep networks." Advances in neural information processing systems. 2012.

Link

 

Abstract

저자는 DistBelif 프레임워크를 개발하여 수천개의 머신에 대해서 아주 큰 모델을 학습시킬 수 있도록 했다. 이를 구현하기 위한 두 개의 핵심 알고리즘은 다음과 같다.

 

  ㆍ˙Downpour SGD : 많은 수의 model replica에 대해 비동기식 SGD를 지원

  Sandblaster : L-BFGS를 포함한 다양한 distributed batch optimization 지원

 

실험 결과, DistBelif는 visual object recognition, Speech recognition에 뛰어난 성능을 보였다.

 

 

Introduction

GPU는 딥러닝 모델을 빠르게 학습시키는데 큰 기여를 했지만 GPU memory가 작아 이보다 큰 모델은 학습시키기 어렵다는 단점이 있다. (이는 논문 발표 당시로, 현재는 GPU memory에 대한 문제가 크지는 않음) 이로 인해 CPU-GPU bottleneck이 발생하여 성능저하의 주 원인이 된다. 연구자들은 이를 막기 위해 데이터 및 파라미터의 크기를 줄여야 했고 이는 효과적인 방법이 아니다.

 

이 논문에서는 DistBelif의 Model parallelism을 이용하여 이를 해결할 수 있다고 한다. Moel parallelism과 Data parallelism를 지원한다. 구현한 Downpour SGD와 Sandblaster L-BFGS는 기존의 SGD와 L-BFGS에 비해 확실한 속도 향상이 있다.

 

놀라운 결과가 도출이 되었는데, Adagrad를 함께 사용한다면 nonconvex problem을 잘 풀 수 있다는 점이다. 또한, 충분한 자원이 있으면 L-BFGS가 SGD 못지 않은 성능을 보인다는 것이다.

 

Machine cluster를 이용하여 GPU가 필요로 하는 시간이 1/10 미만이지만 baseline과 비교하여 비슷한 classification accuracy를 보였다. 1억개 파라미터를 가지는 ImageNet을 학습시킴으로써 성능을 유지하면서 잘 학습되는 것을 보였다.

 

 

Previous work

기존 병렬처리는 gradient computation이 쉬운 linear, convex model에 대해서 연구가 활발히 진행되었다. 한 연구는 convex problem에 대한 delayed gradient update를 연구하였다. 다른 연구는 공유 메모리 아키텍처에서 lock이 없는 sparse gradient update를 연구하였다. 이 논문에서의 연구는 두 가지의 장점을 취하여, async하게 gradient를 계산하는 cluster를 이용하지만 문제가 convex 또는 sparse하지 않아도 된다고 한다.

 

딥러닝 모델을 확장하는 방법은 여러가지가 있다. 여러개의 작은 모델을 이용해 각 예측을 평균화하여 사용하거나 모델을 수정하여 병렬화가 쉽도록 하는 방법이 있다. 하지만 이는 모델의 형태에 제한이 있다. 다른 연구의 경우 계산이 많이 필요한 한 layer에서만 계산을 병렬화하는 방법을 고려했다. 하지만 이는 일반성이 부족하고 이를 보완하는 새로운 방법이 필요하다.

 

 

Model parallelism

사용자는 노드에서 발생하는 계산과 노드간 전달하는 메시지를 정의한다. 모델이 클 경우 다른 노드의 계산이 다른 시스템에 할당된다. 아래 그림처럼 모델을 여러 시스템으로 분할할 수 있다. 이처럼 DistBelif 프레임워크는 사용 가능한 모든 코어를 사용하여 각 머신의 계산을 자동으로 병렬화하고 머신 간 통신, 데이터 동기화를 관리한다.

 

 

데이터 전송은 위의 그림에서 머신내의 전송과 머신간의 전송으로 분류할 수 있다. 머신간의 데이터 전송은 비용이 매우 크기 때문에 이 통신 비용이 지배적일 때까지 성능의 이점을 얻는다. 이 연구에서는 8개 또는 16개의 파티션으로 나누었을 때 적절한 성능 향상을 보였다. 512 CPU 코어를 각 머신당 16 코어씩, 총 32 머신으로 학습하여 효과적인 학습이 가능하다. Distributed optimization 알고리즘을 활용하면 10000여 개의 CPU 코어를 활용할 수 있다.

 

 

Distributed optimization algorithms

분산딥러닝에서 Parameter sever라는 개념이 등장한다. Parameter server는 모델의 모든 파라미터를 포함하고 있으며 파라미터를 업데이트 하는 역할만 한다. Model replica는 이 파라미터들을 복제하여 공유하며, 파라미터의 gradient값을 계산하여 Parameter server로 전송하는 역할을 한다. 뒤에 소개할 두 개의 메서드들은 Model replica의 속도 차이를 허용하며, 심지어 failure도 허용한다.

 

 

1. Downpour SGD

 

 

Training data를 Model replica수 만큼 나누고, Parameter server와 Model replica는 하나의 머신이 가지는 파라미터의 수를 줄이기 위해 shard로 나눈다. Model replica는 Parameter server에 현 상태의 파라미터를 요청하게 되고 받은 파라미터와 데이터를 이용해 parameter gradient를 계산한다. 계산한 gradient는 Parameter server로 다시 보내지며 Parameter server는 이에 대한 파라미터를 업데이트한다.

 

Communication overhead를 줄이기 위해 특정 시점 마다 통신을 하도록 설정할 수 있다. Parameter server로부터 파라미터를 받을 때에는 $n_{fetch}$ step 마다, Parameter sever로 gradient를 전송할 때는 $n_{push}$ step 마다 통신한다. 뒤의 실험에서는 $x_{fetch} = x_{push} = 1$ 로 두고 실험하였다.

 

비동기 업데이트를 사용하므로 한개의 Model replica가 fail이 발생하더라도 동작한다는 장점이 있지만, 파라미터를 업데이트할 때 같은 타임스탬프의 파라미터 업데이트라는 보장이 없다. 이는 consistency를 해치는 요인이 된다. 하지만, 이론적 근거는 없지만 nonvex problem에 대해 이러한 consistency 완화가 더 효과적이었다고 언급한다.

 

Adagrad를 사용하여 Downpour SGD의 robustness를 증가 시켜 효율적으로 학습할 수 잇다.

 

$ \eta_{i, K} = \gamma /{\sqrt{\sum_{j=1}^{K}{\Delta w_{i, j}^2}}}$

이 learning rate는 parameter server shard에서 계산할 수 있다.

 

Single model replica에서 어느 정도 학습한 뒤, 그 뒤에 분산 학습을 진행하는 "warmstarting" model도 제안했다.

 

 

2. Sandblaster L-BFGS

 

 

더 큰 모델과 큰 dataset에 광범위한 메서드를 지원하기 위해 Sandblaster L-BFGS라는 알고리즘이 도입되었다. 이 알고리즘의 핵심은 parameter storage를 분리하여 (Parameter server shard) 관리한다는 것이다. 이를 위해 coordinator가 있는데, coordinator는 작은 단위의 operation을 보내 Parameter server shard가 이를 수행한다. 이렇게 매우 큰 모델을 shard형태로 나누어서 관리한다.

 

그리고 Model replica간의 성능 차이도 큰 문제가 된다. 왜냐하면 하나의 Replica가 느린다면 나머지는 이를 위해 기다려야 하기 때문이다. Load balancing은 batch size보다 작은 데이터를 분배하여 빠른 Model replica에게는 많은 수의 데이터가, 느린 Model replica에는 적은 수의 데이터가 부담되게 하여 속도를 맞춰준다.

 

특정 시점마다 동기화를 진행해야했던 Downpour SGD와 달리, Sandblaster L-BFGS는 coordinator가 명령했을 때에만 파라미터를 fetch하고 완료된 부분마다 계산된 gradient를 보낸다.

 

 

Experiments

이 논문에서는 Object recognition문제와 Speech recognition에 대해 실험을 진행하였다. (해당 모델을 논문 참조)

 

위의 실험은 여러 모델에 대해 머신의 개수를 변화시키면서 간단한 SGD training을 실행한 결과이다. (Downpour SGD 사용한 듯) y축은 하나의 mini-batch를 학습시키는데 소요되는 평균 시간을 비교한 비율이다.

 

대체로 머신의 수가 늘수록 성능이 증가하고 모델이 클 수록 성능 향상이 커진다. 하지만 모델의 파라미터 수가 작으면 그 효과가 뚜렷하지 않는 걸 볼 수 있는데, 이는 네트워크 오버헤드가 많아지고 각 머신이 수행할 작업이 적어지기 때문에 오히려 속도가 느려지기 때문이다.

 

 

 

 

 

이 실험에서 특이한 점은, accuarcy 16% 기준으로 잡고 이 accuracy까지 도달하는데 걸리는 시간을 측정함으로써 성능을 평가한 것이다. Adagrad를 사용한 Downpour SGD가 가장 높은 성능을 보였다. Sandblaster L-BFGS는 머신 수가 증가하여도 이 성능을 따라잡지 못하는데, 이는 알고리즘과 L-BFGS 특성상 연산량이 많기 때문으로 추정한다.

 

 

Conclusions

Downpour SGD가 nonconvex한 문제에도 잘 학습한다는 것을 보였다. Sandblaster L-BFGS는 올바른 네트워크 대역폭 사용으로 매우 많은 코어로 확장할 수 있음을 보였다. 최종적으로 GPU 개수의 제한 없이도 잘 학습을 하며, 확장성 또한 훌륭하였다.

 

그 중에서 Downpour SGD와 Adagrad을 같이 사용한 방법이 우세했다. 사실 Adagrad는 asnc SGD에서 잘 안쓰였지만 이 모델에서 잘 작동한다는 점은 놀라웠다고 말한다. 비동기 업데이트가 consistency 부분에서 취약할 수 밖에 없는데 Adagrad가 Adaptive learning rate를 적용함으로써 자동으로 안정화하고 학습 속도를 자연스럽게 조정한다고 추측하고 있다.