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
HMMER 职位,每个职位有 1 CPU
N/2
个作业,每个作业 2 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 制造商的一半索赔。
我开发了一个工具,要求用户提供 CPU 可用的数量 运行 它。
作为程序的一部分,该工具调用 HMMER (hmmer - http://eddylab.org/software/hmmer3/3.1b2/Userguide.pdf),它本身很慢并且需要多个 CPUs 到 运行。
考虑到用户指定了多少 CPU,我对传播 CPU 的最有效方式感到困惑。
例如,假设用户给了N
cpu,我可以运行
N
HMMER 职位,每个职位有 1 CPUN/2
个作业,每个作业 2 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 制造商的一半索赔。