11

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

它所做的是使用mincemeatMapReduce 的实现。当我启动第!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%。我做错什么了?

4

1 回答 1

15

聊天讨论总结:

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 笔记本。

于 2013-05-02T04:09:53.000 回答