在python中运行的多进程命令的最佳资源分配

时间:2018-11-09 16:29:11

标签: python python-multiprocessing

我开发了一种工具,要求用户提供可运行它的CPU数量。

作为程序的一部分,该工具调用HMMER(hmmer-http://eddylab.org/software/hmmer3/3.1b2/Userguide.pdf),它本身非常慢,并且需要多个CPU才能运行。

考虑到用户指定了多少个CPU,我对最有效的CPU分配方法感到困惑。

例如,假设用户提供了N cpus,我可以运行

  • N HMMER作业,每个作业有1个CPU

  • N/2个作业,每个作业有2个CPU

等等。

我当前的解决方案是任意打开N / 5的池大小并打开一个池,然后在池中的每个进程中调用具有5个CPU的HMMER。

pool = multiprocessing.Pool(processes = N/5)

pool.map_async(run_scan,tuple(jobs))

pool.close()

pool.join()

其中run_scan调用HMMER,而jobs将每个HMMER作业的所有命令行参数都保存为字典。

该程序非常慢,我想知道是否有更好的方法可以做到这一点。

谢谢

1 个答案:

答案 0 :(得分:1)

几乎总是并行化在效率上付出一些代价,但是代价很大程度上取决于计算的细节,因此我认为回答这个问题的唯一方法是一系列实验。

(我假设这里的内存或磁盘I / O并不是问题;对HMMER不太了解,但用户指南在“需求”部分根本没有提及内存。)

  • 在一个核心(--cpu 1)上运行相同的工作,然后在四个,四个,...,两个核心上运行,并查看需要花费多长时间。这将使您了解作业的并行程度。已用CPU时间=运行时间*内核数应保持不变。
  • 一旦您发现运行时与专门用于该作业的内核数量之间存在线性关系,那就是您开始并行运行多个作业。假设您有24个核心,而一个核心的工作需要240秒,两个核心需要118秒,三个核心需要81秒,四个核心需要62秒,但五个核心几乎要快59秒(而不是预期的48秒) ),您应该并行运行6个作业,每个作业包含4个核心。
  • 您可能会看到大约n_cores / 2的急剧下降:Hyperthreading上的某些计算不能很好地工作,并且内核数实际上是CPU制造商声称的一半。