[MultiGPU] Accelerate MultiGPU 사용시 Timeout Issue 해결하기

UNGGI LEE·2023년 7월 30일
1

Background

Huggingface에서는 Transformers 라이브러리와 Accelerate 라이브러리 두 가지에서 모두 MultiGPU를 사용할 수 있도록 지원한다. 개인적으로 두 가지 라이브러리를 사용하여 MultiGPU Training을 해본 결과, Accelerate가 MultiGPU사용에 최적화되어 있었다.예를들어, MultiGPU와 관련한 상세한 문서를 제공하거나 이슈에 대한 여러가지 해결책들이 자세하게 제시된 점을 들 수 있다.

아래 이슈는 A100 8대로 MultiGPU 훈련을 하던 중 발생한 이슈에 대한 해결방법이다.

Issue

Training Recipe

  • A100 (80GB) 8대
  • Accelerate
  • Nvidia Docker
  • DeepSpeed
  • Polyglot 12.8b Full Fine-tuning

Issue

처음에 이준범님이 번역해주신 KoAlpaca 데이터셋을 사용했을때는 별도의 이슈가 없었다. KoAlpaca 데이터셋 자체의 크기가 20MB 정도로 작았기 때문일 것이라 짐작된다. 이슈 발생은 대량의 데이터(약 70GB)로 훈련할 때 발생하였다.

[Rank 0] Watchdog caught collective operation timeout: WorkNCCL(OpType=BROADCAST, Timeout(ms)=1800000) ran for 1808493 milliseconds before timing out.

해당 이슈의 로그를 찬찬히 살펴보면, Timeout 부분이 있다. 이에 대해 검색해본 결과, Huggingface에서 근무하시는 킹갓 sgugger 님이 친절하게 작성한 답변을 찾아볼 수 있었다.

Accelerate 코드에서 (https://github.com/huggingface/accelerate) 에서 살펴봤을때 어떻게 활용하는지 감이 안잡혔는데, 아래와 같이 코드에 추가해주면 정상적으로 작동하였다. 핵심은 기존 1800초를 5400초 정도로 늘려주는 것이다.

# https://github.com/huggingface/accelerate/issues/314
from accelerate import InitProcessGroupKwargs

...

def main():

	# 여기 코드 추가
    ipg_handler = InitProcessGroupKwargs(
            timeout=timedelta(seconds=5400)
            )

	# accelerator 선언할때, kwargs_handlers=[ipg_handler] 해당 문구 추가
    accelerator = Accelerator(
            kwargs_handlers=[ipg_handler], # 이 부분 추가
            gradient_accumulation_steps=args.gradient_accumulation_steps, 
            **accelerator_log_kwargs
            )
	...

간단한 해결방법이었는데, 생각보다 트러블 슈팅에 시간이 많이 걸렸다. 미래의 나를 포함해서 같은 이슈를 겪으시는 분들이 빠르게 해결하시길 바라는 마음으로 글을 남긴다.

Reference

profile
NLP Researcher & ML Engineer @i-Scream Edu

2개의 댓글

comment-user-thumbnail
2023년 7월 31일

좋은 정보 감사합니다

1개의 답글