1

我想在计算集群上使用 ipython 并行执行作业。设置都相对简单,但我将执行的一些工作包括对多线程应用程序(生物信息学)的子进程调用。有没有一种简单的方法可以告诉 ipython 单个 python 调用正在消耗多个内核或整个引擎?更一般地说,我想跟踪使用和可用的资源,以便我可以运行异构作业(内存需求、核心需求)。

4

1 回答 1

3

IPython 不对单个任务进行任何资源分配。所有资源分配都是在引擎创建时完成的。例如,如果您的作业已经完全支持多线程和多核,那么您可能不希望每台物理机器拥有多个 IPython 引擎。如果您的作业是单线程的,那么每个 CPU 内核一个引擎是合乎逻辑的。如果您的任务在多个非独占资源上受 IO 限制,那么您可能需要比内核更多的引擎。

如果你的工作是高度异构的(例如,一些任务被限制在一个线程中,而另一些则很乐意使用整台机器),那么你可能需要安排一些更复杂的调度。尝试此操作的两个有用信息是创建引擎子集的视图。例如,集群中每台机器只有一个引擎的负载平衡和直接视图:

import socket
host_map = client[:].apply_async(socket.gethostname).get_dict()
r = { v:k for k,v in host_map.items() }
one_id_per_machine = list(r.values())
one_per_machine = client[one_id_per_machine]
lb_per_machine = client.load_balanced_view(one_id_per_machine)

另一个是基于图的依赖关系,您可能会使用它来创建障碍,允许一个任务阻止其他任务被提交给其他引擎。

于 2013-11-08T04:48:52.420 回答