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 워치독에 의해 종료됨
  • 문제 원인 분석

  1. DeepSpeed ZeRO-2 특성:
    • rank 0만 전체 모델 가중치를 저장하며, 다른 rank들은 옵티마이저 shard만 저장
    • 이로 인해 rank 간 checkpoint 저장 소요 시간 차이 발생
  2. AllReduce 호출 타이밍 불일치:
    • 일부 rank가 체크포인트 저장 중일 때, 다른 rank는 이미 backward → all_reduce 진입
    • 이로 인해 NCCL 통신 불일치 → 워치독 타임아웃
  3. 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) → 유효 설정이나 효과 없음