Ошибка: Некоторые операции NCCL завершились неудачно или истекло время ожидания

#pytorch #gpu #distributed #nvidia-docker

Вопрос:

Во время выполнения распределенного обучения на 4 графических процессорах A6000 я получаю следующую ошибку:

 [E ProcessGroupNCCL.cpp:630] [Rank 3] Watchdog caught collective operation timeout: WorkNCCL(OpType=BROADCAST, Timeout(ms)=1800000) ran for 1803710 milliseconds before timing out.   [E ProcessGroupNCCL.cpp:390] Some NCCL operations have failed or timed out. Due to the asynchronous nature of CUDA kernels, subsequent GPU operations might run on corrupted/incomplete data. To avoid this inconsistency, we are taking the entire process down.   terminate called after throwing an instance of 'std::runtime_error'  what(): [Rank 2] Watchdog caught collective operation timeout:  WorkNCCL(OpType=BROADCAST, Timeout(ms)=1800000) ran for 1804406 milliseconds before timing out.   [E ProcessGroupNCCL.cpp:390] Some NCCL operations have failed or timed out. Due to the asynchronous nature of CUDA kernels, subsequent GPU operations might run on corrupted/incomplete data. To avoid this inconsistency, we are taking the entire process down.  

Я использую стандартный докер NVidia PyTorch. Интересно то, что обучение отлично работает для небольших наборов данных, но для больших наборов данных я получаю эту ошибку. Таким образом, я могу подтвердить, что обучающий код верен и действительно работает.

Нигде нет фактической ошибки во время выполнения или какой-либо другой информации, позволяющей получать фактические сообщения об ошибках.

Ответ №1:

Следующие два решили проблему:

  • Увеличьте SHM по умолчанию (общую память) для CUDA до 10g (я думаю, что 1g также сработал бы). Вы можете сделать это в docker, выполнив команду, передав --shm-size=10g . Я тоже пасую --ulimit memlock=-1 .
  • export NCCL_P2P_LEVEL=NVL .

Советы по отладке

Для проверки текущего SHM,

 df -h # see the row for shm  

Чтобы просмотреть отладочные сообщения NCCL:

 export NCCL_DEBUG=INFO  

Запустите тест пропускной способности p2p для канала связи GPU-GPU:

 cd /usr/local/cuda/samples/1_Utilities/p2pBandwidthLatencyTest sudo make ./p2pBandwidthLatencyTest  

Для графического процессора A6000 4 это печатает:

введите описание изображения здесь

Матрица показывает полосу пропускания между каждой парой графических процессоров, и при использовании P2P она должна быть высокой.