AllReduce

distributedcollectiveall-reduce

AllReduce는 여러 rank의 값을 합산한 뒤, 모든 rank가 같은 합산 결과를 갖게 하는 collective operation이다.

Before AllReduce

rank 0
12
rank 1
1020
rank 2
100200

After AllReduce

rank 0
111222
rank 1
111222
rank 2
111222
AllReduce는 여러 rank의 값을 합친 뒤, 모든 rank가 같은 합산 결과를 갖게 한다.

Before와 after

Before all-reduce
rank 0: [1, 2]
rank 1: [10, 20]
rank 2: [100, 200]

After all-reduce
rank 0: [111, 222]
rank 1: [111, 222]
rank 2: [111, 222]

Reduce와 마찬가지로 같은 위치끼리 더한다. 차이는 합산 결과를 destination rank 하나가 아니라 모든 rank가 갖는다는 점이다.

행렬곱에서 왜 필요한가

inner dimension을 나눠 행렬곱을 하면 각 rank는 partial C를 만든다.

rank 0: partial C0
rank 1: partial C1
rank 2: partial C2

모든 rank가 다음 계산에서 같은 final C를 계속 사용해야 한다면, partial C를 합친 결과를 모든 rank가 가져야 한다.

AllReduce partial C to every rank

rank 0
partial C0->final C
rank 1
partial C1->final C
rank 2
partial C2->final C
AllReduce는 partial C들을 더한 final C를 모든 rank가 갖게 한다. contracting dimension을 나눠 계산한 뒤 모두가 같은 결과를 계속 써야 할 때 필요하다.

언제 쓰는가

AllReduce는 여러 rank의 partial result를 합치고, 합쳐진 결과를 모두가 필요로 할 때 쓴다.

partial results on many ranks -> every rank has summed result

확인

  • Reduce와 AllReduce의 차이는 무엇인가?
  • AllReduce는 gather처럼 값을 이어 붙이는가, reduce처럼 값을 더하는가?
  • inner dimension을 나눠 계산한 partial C를 모든 rank가 필요로 하면 왜 AllReduce가 자연스러운가?