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

Best allocation of resources for multiprocessed command running within python

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

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

考虑到用户指定了多少 CPU,我对传播 CPU 的最有效方式感到困惑。

例如,假设用户给了N cpu,我可以运行

等等

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

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

pool.map_async(run_scan,tuple(jobs))

pool.close()

pool.join()

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

这个程序很慢,我想知道是否有更好的方法来做到这一点。

谢谢

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

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

  • 运行 在一个核心 (--cpu 1) 上完成相同的工作,然后是两个核心,四个,六个,...,看看需要多长时间。这将使您了解作业并行化的程度。使用CPU时间=运行时间*核心数应保持不变。
  • 一旦您注意到 运行 时间与专用于该作业的核心数量之间存在低于线性的相关性,那就是您开始并行 运行 多个作业的时候。假设你有 24 个内核,一个作业在一个内核上需要 240 秒,在两个内核上需要 118 秒,在三个内核上需要 81 秒,在四个内核上需要 62 秒,但是在五个内核上只需要 59 秒(而不是预期的 48 秒) ),你应该 运行 6 个并行作业,每个作业有 4 个内核。
  • 您可能会在 n_cores/2 左右看到急剧下降:某些计算在 Hyperthreading 上运行不佳,并且内核数量实际上是 CPU 制造商的一半索赔。