我有一些python代码,我经常生成多个进程。我收到一个错误:
ORTE_ERROR_LOG: The system limit on number of pipes a process can open was reached in file odls_default_module.c at line 809
我的代码大致看起来像这样
import mpi4py
comm = MPI.COMM_WORLD
...
icomm = MPI.COMM_SELF.Spawn(sys.executable,args=["front_process.py",str(rank)],maxprocs=no_fronts)
...
message = icomm.recv(source=MPI.ANY_SOURCE,tag=21)
...
icomm.Free()
经常调用Spawn命令,我认为尽管给出icomm.Free()
命令,但在完成后它们仍保持“打开”状态。如何正确“关闭”衍生过程?
答案 0 :(得分:1)
MPI_COMM_FREE
的MPI规范声明“......只有在没有其他活动引用的情况下才会释放该对象。”您可以通过调用{{}来断开进程。 1}}在连接它们的所有内部通信器的两端。等效的mpi4py调用可能是MPI_COMM_DISCONNECT
。
您看到的错误可能来自icomm.Disconnect()
(符号链接为orterun
和mpirun
),而不是来自主排名。 mpiexec
是启动所有MPI进程(初始进程和稍后生成的进程)然后将其标准输出重定向到其自己的标准输出,以便您可以查看每个级别的输出。当在本地主机上启动进程时,orterun
使用简单的orterun
/ fork()
机制作为exec()
框架的一部分来生成新的排名并使用管道来检测成功启动和IO转发。启动检测管道仅在很短的时间内打开,但只要等级正在运行,IO转发管道就会保持打开状态。如果你有许多同时运行的排名,很多管道将保持打开状态,因此会显示错误消息。
错误消息有点误导,因为有两种“描述符太多”的情况,Open MPI不区分它们。第一种情况是达到硬内核限制但这通常是一个巨大的值。第二种情况是达到文件描述符数量的每进程限制。后者可以使用odls
命令控制。您应该使用ulimit
检查案例中的值,并最终增加它。例如:
ulimit -n
此处user@host$ ulimit -n 123456
user@host$ mpiexec -n 1 ... ./spawning_code.py arg1 arg2 ...
是描述符数量的理想限制,并且不能超过123456
可以获得的硬限制。如果您是从脚本运行程序(为方便起见或因为您将作业提交到某个批处理排队系统),您应该在调用ulimit -nH
/ {{ulimit -n
之前将mpirun
行放在脚本中1}}。
同样在上面的文字中,单词 rank 和 process 用于指代相同的事物。