我正在使用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
显然不是造成问题的原因:
此脚本严格遵循emcee
documentation中概述的示例,并正确地合并了pool
。老实说,我完全不知道这个故障的根源藏在哪里。我几乎倾向于说,这个问题更与集群有关。在
目前没有回答
相关问题 更多 >
编程相关推荐