问题 IPython.parallel不使用多核?


我正在试验 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

它的作用是使用它 mincemeat MapReduce的实现。当我发布第一个 !python mincemeat.py 127.0.0.1 它使用大约100%的一个核心,然后当我启动第二个核心时,每个核心降低到50%。我在机器上有4个核心(+虚拟核心),可以直接从终端启动而不是在笔记本电脑中使用它们。

有什么我想念的吗?我想每个使用一个核心 !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%的核心。我做错了什么?


11588
2018-05-01 18:04


起源

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


答案:


聊天讨论摘要:

CPU亲和力 是一种将进程固定到特定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笔记本 探索这个问题


15
2018-05-02 04:09



另见此错误报告 github.com/ipython/ipython/issues/840 - Lyndon White