Ошибка неверного адреса для распределенного развертывания PyTorch - PullRequest
0 голосов
/ 05 мая 2019

У меня есть распределенный код нейронной сети, реализованный в 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: После некоторых модификаций я попытался запустить код на одном графическом процессоре сервера и выяснил, что такая же ошибка возникает при обмене данными. Есть идеи, ребята?

...