반응형


[W ProcessGroupNCCL.cpp:1618] Rank 1 using best-guess GPU 1 to perform barrier as devices used by this process are currently unknown. This can potentially cause a hang if this rank to GPU mapping is incorrect.Specify device_ids in barrier() to force use of a particular device. 해결법

 

에러 메시지


[W ProcessGroupNCCL.cpp:1618] Rank 1 using best-guess GPU 1 to perform barrier as devices used by this process are currently unknown. 
This can potentially cause a hang if this rank to GPU mapping is incorrect.Specify device_ids in barrier() to force use of a particular device.

 

이후 코드 돌아가다가 갑자기 사망.

 

 

에러 발생 지점


$python -m torch.distributed.launch

 

pytorch의 torch.distributed.launch, 즉 multi-gpu 상황일 때 발생한다.

일반적으로 torch.distributed.launch를 하게 되면, 자동으로 프로세스에 process local rank가 할당되고, local rank에 따라 cuda:0, cuda:1 형식으로 디바이스를 할당하게 된다. 그리고 다른 프로세스가 동시 점유 하여 문제가 발생하지 않도록, barrier라는 개념이 있는데, 이 barrier가 정상적으로 작동하지 못하게 되면 문제가 발생한다.

 

다양한 원인이 존재한다.

  • NCCL, NVCC 버전 문제 / 드라이버 손상
  • 동일한 Local Rank를 가진 Zombie 프로세스가 백그라운드에 살아있어서 발생하는 문제
  • Pytorch 버전 문제(?)

 

해결법


  1. NCCL, NVCC 드라이버 문제

    NCCL과 CUDA와 cuDNN을 다시 설치해주면 문제가 해결될 수 있다.

  2. Zombie Process 문제

    $ps -ef | grep python

    위 명령어를 통해 Python이 사용되고 있는 프로세스를 찾고 종료시킨다.
    일반적으로, 그래픽카드를 사용하여 생기는 문제이므로, 간단하게

    $nvidia-smi

    위 명령어를 통해 process의 pid를 얻어내고 종료시켜도 좋다.

  3. Pytorch 버전 문제

    물론 정상적인 방법은 아니다. 위 방법을 모두 시도했을때도 실패했다면 시도를 해보는 것이 바람직하다.
    해당 이슈는 Pytorch가 1.9로 버전업되면서 분산학습에 torch elastic이 사용되는 경우가 있다. 여기서 문제가 발생하는 경우가 꽤 많은 것 같다.

    완벽한 대응은 아니었지만, 필자는 huggingface의 BERT를 Tesla V100 2대로 분산학습 시키는 과정에서 위 에러를 만났고, 끝까지 해결법을 찾지 못해 torch 버전을 아예 1.6버전으로 낮춰버리고 다시 학습을 돌렸더니 정상적으로 동작을 하는 모습을 확인할 수 있었다. 

    코드에 버전 호환이 가능하다면, Torch 버전을 내려서 해결할 수도 있을 것 같다.

 

 

반응형
블로그 이미지

Hyunsoo Luke HA

석사를 마치고 현재는 Upstage에서 전문연구요원으로 활동중인 AI 개발자의 삽질 일지입니다! 이해한 내용을 정리하는 용도로 만들었으니, 틀린 내용이 있으면 자유롭게 의견 남겨주세요!

,