У меня есть распределенный код нейронной сети, реализованный в pyTorch с openmpi back-end. Когда я запускаю этот код на моей локальной машине с одним графическим процессором (порождает 4 процесса), он работает отлично.
Но когда я пытаюсь запустить один и тот же код на сервере с 2 графическими процессорами (снова 4 процесса по 2 на каждом графическом процессоре), я получаю следующую ошибку:
--------------------------------------------------------------------------
No OpenFabrics connection schemes reported that they were able to be
used on a specific port. As such, the openib BTL (OpenFabrics
support) will be disabled for this port.
Local host: g2-nasp
Local device: mlx5_0
Local port: 1
CPCs attempted: rdmacm, udcm
--------------------------------------------------------------------------
Start node: 1 Total: 3
Start node: 2 Total: 3
Start node: 0 Total: 3
[1557057502.671443] [g2-nasp:29190:0] cma_ep.c:113 UCX ERROR process_vm_readv delivered 0 instead of 131072, error message Bad address
[g2-nasp:29185] 11 more processes have sent help message help-mpi-btl-openib-cpc-base.txt / no cpcs for port
[g2-nasp:29185] Set MCA parameter "orte_base_help_aggregate" to 0 to see all help / error messages
Кажется, что появляется строка ошибки, когда я пытаюсь связаться с помощью распределенного пакета pytorch. Если я удаляю линии связи, кажется, что тренировочный процесс идет независимо, без какой-либо синхронизации. Код синхронизации выглядит следующим образом:
def broadcast(data, rank, world_size, recv_buff_l, recv_buff_r):
left = ((rank - 1) + world_size) % world_size
right = (rank + 1) % world_size
send_req_l = dist.isend(data, dst=left)
recv_req_r = dist.irecv(recv_buff_r, src=right)
recv_req_r.wait()
send_reql.wait()
send_req_r = dist.isend(data, dst=right)
recv_req_l = dist.irecv(recv_buff_l, src=left)
recv_req_l.wait()
send_req_r.wait()
Я не уверен, что является причиной этой ошибки. Хотя, если это помогает, я использую следующие настройки среды:
Local Machine:
Ubuntu 18.04
CUDA 10.1
CuDNN 7.5
OpenMPI 4.0.1
GPU: NVIDIA GTX 960M
Server Machine:
Ubuntu 16.04
CUDA 10.1
CuDNN 7.5
OpenMPI 3.1.4
GPU: NVIDIA Tesla K40c [2 GPUs]
Может кто-нибудь посоветовать, что я делаю не так? Почему синхронизация не работает для нескольких графических процессоров?
ОБНОВЛЕНИЕ 01: После некоторых модификаций я попытался запустить код на одном графическом процессоре сервера и выяснил, что такая же ошибка возникает при обмене данными. Есть идеи, ребята?