2016-05-14 25 views
2

我正在Windows HPC群集上运行Python脚本。脚本中的函数使用multiprocessing包中的starmap来并行化某个计算密集型进程。在HPC群集上使用Python多处理

当我在单个非群集机器上运行脚本时,我获得了预期的速度提升。当我登录到节点并在本地运行脚本时,我获得了预期的速度提升。但是,当作业管理器运行脚本时,从multiprocessing的速度提升要么完全缓解,要么有时甚至慢两倍。我们已经注意到当调用starmap函数时会发生内存分页。我们认为这与Python的multiprocessing的本质有关,即每个核心都会启动一个单独的Python解释器。

由于我们从单一节点的控制台运行成功,我们试图运行HPC_CREATECONSOLE=True的脚本,但无济于事。

在运行使用multiprocessing的Python脚本时,我们应该使用作业管理器中的某种设置吗? multiprocessing仅适用于HPC群集吗?

回答

0

不幸的是,我无法在社区中找到答案。但是,通过实验,我能够更好地隔离问题并找到可行的解决方案。

问题出在Python的multiprocessing实现的本质。当创建一个Pool对象(即控制并行工作的处理内核的管理器类)时,将为每个内核启动一个新的Python运行时。在我的代码中有多个地方使用了multiprocessing程序包和一个Pool对象实例化...每个需要它的函数根据需要创建一个对象Pool,然后在退出之前连接并终止。因此,如果我在代码中调用该函数3次,那么会有8个Python实例被旋转,然后关闭3次。在一台机器上,与功能的计算负载相比,这个开销并不重要,但是在HPC上它是非常高的。

我重新设计了代码,以便在调用进程的一开始就创建了一个对象,然后根据需要传递给每个函数。它在整个过程结束时关闭,加入并终止。

我们发现大部分时间都花在创建每个节点上的Pool对象上。这是一个改进,但因为它只被创建一次!然后我们意识到底层问题是多个节点试图在同一个地方同时从网络访问Python(它只安装在头节点上)。我们在所有节点上安装了Python和应用程序,问题完全解决。

该解决方案是试验和错误的结果...不幸的是,在这一点上,我们对集群计算的知识相当低。我分享这个答案的希望是它会受到批评,以便我们能够获得更多的见解。感谢您的时间。