왜 Collective Operation이 필요한가

distributedcollectivematmul

단일 GPU에서 행렬곱을 계산할 때는 필요한 행렬 조각이 모두 같은 곳에 있다.

A[2×4]×B[4×2]=C[2×2]A[2 \times 4] \times B[4 \times 2] = C[2 \times 2]

예를 들어 C의 첫 번째 칸 하나를 만들려면 A의 첫 번째 row와 B의 첫 번째 column을 내적한다.

C[0,0] = 1 x 5 + 2 x 6 + 3 x 7 + 4 x 8 = 70
A[2 x 4] x B[4 x 2] = C[2 x 2]
1 2 3 4
dot
5 6 7 8
=
70

GPU 0

앞 2개 항 계산

1 x 5 + 2 x 6 = 17

GPU 1

뒤 2개 항 계산

3 x 7 + 4 x 8 = 53
17 + 53 = 70

단일 GPU라면 길이 4짜리 내적을 한 번에 계산한다.

여러 GPU로 나누면 생기는 문제

이제 길이 4짜리 내적을 GPU 2개에 나눠서 계산한다고 하자.

GPU 0: 앞 2개 항 계산 -> 1 x 5 + 2 x 6 = 17
GPU 1: 뒤 2개 항 계산 -> 3 x 7 + 4 x 8 = 53

각 GPU는 자기에게 있는 조각만 볼 수 있으므로 정답 70을 혼자 만들지 못한다.

GPU들이 만든 partial result를 다시 합쳐야 원래 행렬곱과 같은 결과가 된다.

17 + 53 = 70

이처럼 여러 GPU가 함께 참여해서 데이터를 모으거나 합치는 통신 연산을 collective operation이라고 부른다.

두 가지 상황

분산 행렬곱에서 collective가 필요한 순간은 크게 두 가지다.

첫째, 계산하기 전에 필요한 재료가 내 GPU에 없을 수 있다.

필요한 입력 조각을 다른 GPU에서 가져와야 함

둘째, 계산한 뒤 결과가 아직 partial result일 수 있다.

각 GPU의 partial result를 합쳐야 최종 결과가 됨

이 카드에서는 이름을 외우는 것이 목표가 아니다. 핵심은 하나다.

행렬을 여러 GPU에 쪼개도 원래의 수학적 결과를 보존하려면, GPU들 사이의 통신이 필요하다.

다음 카드들에서 gather, all-gather, reduce, all-reduce, reduce-scatter 같은 연산을 하나씩 따로 볼 것이다.

확인

  • 위 예시에서 GPU 0이 혼자 C[0,0]의 정답을 만들 수 없는 이유는 무엇인가?
  • 1753은 각각 어떤 의미인가?
  • collective operation은 단순히 “통신 API”가 아니라 어떤 목적을 가진 연산인가?