我正在尝试多次同时运行Python模拟,但每次运行时参数略有不同。我正在尝试使用multiprocessing
模块来执行此操作。我开始这样的代码,我将基本模拟定义为函数,参数为参数:
import multiprocessing
from math import *
def sim_seq(output_name,input_name,s_val...#more arguments):
#do work here
output.write(#data)
output.close()
return
我还创建了一个文本文件,其中包含用于每次模拟运行的参数,我将其读入并用作以下循环中的参数,我尝试使用多处理:
input_batch=('batch_file.txt')
if __name__ == '__main__':
jobs=[]
with open(input_batch) as f:
for line in f:
line=line.split(' ')
for i in line:
if i[0]=='o':
output_name=str(i[2:])
#read in more parameters from batch_file.txt
p = multiprocessing.Process(
target=sim_seq,
args=(output_name,input_name,s_val...#more arguments))
jobs.append(p)
for i in jobs:
i.start()
这基本上完成了我想要它做的事情,它一次运行三个模拟,每个模拟具有不同的参数。但是,我使用的机器有16个计算节点,每个节点有32个处理器。我想知道如何控制每个模拟运行的位置。例如,我可以告诉每个处理器运行单独的模拟吗?我是使用多处理的新手,我想知道如何分辨处理器或哪个节点做什么。我可以拥有32个独立的参数设置,并在自己的处理器上运行每个32个模拟实例,但所有实例同时运行吗?使用多处理,同时多次运行相同python函数的计算方式最快,但每次运行的参数不同?提前感谢任何意见/建议。
答案 0 :(得分:1)
(我假设您的每个计算节点都是一台独立的计算机,具有自己的一组核心。如果您的计算群集具有某种虚拟化核心的操作系统,因此它们看起来都是本地的,那么您可以忽略下面的“多个节点”位。)
multiprocessing
模块本机处理操作系统的单个实例中的多个进程。如果您在一个节点上启动top
或类似的进程列表,并且它显示了N个核心,那么这就是Python模拟可用的核心数。
但是,在该约束中,您可以根据需要生成和管理任意数量的进程,操作系统将使用其正常的进程调度程序将它们排列在可用的核心上。因此,在您的情况下,我觉得您应该能够在单个节点上并行运行32个单独的模拟。您需要做的就是设置循环以创建32个进程,为它们提供要运行的参数,并等待它们全部完成。
如果您要运行超过32个模拟,则可以设置包含32个工作线程的multiprocessing.Pool
,然后在模拟参数列表上使用pool.map
将工作分配到每个核心
如果你有超过32个模拟,并且你想开始利用单独节点上的核心(你可能需要使用ssh等登录到单独的节点),那么理论上你可以使用来自多处理模块的“远程管理器”来处理这个问题。
但是,我建议看一下IPython.parallel
的强大功能 - 它允许你在多个节点上启动“处理引擎”,然后你可以使用IPython shell将工作分配给节点。这最终将与上述流程池非常相似,只会利用群集中所有计算节点上的所有核心。
或者,您可以设置或利用许多现有集群调度程序(Condor,Sun GridEngine等)中的任何一个来在每个处理节点上启动模拟一次(甚至32次)。