1

我正在尝试同时多次运行 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 函数但每次运行使用不同参数的最快计算方法是什么?提前感谢您的任何意见/建议。

4

1 回答 1

1

(我假设您的每个计算节点都是一台单独的机器,具有自己的一组核心。如果您的计算集群有某种操作系统可以虚拟化核心,因此它们看起来都是本地的,那么您可以忽略“多节点”位。)

在一个节点上

multiprocessing模块本机处理单个操作系统实例中的多个进程。如果您在一个节点上启动top或类似的进程列表并显示 N 个内核,那么这就是您的 Python 模拟可用的内核数。

但是,在该约束范围内,您可以根据需要生成和管理任意数量的进程,并且操作系统将使用其正常的进程调度程序将它们安排在可用的内核上。因此,在您的情况下,在我看来您应该能够在单个节点上并行运行 32 个单独的模拟。您需要做的就是设置循环以创建 32 个进程,为它们提供运行参数,然后等待它们全部完成。

如果您有超过 32 个模拟要运行,您可以设置一个multiprocessing.Pool包含 32 个工作器的模型,然后使用pool.map模拟参数列表将工作分配给您的每个内核。

多个节点

如果您确实有超过 32 个模拟,并且您想开始利用单独节点上的核心(您可能需要使用 ssh 等登录到单独的节点),那么理论上您可以使用“远程管理器” " 来自多处理模块来处理这个问题。

但是,我建议您看看它的强大功能IPython.parallel——它允许您在多个节点上启动“处理引擎”,然后您可以使用 IPython shell 将工作分配给节点。这最终会与上面描述的进程池非常相似,只是它会利用集群中所有计算节点上的所有核心。

或者,您可以设置或利用任何现有集群调度程序(Condor、Sun GridEngine 等)在每个处理节点上启动一次(甚至 32 次)模拟。

于 2013-08-29T15:16:51.997 回答