"A request was made to bind to that would result in binding more processes than cpus on a resource" mpirun 命令(用于 mpi4py)

"A request was made to bind to that would result in binding more processes than cpus on a resource" mpirun command (for mpi4py)

我正在 运行宁 OpenAI 基线,特别是 Hindsight Experience Replay 代码。 (但是,我认为这个问题与代码无关,并且是与 MPI 相关的问题,因此我在 Whosebug 上发帖。)

You can see the README there 但重点是,运行 的命令是:

python -m baselines.her.experiment.train --num_cpu 20

其中 CPU 的数量可以变化并且适用于 MPI。

我在一台机器上成功地运行使用 1-4 个 CPU(即 --num_cpu x for x=1,2,3,4)使用 HER 训练脚本:

CPU 的数量似乎是 8 个,因为我有一个带超线程的四核 i7 Intel 处理器,Python 确认它有 8 个 CPU。

(py3-tensorflow) daniel@titan:~/baselines$ ipython
Python 3.5.2 (default, Nov 23 2017, 16:37:01) 
Type 'copyright', 'credits' or 'license' for more information
IPython 6.2.1 -- An enhanced Interactive Python. Type '?' for help.

In [1]: import os, multiprocessing

In [2]: os.cpu_count()
Out[2]: 8

In [3]: multiprocessing.cpu_count()
Out[3]: 8

不幸的是,当我 运行 有 5 个或更多 CPU 时,我收到此消息阻止来自 运行ning:

的代码
(py3-tensorflow) daniel@titan:~/baselines$ python -m baselines.her.experiment.train --num_cpu 5
--------------------------------------------------------------------------
A request was made to bind to that would result in binding more
processes than cpus on a resource:

   Bind to:     CORE
   Node:        titan
   #processes:  2
   #cpus:       1

You can override this protection by adding the "overload-allowed"
option to your binding directive.
--------------------------------------------------------------------------

这就是我迷路的地方。没有我需要修复的错误消息或代码行。因此,我不确定我什至在代码中添加 overload-allowed 的位置?

这段代码在高层的工作方式是它接受这个参数并使用 python subprocess 模块来 运行 一个 mpirun 命令。但是,在命令行上检查 mpirun --help 不会将 overload-allowed 显示为有效参数。

谷歌搜索此错误消息会导致 openmpi 存储库中出现问题,例如:

但我不确定它是 OpenMPI 的东西还是 mpi4py 的东西?

如果有帮助,这里是我的虚拟环境中的pip list

(py3.5-mpi-practice) daniel@titan:~$ pip list
DEPRECATION: The default format will switch to columns in the future. You can use --format=(legacy|columns) (or define a format=(legacy|columns) in your pip.conf under the [list] section) to disable this warning.
decorator (4.2.1)
ipython (6.2.1)
ipython-genutils (0.2.0)
jedi (0.11.1)
line-profiler (2.1.2)
mpi4py (3.0.0)
numpy (1.14.1)
parso (0.1.1)
pexpect (4.4.0)
pickleshare (0.7.4)
pip (9.0.1)
pkg-resources (0.0.0)
pprintpp (0.3.0)
prompt-toolkit (1.0.15)
ptyprocess (0.5.2)
Pygments (2.2.0)
setuptools (20.7.0)
simplegeneric (0.8.1)
six (1.11.0)
traitlets (4.3.2)
wcwidth (0.1.7)

所以,长话短说:

谢谢!

overload-allowed 是传递给 mpirun (source) 的 --bind-to 参数的限定符。我不知道确切的语法,但我会从

开始
mpirun ... --bind-to core overload-allowed

请注意,超线程更多的是营销而不是绩效奖金。

您的 i7 实际上可以有四个硅内核和四个 "logical"。逻辑的基本上尝试使用当前未使用的硅内核的资源。问题是一个好的 HPC 程序将使用 100% 的 CPU 硬件,而超线程将没有资源来成功运行。

因此,"overload" "cores" 是安全的,但它不是性能提升候选 #1。

关于论文作者给出的关于重现结果的建议。在最好的情况下,更少的 cpu 意味着学习缓慢。但是,如果无论如何调整超参数,学习都不会收敛到预期值,那么就有理由仔细研究所提出的算法。

虽然 IEEE754 计算在不同顺序下确实会有所不同,但这种差异不应起决定性作用。

错误消息表明 mpi4py 是在 Open MPI 之上构建的。

默认情况下,插槽是核心,但如果您希望插槽成为超线程,则应该

mpirun --use-hwthread-cpus ...