Deepspeed watchdog timeout error
-
환경:
- GPU: RTX 3090 × 8 (24GB VRAM)
- 프레임워크: PyTorch 2.6.0, CUDA 12.3, NCCL 2.21.5
- 분산 학습: DeepSpeed + ZeRO-2 + torch.distributed
- 학습 구조: 단일 노드, 8GPU 분산
-
오류 발생 시점:
- save_checkpoint() 실행 직후 혹은 이후에 all_reduce() 연산 수행 중
- 데이터셋 크기가 클 때만 발생, 소규모(예: 10개)의 경우 정상
-
오류 메시지 요약:
- torch.distributed.DistBackendError: Watchdog caught collective operation timeout
- ALLREDUCE가 600초 이상 지연되며, NCCL 워치독에 의해 종료됨
-
문제 원인 분석
- DeepSpeed ZeRO-2 특성:
- rank 0만 전체 모델 가중치를 저장하며, 다른 rank들은 옵티마이저 shard만 저장
- 이로 인해 rank 간 checkpoint 저장 소요 시간 차이 발생
- AllReduce 호출 타이밍 불일치:
- 일부 rank가 체크포인트 저장 중일 때, 다른 rank는 이미 backward → all_reduce 진입
- 이로 인해 NCCL 통신 불일치 → 워치독 타임아웃
- Checkpoint 저장 시간이 장기화:
- 모델이 크거나, 원격 디스크 사용 시 수분 단위 저장 발생 가능
- 기본 NCCL 워치독 타임아웃(600초)에 도달할 위험 증가
- 디버깅 과정 정리
1. 오류 로그 기반 분석
- all_reduce에서 Watchdog에 의해 통신 타임아웃 감지
- init_process_group(timeout=…) 설정은 무효 (초기화 시점 타임아웃이므로 관련 없음)
2. 실행 시간 로깅 및 랭크 확인
- train_epoch() 내 로그로 랭크별 처리 시간 분석
- 특정 노드가 아닌 다양한 랭크에서 오류 발생 → 하드웨어 고장보다 통신 병목 가능성
3. 데이터셋 크기 변화 테스트
- 10개 이하 → 학습 정상
- 1000개 이상 → 동일 오류 발생
- 결론: 통신 대상 데이터 크기(grad/allreduce tensor)가 커질 때 문제가 유발됨
4. DeepSpeed 설정 변경
- overlap_comm: false → 효과 없음
- allgather_bucket_size, reduce_bucket_size 축소 (2e7) → 효과 없음
- ZeRO Stage 2 → 1 전환 → 여전히 오류 발생
5. 체크포인트 저장 로직 수정
- @main_process 제거 → 모든 랭크에서 save_checkpoint 실행
- 저장 직후 torch.distributed.barrier() 호출로 동기화 추가
- 효과 없음, 동일 오류 발생
6. NCCL 환경 변수 실험
- NCCL_TIMEOUT: 사용 불가 (Deprecated)
- TORCH_NCCL_HEARTBEAT_TIMEOUT_SEC=1800: 적용해도 오류 지속
- NCCL_P2P_DISABLE=1: P2P 통신 비활성화 → 효과 없음
- 기타 (NCCL_BLOCKING_WAIT, NCCL_ASYNC_ERROR_HANDLING) → 유효 설정이나 효과 없음