在 ipyparallel 引擎之间拆分作业以进行外部 n 线程调用

Split jobs among ipyparallel engines to make external n-threaded calls

问题

假设我有 20 个处理器可用。我想将参数传递给外部
来自 IPython 的程序一次在 4 个线程下运行最佳,并使用 map_async 继续添加作业,直到所有作业完成。下面是示例代码,我相信一次只会为每个作业分配一个进程。这是您将使用 'chunksize' 标志的示例吗?似乎会做相反的事情,即将多个作业发送到一个处理器。

在 IPython

之外启动引擎
ipcluster start -n 20 --daemon

IPython代码

import ipyparallel as ipp
import subprocess


def func(args): 
    """ function that calls external prog w/ 4 threads """
    subprocess.call([some_external_program, args, nthreads=4])


args = [...]
ipyclient = ipp.Client().load_balanced_view()  
results = ipyclient.map_async(func, args)  
results.get()

如果任务是多线程的,您不希望 运行 它在太多引擎上运行。如果这是你的大部分工作,最好启动 n_cpus/n_threads 引擎而不是 n_cpus(5 个引擎在你的 20 CPUs,4 个线程的情况下)。如果它是您工作的一个子集,就像这样是多线程的,那么您可能只想将 他们的 分配限制为 n_cpus/n_threads。您可以在创建视图时使用 targets 参数来执行此操作,这会将任务分配限制为引擎的子集:

n_threads = 4
client = ipp.Client()
all_view = client.load_balanced_view() # uses all engines
threaded_view = client.load_balanced_view(targets=client.ids[::n_threads])

这假设您在一台机器上每个 CPU 有一个引擎。如果您使用多台机器或引擎数量与 CPU 的数量有不同的关系,您将必须计算出要使用的正确引擎子集。目标可以是任何手动指定的引擎 ID 列表。