2017-02-10 17 views
1

Я создал два узла для MPI, aml1 (master) и aml2 (рабочий). Я пытаюсь использовать mpirun с R скриптами и использовать библиотеки Rmpi ​​и doMPI. Спецификации для обеих машин одинаковы:Получение mpirun для распознавания всех ядер на каждом узле

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 

If you care to see hwloc lstopo output.

Я использую 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).

Цените любую помощь из сообщества!

Update 1

Вот немного более подробно: я бегу следующее, изменяя hostfile для каждого прогона:

$ 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 слотов на хост.

ответ

0

Думаю, я нашел ответ на свой вопрос.

Поскольку я новичок в этом, я был в предположении, что Torque автоматически будет использовать все «ядра», доступные на машине/узле. Поскольку у меня 32 ядра, я ожидал, что 32 узла будут нереститься на узел. Но на самом деле, есть 16 физических ядер, каждый из которых имеет 16 ядер с гиперпотоком, что делает 16x2 ядра доступными на машине. Из моего понимания Torque запускает один процесс на процессор (или физическое ядро ​​в этом примере). Поэтому я не должен ожидать, что на каждый узел будет создано 32 рабочих.

Я просмотрел дополнительную информацию о поддержке NUMA и по Open MPI FAQ, RHEL обычно требует установки пакетов numactl-devel перед сборкой для поддержки близости памяти. Поэтому я сделал это для каждого узла, и я действительно могу запустить R-скрипт через Torque, определяя 8 ядер или 16 ядер на узел. Теперь время вычислений очень похоже. Если я увеличиваю до 18/20 ядер на узел, производительность снижается, как ожидалось.

Ниже приведены мои варианты .configure для крутящего момента и 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/