Я новичок в NCCL. В последнее время я тестировал примеры, приведенные в [url] https://docs.nvidia.com/deeplearning/sdk/nccl-developer-guide/docs/examples.html#example -2-one-device-per-process-or-thread [/ url]
Вот так я запускаю два процесса: mpirun -n 2 ./my_nccl
, в которых my_nccl - исполняемый файл, скомпилированный из примера.
Я добавил sleep (600) сразу после ncclAllReduce функция, так что я могу контролировать состояние сети. Затем я обнаружил это:
tcp 0 0 <IB ip>:50928 0.0.0.0:* LISTEN 42060/my_nccl
tcp 0 0 0.0.0.0:1024 0.0.0.0:* LISTEN 42059/my_nccl
tcp 0 0 <IB ip>:56193 0.0.0.0:* LISTEN 42059/my_nccl
tcp 0 0 0.0.0.0:1025 0.0.0.0:* LISTEN 42060/my_nccl
tcp 0 0 127.0.0.1:40708 127.0.0.1:35753 ESTABLISHED 42060/my_nccl
tcp 0 0 <IB ip>:51550 <IB ip>:56193 ESTABLISHED 42060/my_nccl
tcp 0 0 <IB ip>:36210 <IB ip>:50928 ESTABLISHED 42059/my_nccl
tcp 0 0 <IB ip>:56193 <IB ip>:51550 ESTABLISHED 42059/my_nccl
tcp 0 0 127.0.0.1:40710 127.0.0.1:35753 ESTABLISHED 42059/my_nccl
tcp 0 0 <IB ip>:50928 <IB ip>:36210 ESTABLISHED 42060/my_nccl
unix 2 [ ACC ] SEQPACKET LISTENING 3185032501 42059/my_nccl @cuda-uvmfd-4026531836-42059
unix 2 [ ACC ] SEQPACKET LISTENING 3185036696 42060/my_nccl @cuda-uvmfd-4026531836-42060
unix 3 [ ] STREAM CONNECTED 3185033392 42060/my_nccl
unix 3 [ ] STREAM CONNECTED 3185032487 42059/my_nccl
unix 3 [ ] STREAM CONNECTED 3185033393 42060/my_nccl
unix 3 [ ] STREAM CONNECTED 3185032488 42059/my_nccl
unix 3 [ ] STREAM CONNECTED 3185033388 42060/my_nccl
unix 3 [ ] STREAM CONNECTED 3185032494 42059/my_nccl
unix 3 [ ] STREAM CONNECTED 3185032495 42059/my_nccl
unix 3 [ ] STREAM CONNECTED 3185033385 42060/my_nccl
unix 3 [ ] STREAM CONNECTED 3185033389 42060/my_nccl
unix 3 [ ] STREAM CONNECTED 3185032490 42059/my_nccl
unix 3 [ ] STREAM CONNECTED 3185032491 42059/my_nccl
unix 3 [ ] STREAM CONNECTED 3185033386 42060/my_nccl
Удаляя функции NCCL в примере кода, я могу сказать, что ip 0.0.0.0 и 127.0.0.1 оба прослушиваются OpenMPI. И, читая код NCCL в ncclGetUniqueId и ncclCommInitRank , я думаю, что NCCL используется для передачи uniqueId, информации о процессе и т. Д. c.
1. Итак, вот мой вопрос: я не могу подтвердить, выполняет ли NCCL AllReduce через интерфейс IB или P CIe между графическими процессорами одного хоста. В соответствии с do c https://docs.nvidia.com/deeplearning/sdk/nccl-developer-guide/docs/env.html#nccl -socket-ifname я могу контролировать, какой сетевой интерфейс использовать. Но я не могу полностью понять https://docs.nvidia.com/deeplearning/sdk/nccl-developer-guide/docs/env.html#nccl -p2p-level об использовании P CIe. В чем разница между ними в NCCL?
2.Если AllReduce выполняется через P CIe на том же хосте, есть ли какие-либо доказательства или есть ли способ, которым я могу это контролировать?
3.Могу ли я выбрать интерфейс IB для AllReduce или AllGather с помощью переменных среды NCCL?
Вот мое окружение и устройство:
Ubuntu 16.04.6 LTS
NCCL версия 2.4.8 + cuda10.0
cuda Версия драйвера: 410.48
GeForce GTX 1080 Ti
Спасибо!