【问题标题】:IPython.parallel not using multicore?IPython.parallel 不使用多核?
【发布时间】:2013-05-01 18:04:54
【问题描述】:

我正在试验IPython.parallel,只是想在不同的引擎上启动几个 shell 命令。

我有以下笔记本:

单元格 0:

from IPython.parallel import Client
client = Client()
print len(client)
5

并启动命令:

单元格 1:

%%px --targets 0 --noblock
!python server.py

单元 2:

%%px --targets 1 --noblock
!python mincemeat.py 127.0.0.1

细胞 3:

%%px --targets 2 --noblock
!python mincemeat.py 127.0.0.1

它的作用是使用 MapReduce 的 mincemeat 实现。当我启动第一个 !python mincemeat.py 127.0.0.1 时,它使用了大约 100% 的一个内核,然后当我启动第二个时,每个内核都下降到 50%。我的机器上有 4 个内核(+虚拟内核),可以在直接从终端启动时使用它们,但不能在 Notebook 中使用。

我有什么遗漏吗?我想每个!python mincemeat.py 127.0.0.1 命令使用一个核心。

编辑:
为清楚起见,这里还有另一件事不使用多核:

单元格 1:

%%px --targets 0 --noblock

a = 0
for i in xrange(100000):
    for j in xrange(10000):
        a += 1

单元 2:

%%px --targets 0 --noblock

a = 0
for i in xrange(100000):
    for j in xrange(10000):
        a += 1

我想我错过了什么。我相信如果可用的话,这两个单元应该运行一个不同的内核。然而,情况似乎并非如此。 CPU 使用率再次表明它们共享相同的内核并使用 50%。我做错了什么?

【问题讨论】:

  • 我不确定在这里使用 IPython.parallel 有什么意义,当您一次只在一台机器上运行单行 shell 命令时,IPython.parallel 不太可能有任何干扰您的子进程正在使用多少内核的能力。如果您在没有 IPython.parallel 的情况下执行相同的示例(因为它只是三个单行 shell 调用),它会是什么样子?
  • 嗨@mnirk。如果没有 Ipython.parallel 单元格被阻塞,它就没有那么有趣了。为了澄清事情,我不想在不同的核心上运行一个进程,我宁愿每个进程都有一个核心。这就是为什么我将每个命令分配给不同的目标。但是,似乎所有引擎(目标 0 到 4)都在同一个内核上运行。
  • 我的意思是在三个普通的终端会话中执行它 - 这就是您现在所做的一切,在三个单独的会话中运行单个 shell 命令。 IPython 根本没有真正参与。
  • 我想隔离的主要事情是我怀疑 IPython 实际上与这种行为有什么关系。我希望你证明你的脚本在完全在 IPython 之外运行时会表现不同,我不希望它会这样。您实际上并没有在 IPython 进程中运行任何重要的代码 - ! 启动了一个新的 shell 子进程。
  • @minrk,正如我在帖子中所说,当使用不同的 shell 时,它可以正常工作。我实际上是从在不同的终端会话中启动命令开始的,我达到了 6x100% 的 CPU 使用率(我实际上启动了 6 个映射器)。我想在笔记本中重现它。

标签: python mapreduce ipython ipython-notebook ipython-parallel


【解决方案1】:

聊天讨论总结:

CPU affinity 是一种将进程固定到特定 CPU 内核的机制, 这里的问题是,有时导入 numpy 最终会将 Python 进程固定到 CPU 0, 由于链接到特定的 BLAS 库。您可以通过运行此单元来取消固定所有引擎:

%%px
import os
import psutil
from multiprocessing import cpu_count

p = psutil.Process(os.getpid())
p.set_cpu_affinity(range(cpu_count()))
print p.get_cpu_affinity()

其中使用multiprocessing.cpu_count获取CPU数量,然后将每个引擎与所有CPU关联起来。

一个 IPython 笔记本exploring the issue

【讨论】:

    猜你喜欢
    • 2014-10-21
    • 1970-01-01
    • 2016-08-22
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    相关资源
    最近更新 更多