Получение mpirun для распознавания всех ядер на каждом узле
Я установил два узла для MPI, aml1 (основной) и aml2 (рабочий). Я пытаюсь использовать mpirun со сценариями R и использую библиотеки Rmpi и doMPI. Спецификации для обеих машин одинаковы:
On RHEL 7.3
# lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 32
On-line CPU(s) list: 0-31
Thread(s) per core: 2
Core(s) per socket: 8
Socket(s): 2
NUMA node(s): 2
Vendor ID: GenuineIntel
CPU family: 6
Model: 45
Model name: Intel(R) Xeon(R) CPU E5-2690 0 @ 2.90GHz
Stepping: 7
CPU MHz: 2900.000
BogoMIPS: 5790.14
Virtualization: VT-x
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 20480K
NUMA node0 CPU(s): 0-7,16-23
NUMA node1 CPU(s): 8-15,24-31
Если вы хотите увидеть вывод hwloc lstopo.
Я использую OpenMPI 1.10.5 и вижу процессы, запущенные на aml1 и aml2. Однако я не вижу, чтобы мой тестовый скрипт работал быстрее, когда я увеличиваю количество рабочих, порожденных из mpirun, и, таким образом, я не вижу какого-либо сокращения времени вычислений. Это заставляет меня предположить, что mpirun неправильно определяет, сколько ядер доступно, или что я неправильно назначаю его в hostfile или rankfile.
Если я изменю свой файл хоста или файл ранга на другие значения слотов:
$ cat hosts
aml1 slots=4 max_slots=8 #I can change this to 10 slots
aml2 slots=4
$ cat rankfile
rank 0=aml1 slot=0:0
rank 1=aml1 slot=0:1
rank 2=aml1 slot=0:2
rank 3=aml1 slot=0:3
rank 4=aml2 slot=0:6
rank 5=aml2 slot=0:7 #I can add more ranks
И тогда я бегу:
$ mpirun -np 1 --hostfile hosts --rankfile rankfile R --slave -f example7.R
$ cat example7.R
library(doMPI)
cl <- startMPIcluster(verbose=TRUE)
registerDoMPI(cl)
system.time(x <- foreach(seed=c(7, 11, 13), .combine="cbind") %dopar% {
set.seed(seed)
rnorm(90000000)
})
closeCluster(cl)
mpi.quit(save="no")
Я до сих пор получаю аналогичные истекшие системные времена:
Spawning 5 workers using the command:
5 slaves are spawned successfully. 0 failed.
user system elapsed
9.023 7.396 16.420
Spawning 25 workers using the command:
25 slaves are spawned successfully. 0 failed.
user system elapsed
4.752 8.755 13.508
Я также пытался настроить Torque и собрать openmpi с опцией tm configure, но у меня есть отдельные проблемы с этим. Я считаю, что мне не нужно использовать Torque, чтобы выполнить то, что я хочу сделать, но, пожалуйста, подтвердите, если я ошибаюсь.
То, что я хочу сделать, это запустить скрипт R с Rmpi и doMPI. Сам скрипт R должен быть запущен только один раз, с фрагментом кода, созданным для кластера. Я хочу максимизировать количество ядер, доступных на обоих узлах (aml,aml2).
Цени любую помощь от сообщества!
Обновление 1
Вот немного подробнее: я запускаю следующее, меняя хост-файл для каждого запуска:
$ mpirun -np 1 --hostfile hosts [using --map-by slot or node] R --slave -f example7.R
+----------------+-----------------+-----------------+
| | //--map-by node | //--map-by slot |
+----------------+-----------------+-----------------+
| slots per host | time | time |
| 2 | 24.1 | 24.109 |
| 4 | 18 | 12.605 |
| 4 | 18.131 | 12.051 |
| 6 | 18.809 | 12.682 |
| 6 | 19.027 | 12.69 |
| 8 | 18.982 | 12.82 |
| 8 | 18.627 | 12.76 |
+----------------+-----------------+-----------------+
Должен ли я получать сокращенное время? Или это так хорошо, как это получается? Я чувствую, что должен иметь возможность увеличить свои слоты на хост до 30 для пиковой производительности, но он достигает пика около 4 слотов на хост.
1 ответ
Я думаю, что нашел ответ на свой вопрос.
Поскольку я новичок в этом, я предполагал, что Torque будет автоматически использовать все "ядра", доступные на машине / узле. Поскольку у меня 32 ядра, я ожидал, что на каждый узел будет порождаться 32 рабочих. Но на самом деле существует 16 физических ядер, причем каждое из этих 16 ядер имеет гиперпоточность, что позволяет использовать 16x2 ядра на машине. Из моего понимания Torque запускает один процесс на процессор (или физическое ядро в этом примере). Так что я не должен ожидать, что 32 рабочих появятся на каждом узле.
Я рассмотрел дополнительную информацию о поддержке NUMA, и в Open FAQ по MPI RHEL обычно требует установки пакетов numactl-devel перед сборкой для поддержки соответствия памяти. Так что я сделал это для каждого узла, и на самом деле я могу запустить R-скрипт через Torque, определяя 8 ядер или 16 ядер на узел. Теперь время вычислений довольно схоже. Если я увеличу количество ядер до 18/20 на узел, производительность снизится, как и ожидалось.
Ниже приведены параметры.configure для Torque и Open MPI соответственно:
./configure --enable-cgroups --with-hwloc-path=/usr/local --enable-autorun --prefix=/var/spool/torque
./configure --prefix=/var/nfsshare/openmpi1.10.5-tm-3 --with-tm=/var/spool/torque/