在多台机器上使用python的多处理模块

时间:2019-07-08 11:01:34

标签: python parallel-processing multiprocessing slurm parallelism-amdahl

我正在集群上运行并行化的python代码。 (我正在使用的特定库是emcee python软件包,它基于multiprocessing。)

集群使用slurm进行作业管理。我可以指定任务数和每个任务的CPU数。

我正在执行一项工作,希望该工作使用40个线程。 (MCMC具有40个助行器,每个助行器一个线程。)

我分配了40个任务,每个任务分配一个CPU。但是我发现只有一个CPU被使用,所有40个线程都在一个CPU上运行。

是否可以解决此问题?我希望所有40个人互相交流。我想将所有CPU视为一台计算机。如何做到这一点?

总结:是否可以将所有内核都视为属于一个CPU?

1 个答案:

答案 0 :(得分:0)

问题有两个部分:

  • slurm管理的计算机集群的slurm管理策略(您的slurm调度的工作实际上可以获得多少资源,以及将在远程群集节点计算机上可用。管理设置控制您计划的群集任务的这些外部限制,以在multiprocessing-coordinator提供的计算机上执行)。这可能会回答您的任何惊喜,表示为“ 仅使用一个CPU,并且所有40个线程都在一个CPU上运行。”(为清楚起见:在这里,我假设您没有明确要求您自己在代码中使用threading池来使用slurm后端,而不是子流程)

  • “跨” slurm控制的一组集群计算机之间的过程间通信,将需要一些附加费用,就像任何分布式计算生态系统。可行,但是您的设计将决定这部分的所有细节。在您的代码中没有信令/消息传递,slurm调度的任务将在任何群集节点计算机上运行,​​而与其他任何计算机无关(盲目,聋哑和静默-以Nox et Solitudo模式)。

    < / li>

解决方案:如果slurm策略和代码重构不是一种方法:

使用另一种满足上述要求的技术:

  

“我想将所有CPU都视为一台计算机。如何实现?”

为此,将不得不使用另一种技术,而不是经典的lscpu管辖的集群(这是一组具有通用任务队列协调器的简单机器)。

如有任何疑问,请在计算机上运行 hwloc 实用程序(来自lscpu工具),以便直观地看到CPU / NUMA-的实际抽象处理资源生态系统(当代的集群化和/或虚拟化抽象可能会产生误导,因此实际情况将变得清晰,合理,因为localhost将提供关于任何emcee本地和本地资源的权威视图不是-它将在操作系统,python解释器和实际代码中向您展示现实。


解决方案:出现了第三个选项:

最近看到至少有一个指向预期的emcee模块的链接,该链接用于MCMC计算(到目前为止尚未提供MCVE),并添加了"The only difference is that I want it to run using more than one machine."的解释性注释,还有一个选择。

重构代码,以便开始使用slurm提出的基于MPI的工作模式来重新分配工作负载。有关特定于站点的MPI限制的详细信息,请咨询站点管理员的slurm集群策略,如果这两个emcee集群管理策略集都符合您的期望,则可以向前发展。


Nota bene:
经过35年以上的HPC和高性能/低延迟分布式系统设计方面的专业经验,我确实知道我想与此处的社区成员分享什么。 顺便说一句。 {{1}} -文档中的相同警告中明确提到了上面已经警告过的间接费用:

  

“还需要注意的是,多处理模块的工作方式是产生大量新的python进程,并独立运行代码。在这些过程中。这意味着并行化过程的每个步骤都涉及大量开销。因此,并行运行快速入门示例之类的简单问题也就不足为奇了它将比等效的串行代码运行慢得多。如果您的对数概率函数需要大量时间(> 1秒左右)来进行计算,那么使用并行采样器实际上可以显着提高速度。”

从这个意义上讲,请您友好地审阅并避免使用诸如"Do you HAPPEN to have a concrete SUGGESTION for how to make" (my problem) work...之类的短语