All-reduce는 병렬 및 분산 컴퓨팅에서 사용되는 집단 통신 연산이다. 이 연산은 지정된 연산(예: 합, 최솟값, 최댓값, 평균)을 사용하여 모든 참여 프로세스의 데이터를 결합하고, 최종 결과를 각 프로세스에 전달한다. 머신러닝 맥락에서 all-reduce는 신경망 및 딥러닝 모델의 분산 훈련 중 그래디언트를 동기화하는 주요 메커니즘이다.
이 연산은 Message Passing Interface(MPI) 표준에 정의되어 있으며, 그 의미는 다음과 같다: 각 프로세스가 데이터 버퍼를 제공하고, 연산이 이러한 버퍼들을 요소별로 결합한 뒤, 그 결과가 모든 프로세스에 복사된다. 이는 결과를 단일 루트 프로세스에만 보내는 reduce 연산과 대조된다. all-reduce 연산은 확률적 경사 하강법과 같은 데이터 병렬 훈련에서 집계된 데이터의 전역적 관점을 유지하면서 로컬 복사본을 필요로 하는 알고리즘에 필수적이다.
분산 훈련에서의 역할
데이터 병렬 분산 훈련에서 각 워커(GPU 또는 프로세서)는 모델의 복사본을 보유하고 훈련 데이터의 서로 다른 부분집합을 처리한다. 역전파를 통해 로컬 그래디언트를 계산한 후, 워커들은 일관된 모델을 업데이트하기 위해 그래디언트를 평균화해야 한다. all-reduce는 모든 워커의 그래디언트를 합산한 뒤(평균 연산을 사용하는 경우 워커 수로 나누어) 이를 수행한다. 이를 통해 모든 워커가 동일한 집계된 그래디언트를 가지게 되며, 로컬 모델 복사본을 일관되게 업데이트할 수 있다.
all-reduce가 없으면 워커 간 그래디언트가 달라져 훈련 과정이 불안정해지거나 잘못된 결과를 초래할 수 있다. 또한 이 연산은 많은 장치로 확장할 때 상당한 통신 오버헤드를 발생시키므로, 훈련의 중요한 병목 지점이 된다. 따라서 효율적인 all-reduce 구현은 클라우드 제공업체와 하드웨어 벤더의 주요 관심사가 되었다.
알고리즘 및 구현
all-reduce를 수행하는 여러 알고리즘이 있으며, 각각 대역폭, 지연 시간, 확장성 측면에서 서로 다른 장단점을 가진다. 일반적인 구현은 다음과 같다:
- 링 올-리듀스(Ring All-Reduce): 프로세스들이 논리적 링 형태로 배열된다. reduce-scatter 단계에서 각 프로세스는 데이터를 이웃에게 보내 부분 합을 축적하고, all-gather 단계에서는 축적된 결과를 링을 통해 순환시켜 모든 프로세스가 최종 결과를 얻는다. 이 알고리즘은 프로세스당 전송 메시지 수를 최소화하며, 많은 시스템에서 최적의 대역폭을 달성하여 대규모 언어 모델 훈련과 같은 고성능 컴퓨팅 환경에서 널리 사용된다.
- 트리 기반 올-리듀스(Tree-Based All-Reduce): 이항 트리 또는 k-진 트리 구조를 사용하여 데이터를 계층적으로 결합한다. 작은 데이터 크기에서는 지연 시간 측면에서 더 효율적일 수 있지만, 대역폭 비용은 더 높을 수 있다.
- 재귀적 절반화/배가(Recursive Halving/Doubling): 데이터를 청크로 나누고 일련의 쌍별 교환을 통해 결합 및 재분배를 수행한다. 특정 클러스터 토폴로지에 적합하다.
오픈소스 Open MPI 라이브러리는 표준 all-reduce 구현을 제공한다. 한편, NVIDIA의 NCCL(NVIDIA Collective Communications Library)과 Gloo와 같은 최적화된 버전은 PyTorch 및 TensorFlow와 같은 딥러닝 프레임워크에서 널리 사용된다. 이러한 라이브러리는 일반적으로 대규모 텐서에 대해서는 링 기반 알고리즘을 기본으로 사용하고, 지연 시간을 줄이기 위해 작은 텐서에 대해서는 트리 기반 알고리즘으로 전환한다.
하드웨어 가속
최신 AI 하드웨어는 all-reduce를 메인 컴퓨트 코어에서 오프로드하기 위한 전용 집단 통신 엔진을 점점 더 포함하고 있다. 예를 들어, NVIDIA GPU는 NVLink 및 NVSwitch 패브릭을 갖추고 있으며, NCCL 라이브러리는 이를 활용하여 고처리량 all-reduce를 구현한다. 마찬가지로 AMD와 Intel도 RCCL 및 OneCCL과 같은 자체 집단 통신 라이브러리를 제공한다.
AWS Trainium 및 기타 맞춤형 AI 칩은 인터커넥트에서 직접 all-reduce를 가속화하는 네트워킹 유닛을 통합하는 경우가 많다. Google Cloud의 TPU는 고대역폭 인터커넥트를 사용하며, Interconnect Processor(ICP)라는 전용 칩을 통해 효율적인 all-reduce를 지원한다. 이러한 하드웨어 최적화는 수백 또는 수천 개의 장치로 확장할 때 통신 오버헤드가 훈련 시간을 지배할 수 있으므로 매우 중요하다.
최적화 기법
all-reduce 비용을 완화하기 위해 연구자와 엔지니어들은 여러 기법을 개발했다:
- 그래디언트 압축(Gradient Compression): 양자화 또는 희소화와 같은 기법은 전송되는 데이터 양을 줄인다. 예를 들어, 그래디언트 클리핑과 결합할 수 있지만, top-k 희소화와 같은 고급 방법은 인덱스 전송을 위한 추가 통신이 필요할 수 있다.
- 계산과의 중첩(Overlap with Computation): 그래디언트를 청크로 분할하고 각 청크가 준비되는 대로 all-reduce를 수행함으로써 역전파 계산과 통신을 겹쳐서 수행할 수 있다. 이를 통해 통신 지연 시간을 숨길 수 있다.
- 계층적 올-리듀스(Hierarchical All-Reduce): 다중 서버, 각각 다중 GPU로 구성된 클러스터에서는 먼저 노드 내에서 로컬 all-reduce를 수행한 다음 노드 간에 전역 all-reduce를 수행하여 네트워크 트래픽을 줄일 수 있다.
- 혼합 정밀도(Mixed Precision): all-reduce 전에 그래디언트를 float16과 같은 낮은 정밀도로 축적하면 통신량을 절반으로 줄일 수 있지만, 정확성을 유지하기 위해 주의가 필요하다.
이러한 최적화는 수천 개의 가속기를 필요로 하는 생성형 AI 모델 훈련에 필수적이다.
변형 및 관련 연산
all-reduce는 broadcast, scatter, gather, all-gather를 포함하는 집단 통신 연산군의 일부이다. all-reduce의 변형으로는 다음이 있다:
- Reduce-Scatter: 데이터를 결합한 다음 결과를 프로세스들에 청크로 분배한다. 각 프로세스는 전체 결과의 일부만 받는다. 이는 링 all-reduce의 중간 단계로 자주 사용된다.
- All-to-All: 각 프로세스가 다른 모든 프로세스에게 고유한 데이터를 보낸다. 더 일반적인 통신 패턴을 가능하게 하지만 all-reduce보다 비용이 더 많이 든다.
- 계단식 올-리듀스(Cascade All-Reduce): 계층적 토폴로지에서 트래픽 균형을 맞추기 위해 제안된 방법이다.
분산 컴퓨팅 맥락에서 all-reduce는 훈련 외에도 분산 추론, 앙상블 방법, 과학 컴퓨팅의 병렬 알고리즘 등 다양한 애플리케이션에서 사용된다.
도전 과제 및 향후 방향
모델 크기가 커짐에 따라 all-reduce의 대역폭 및 지연 시간 요구 사항은 계속 증가하고 있다. 수천 개의 장치로 확장하려면 정교한 스케줄링과 부하 균형이 필요하다. 새로운 접근 방식으로는 다음이 있다:
- 샤딩된 올-리듀스(Sharded All-Reduce): 그래디언트 텐서를 샤드로 나누고 각 샤드에 대해 독립적으로 all-reduce를 수행하여 통신을 계산과 더 잘 중첩시킨다.
- 비동기 올-리듀스(Asynchronous All-Reduce): 엄격한 동기화를 완화하여 일부 워커가 다른 워커보다 먼저 진행될 수 있도록 하지만, 수렴 문제를 일으킬 수 있다.
- 인네트워크 컴퓨팅(In-Network Computing): NVIDIA의 SHARP(Scalable Hierarchical Aggregation and Reduction Protocol)과 같은 기술은 스위치 내에서 축소 연산을 수행하여 all-reduce 시간을 크게 줄인다.
연구는 이기종 하드웨어 및 네트워크 토폴로지에 더 강건한 알고리즘 개발에 계속 초점을 맞추고 있다.
역사 및 표준
"all-reduce"라는 용어는 병렬 컴퓨팅 커뮤니티에서 유래했으며, 1994년에 처음 등장한 MPI 표준에서 공식화되었다. Xerox PARC 및 기타 연구 기관의 초기 연구는 이후 집단 통신 설계에 영향을 미친 병렬 컴퓨팅 방법론에 기여했다. 2010년대 딥러닝의 부상과 함께 all-reduce는 분산 훈련 프레임워크의 핵심 요소가 되었다. 바이두 연구팀은 TensorFlow에서 링 all-reduce를 대중화하여 널리 채택되는 데 중요한 역할을 했다.
오늘날 all-reduce는 OpenAI 및 Google DeepMind와 같은 연구소의 대규모 훈련 시스템을 포함한 분산 컴퓨팅 시스템에서 중요한 주제로 남아 있다. Hugging Face 생태계와 같은 오픈소스 프로젝트는 더 큰 모델을 지원하기 위해 통신 라이브러리를 지속적으로 개선하고 있다.
요약하면, all-reduce는 분산 인공지능 시스템의 기본 구성 요소이다. 그 효율성은 대규모 모델 훈련의 시간과 비용에 직접적인 영향을 미치며, 하드웨어와 소프트웨어 모두에서 활발한 연구 및 혁신 분야로 남아 있다.