왜 Collective Operation이 필요한가
단일 GPU에서 행렬곱을 계산할 때는 필요한 행렬 조각이 모두 같은 곳에 있다.
예를 들어 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 = 17GPU 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]의 정답을 만들 수 없는 이유는 무엇인가? 17과53은 각각 어떤 의미인가?- collective operation은 단순히 “통신 API”가 아니라 어떤 목적을 가진 연산인가?