Distributed learning이 시작되지 않는 경우
Tensorflow docker를 새로 생긴 A100 GPU 서버에 옮겨놓고 코드를 돌려보려고 하는데
트레이닝이 시작이 안되고... 계속 멈춰 있는 현상이 발생하였다.
(강제 종료도 안되고... ㅠㅠ)
Tensorflow에서 다음과 같이 Mirrored strategy를 사용했는데, NCCL (CUDA에서 GPU간 커뮤니케이션 관련 라이브러리인듯) 을 기본으로 사용한다고 한다. 그런데 NCCL 설정에 문제가 있으면 이런 현상이 발생한다고 한다.
mirrored_strategy = tf.distribute.MirroredStrategy()
코드 실행하기 전에 Shell에서 다음과 같이 설정을 바꾸어주니 돌아가는 것 같다.
export NCCL_P2P_DISABLE="1"
export NCCL_IB_DISABLE="1"
또는 Mirrored strategy의 기본 설정을 쓰지 말고, 아래처럼 cross_device_ops를 바꿔주면 동작하는 것 같다.
다만 속도가 조금 느린 것 같기는 하다..
mirrored_strategy = tf.distribute.MirroredStrategy(cross_device_ops=tf.distribute.ReductionToOneDevice())
이 옵션을 쓰더라도 서버 환경에 따라 에러가 나면서 안되는 경우가 있었다. 아래처럼 libdevice 파일을 찾을 수 없다고 메시지가 나온다.
0) INTERNAL: libdevice not found at ./libdevice.10.bc
[[{{node AdamW/update_1_290/StatefulPartitionedCall}}]]
[[gradient_tape/replica_1/conv1d_aspp/convblock8/convblock8_conv3/Conv2D/Conv2DBackpropFilter/_472]]
[[Identity_511/_1214]]
(1) INTERNAL: libdevice not found at ./libdevice.10.bc
[[{{node AdamW/update_1_290/StatefulPartitionedCall}}]]
[[gradient_tape/replica_1/conv1d_aspp/convblock8/convblock8_conv3/Conv2D/Conv2DBackpropFilter/_472]]
(2) INTERNAL: libdevice not found at ./libdevice.10.bc
[[{{node AdamW/update_1_290/StatefulPartitionedCall}}]]
Stack overflow에서 비슷한 증상에 대한 토론이 있어 참고해서 적어보면 (python - TensorFlow libdevice not found. Why is it not found in the searched path? - Stack Overflow)
먼저 anaconda에서 cuda-nvcc를 설치한다.
conda install -c nvidia cuda-nvcc
설치가 오나료되면 ~/anaconda3/envs/{environment name} 경로에 nvmm 폴더가 새롭게 생성된다. 이 폴더에 libdevice 파일이 들어가 있고, 이를 CUDA에서 인식할 수 있도록 아래처럼 경로를 Export 해준다.
export XLA_FLAGS=--xla_gpu_cuda_data_dir=/home/kdpark/anaconda3/envs/{environment name}
여기까지 설정해주니 에러 없이 multi gpu training이 잘 되는 것을 확인할 수 있었다.