본문 바로가기
[GPUaaS]/GPUmgt

[분산 학습] AllReduce & AllReduce mismatch 란 !!

by METAVERSE STORY 2026. 2. 21.
반응형

 

 

 

 

 

1️⃣ 먼저 “분산학습”이 뭐냐?

64노드면 예를 들어:

  • 노드 1: GPU 8개
  • 노드 2: GPU 8개
  • ...
  • 총 64노드

모든 GPU가 같은 모델을 복사해서 동시에 학습합니다.

이 방식을 보통
PyTorch DDP
같은 구조로 많이 사용합니다.

 

 


2️⃣ 그럼 문제는 뭘까?

각 GPU는:

  • 서로 다른 데이터를 보고
  • 각자 gradient를 계산합니다.

하지만 모델은 하나의 동일한 상태를 유지해야 합니다.

그래서 필요한 게 👇

 

 


3️⃣ AllReduce란?

AllReduce는

📡 모든 GPU의 값을 모아서
➕ 더한 뒤
🔁 다시 모든 GPU에게 동일하게 나눠주는 통신 연산

입니다.

보통 통신은
NVIDIA NCCL 라이브러리를 사용합니다.

 

 


4️⃣ 그림으로 이해하기

예를 들어 GPU 4개가 있다고 합시다.

각 GPU가 gradient를 계산:

 
 
GPU0 → grad = 2
GPU1 → grad = 4
GPU2 → grad = 6
GPU3 → grad = 8
 

AllReduce 실행:

 
 
2 + 4 + 6 + 8 = 20
 

그리고 평균:

 
 
20 / 4 = 5
 

결과:

 
 
모든 GPU가 grad = 5 로 동일해짐
 

이게 AllReduce입니다.

 

 


5️⃣ 왜 이게 중요하냐?

이걸 안 하면:

  • GPU마다 모델 weight가 달라짐
  • 학습 붕괴
  • 정확도 엉망

그래서 매 step마다 AllReduce는 필수입니다.

 

 


6️⃣ 그럼 AllReduce mismatch는 뭐냐?

이제 핵심입니다 🔥

AllReduce는 이렇게 가정합니다:

모든 GPU가
같은 타이밍에
같은 shape의 tensor를
통신해야 한다.

그런데 하나라도 다르면?

→ mismatch 발생

 

 


7️⃣ mismatch 발생 예시

❌ 경우 1: 한 GPU가 NaN 발생 후 죽음

 
 
GPU0 → grad 있음
GPU1 → grad 있음
GPU2 → grad 있음
GPU3 → NaN 또는 crash
 

GPU3이 통신에 참여 못 하면:

→ 나머지 GPU는 계속 대기
→ hang
→ watchdog 발생


❌ 경우 2: tensor 크기가 다름

예:

 
 
GPU0 → [1024, 1024]
GPU1 → [1024, 1024]
GPU2 → [512, 512] ← 다름
GPU3 → [1024, 1024]
 

이 경우:

AllReduce mismatch error


❌ 경우 3: step 수가 다름

한 rank가 먼저 종료되거나 skip하면:

 
 
rank0 → step 100
rank1 → step 100
rank2 → step 100
rank3 → step 99 (느림)
 

→ sync 안 맞음
→ mismatch

 

 


8️⃣ 로그에서는 어떻게 보이나?

보통 이런 식:

 
 
RuntimeError: NCCL error in: ...
Async operation timed out
 

또는

 
 
Detected mismatch between collectives
 

 

 


9️⃣ 64노드에서 왜 자주 나오나?

노드가 많을수록:

  • 한 GPU만 문제 있어도
  • 전체 64노드가 대기

즉,

1개 노드 문제 = 전체 스톱

특히:

  • NaN 발생
  • GPU reset
  • PCIe power 부족
  • IB 통신 불안정

이런 경우 mismatch 발생 가능

 

 


🔟 초보자용 한 줄 요약

AllReduce는 “모든 GPU의 gradient를 합쳐서 동일하게 만드는 통신”
AllReduce mismatch는 “GPU들 사이에 계산/통신 상태가 안 맞는 것”


🔥 NaN과의 연결

흐름은 보통 이렇게 갑니다:

 
 
한 GPU에서 NaN
→ backward 실패
→ AllReduce 참여 못함
→ 다른 GPU 대기
→ timeout
→ watchdog
 

그래서 NaN과 AllReduce mismatch는 연결되는 경우가 많습니다.


📌 운영 관점 체크 순서

1️⃣ NaN 먼저 확인
2️⃣ 특정 rank 죽었는지 확인
3️⃣ NCCL timeout 로그 확인
4️⃣ 해당 노드 isolate

 

 

반응형

댓글