f2py和MPI池:在clus上删除父作业时,子进程继续

2024-04-24 07:13:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用MPIPool在集群上运行一个30核的Python作业。当我通过无处不在的qdel <job ID>命令删除作业时,只有父进程被终止,而子进程继续运行。换言之:qdel使作业ID从队列中消失,但是30(=核心数)启动的Python进程仍然存在于后台,这对集群负载有很大贡献。此外,我只能“手动”终止我登录的一个节点上的后台进程。在

另一个使问题复杂化的事实是,我的Python脚本调用一段Fortran代码(我使用f2py模块来实现这一点)。我以前注意到,在本地运行程序时,Fortran不响应Ctrl+C中断。一旦程序再次到达Python层,程序将中止。在

我已经查阅了与MPIPool相关的文档,我使用这些文档来并行处理这项工作,但是我没有能够准确地指出哪里出了问题。理想情况下,我希望子进程定期调用其父进程,并在发现父进程不在时终止它自己。删除孩子的工作,似乎只是把绳子从孩子身上剪下来。在

下面的代码片段显示了pool对象是如何集成我的主代码的。此外,我使用bash脚本将作业提交到集群队列(包含echo 'mpirun -np '$NCORES' python '$SKRIPTNAME >> $TMPFILE),并请求我要使用的核心数量。后者应该可以正常工作。在

import emcee 
from emcee.utils import MPIPool

pool = MPIPool()

    if not pool.is_master():
        pool.wait()
        sys.exit(0)

sampler = emcee.EnsembleSampler(nwalkers, ndim, lnprob, pool = pool) 
pos, prob, state = sampler.run_mcmc(p0, 1000) # p0 contains the initial walker positions

pool.close()

背景:我使用emcee模块进行蒙特卡罗模拟。lnprob是一个似然函数,在特定迭代中为绘制的参数集求值。lnprob调用Fortran脚本,该脚本处理计算开销较大的部分。在

编辑:请在下面找到一个问题仍然存在的最小脚本。我已经能够验证f2py显然不是造成问题的原因:

^{pr2}$

此脚本严格遵循emceedocumentation中概述的示例,并正确地合并了pool。老实说,我完全不知道这个故障的根源藏在哪里。我几乎倾向于说,这个问题更与集群有关。在


Tags: 代码程序脚本id核心队列进程作业