我正在试验 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%。我做错了什么?
最佳答案
聊天讨论摘要:
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 .
关于python - IPython.parallel 不使用多核?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16323743/