让 mpirun 识别每个节点上的所有核心
Getting mpirun to recognize all cores on each node
我已经为 MPI 设置了两个节点,aml1(master)和 aml2(worker)。我正在尝试将 mpi运行 与 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
If you care to see hwloc lstopo output.
我正在使用 OpenMPI 1.10.5,我可以在 aml1 和 aml2 上看到进程 运行ning。但是,当我增加从 mpi运行 生成的工作人员数量时,我没有看到我的测试脚本 运行ning 更快,因此我没有看到计算时间有任何减少。这让我假设 mpi运行 没有正确检测到有多少核心可用,或者我在主机文件或排名文件中错误地分配了它。
如果我将主机文件或排名文件更改为不同的插槽值:
$ 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
我也尝试过使用 tm 配置选项设置 Torque 和构建 openmpi,但我遇到了不同的问题。我相信我不需要使用 Torque 来完成我想做的事情,但请确认我是否不正确。
我想做的是 运行 一个带有 Rmpi 和 doMPI 的 R 脚本。 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 个插槽。
我想我找到了自己问题的答案。
因为我是新手,所以我假设 Torque 会自动使用 machine/node 上可用的所有 "cores"。因为我有 32 个核心,所以我期望每个节点产生 32 个 worker。但实际上,有 16 个物理内核,这 16 个内核中的每一个都具有超线程,这使得一台机器上可以使用 16x2 个内核。根据我的理解,Torque 为每个处理器(或本例中的物理核心)启动一个进程。所以我不应该期望每个节点产生 32 个工人。
我查看了有关 NUMA 支持的更多信息,根据 Open MPI FAQ,RHEL 通常需要在构建之前安装 numactl-devel 包以支持内存关联。所以我为每个节点都这样做了,我实际上能够通过 Torque 运行 一个 R 脚本,为每个节点定义 8 个核心或 16 个核心。现在计算时间非常相似。如果我增加到每个节点 18/20 个核心,那么性能会按预期下降。
下面分别是我的 Torque 和 Open MPI 的 .configure 选项:
./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/
我已经为 MPI 设置了两个节点,aml1(master)和 aml2(worker)。我正在尝试将 mpi运行 与 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
If you care to see hwloc lstopo output.
我正在使用 OpenMPI 1.10.5,我可以在 aml1 和 aml2 上看到进程 运行ning。但是,当我增加从 mpi运行 生成的工作人员数量时,我没有看到我的测试脚本 运行ning 更快,因此我没有看到计算时间有任何减少。这让我假设 mpi运行 没有正确检测到有多少核心可用,或者我在主机文件或排名文件中错误地分配了它。
如果我将主机文件或排名文件更改为不同的插槽值:
$ 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
我也尝试过使用 tm 配置选项设置 Torque 和构建 openmpi,但我遇到了不同的问题。我相信我不需要使用 Torque 来完成我想做的事情,但请确认我是否不正确。
我想做的是 运行 一个带有 Rmpi 和 doMPI 的 R 脚本。 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 个插槽。
我想我找到了自己问题的答案。
因为我是新手,所以我假设 Torque 会自动使用 machine/node 上可用的所有 "cores"。因为我有 32 个核心,所以我期望每个节点产生 32 个 worker。但实际上,有 16 个物理内核,这 16 个内核中的每一个都具有超线程,这使得一台机器上可以使用 16x2 个内核。根据我的理解,Torque 为每个处理器(或本例中的物理核心)启动一个进程。所以我不应该期望每个节点产生 32 个工人。
我查看了有关 NUMA 支持的更多信息,根据 Open MPI FAQ,RHEL 通常需要在构建之前安装 numactl-devel 包以支持内存关联。所以我为每个节点都这样做了,我实际上能够通过 Torque 运行 一个 R 脚本,为每个节点定义 8 个核心或 16 个核心。现在计算时间非常相似。如果我增加到每个节点 18/20 个核心,那么性能会按预期下降。
下面分别是我的 Torque 和 Open MPI 的 .configure 选项:
./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/