# 분산 트레이닝 --- ## Cluster Topology 설정 SINGA 에서 다양한 분산 트레이닝 프레임워크를 실행하는 방법을 설명합니다. cluster topology 는 `JobProto` 속의 `cluster` field 를 설정해줍니다. `cluster` 는 `ClusterProto` 타입 입니다. 예를 들어 message ClusterProto { optional int32 nworker_groups = 1; optional int32 nserver_groups = 2; optional int32 nworkers_per_group = 3 [default = 1]; optional int32 nservers_per_group = 4 [default = 1]; optional int32 nworkers_per_procs = 5 [default = 1]; optional int32 nservers_per_procs = 6 [default = 1]; // servers and workers in different processes? optional bool server_worker_separate = 20 [default = false]; ...... } 자주 사용되는 field 는 다음과 같습니다: * `nworkers_per_group` and `nworkers_per_procs`: decide the partitioning of worker side ParamShard. * `nservers_per_group` and `nservers_per_procs`: decide the partitioning of server side ParamShard. * `server_worker_separate`: separate servers and workers in different processes. ## 다양한 트레이닝 프레임워크 SINGA 에서 worker groups 들은 비동기적으로, group 속에서 workers 들은 동기적으로 실행됩니다. 유저는 이 일반디저인을 이용해서 **synchronous** 와 **asynchronous** 트레이닝 프레임워크를 실행 할수 있습니다. 널리 알려진 분산 트레이닝을 어떻게 설정하고 실행하는지 설명하겠습니다.

Fig.1 - 다양한 트레이닝 프레임워크

###Sandblaster Google Brain 에서 쓰이는 **synchronous** 프레임워크. Fig.2(a) 는 SINGA에서 Sandblaster 프레임워크를 실행하기 위한 cluster 의 설정 예입니다. cluster { nworker_groups: 1 nserver_groups: 1 nworkers_per_group: 3 nservers_per_group: 2 server_worker_separate: true } 각 server group 는 모든 workers 의 requests 를 처리합니다. 각 worker 는 뉴럴네트 모델의 한 부분을 담당하여 계산을 하고, 모든 servers 와 통신을 하여 관련 parameters 값을 얻습니다. ###AllReduce Baidu's DeepImage 에서 쓰이는 **synchronous** 프레임워크. Fig.2(b) 는 SINGA에서 AllReduce 프레임워크를 실행하기 위한 cluster 의 설정 예입니다. cluster { nworker_groups: 1 nserver_groups: 1 nworkers_per_group: 3 nservers_per_group: 3 server_worker_separate: false } 각 node 에서 1 worker 와 1 server 를 실행하여, 각 node 가 parameters 의 한 부분을 담당하고 계산을 하도록 설정합니다. 다른 nodes 와 업데이트 된 정보를 교환합니다. ###Downpour Google Brain 에서 쓰이는 **asynchronous** 프레임워크. Fig.2(c) 는 SINGA에서 Downpour 프레임워크를 실행하기 위한 cluster 의 설정 예입니다. cluster { nworker_groups: 2 nserver_groups: 1 nworkers_per_group: 2 nservers_per_group: 2 server_worker_separate: true } synchronous Sandblaster 와 비슷하게, 모든 workers 는 1 server group 에 requests 를 보냅니다. 여기서는 workers 들을 여러 worker groups 으로 나누어서, 각 worker 가 *update* reply 에서 받은 최신 parameters 를 써서 계산 하도록 설정하였습니다. ###Distributed Hogwild Caffe 에서 쓰이는 **asynchronous** 프레임워크. Fig.2(d) 는 SINGA에서 Hogwild 프레임워크를 실행하기 위한 cluster 의 설정 예입니다. cluster { nworker_groups: 3 nserver_groups: 3 nworkers_per_group: 1 nservers_per_group: 1 server_worker_separate: false } 각 node 는 1 server group 와 1 worker group 를 실행합니다. Parameter updates 를 node 에서 각각 실행시킴으로써 통신코스트와 트레이닝 스텝을 최소화 합니다. 그러나 server groups 들은 정기적으로 네이버링 groups 들과 동기 시켜야 됩니다.