我需要一种算法,可以同时在不同的计算机上(使用不同的参数)执行文件“test.py”,并在每台计算机上执行矢量化方法,例如来自 numpy 包,应该能够使用多个内核。
一个最小的(不工作)示例,由以下两个文件组成。
文件A:test.py
import numpy
import os #to verify whether process is allowed to use all cores
os.system("taskset -p 0xff %d" % os.getpid())
a = numpy.random.random((10000,10000)) #some random matrix
b = numpy.dot(a,a) #some parallelized calculation
和文件B:control.py
import subprocess
import os
callstring = "python " + str(os.getcwd()) + "/test.py" # console command to start test.py
sshProcess = subprocess.Popen(str("ssh <pc-name>"),
stdin=subprocess.PIPE,
shell=True)
sshProcess.stdin.write(str(callstring)) # start file.py
sshProcess.stdin.close()
现在,当我运行 control.py 时,正在执行文件 test.py,但是,只有一个内核。
如果我直接从控制台 python test.py
运行 test.py(我不想要),则会使用多个内核。
不幸的是,我是子进程扩展的新手,而且我也不是 Linux 系统方面的专家。但是,到目前为止,我能够获得以下知识:
- 使用
subprocess.call("python test.py", shell=True)
会起作用,即然后使用多个内核。但是,我需要 ssh 来寻址其他计算机。 - 手动使用控制台,即通过 ssh 连接到另一台计算机并运行
python test.py
也可以得到预期的结果:使用多个内核。但是,我需要自动执行此步骤,因此,我想使用 python 代码创建多个这样的“ssh-consoles”。 - Core affinity 似乎不是问题(这是一个典型的 numpy 问题),因为
os.system("taskset -p 0xff %d"% os.getpid())
产生输出 '当前亲和性 ff,新亲和性 ff' = 8 个可能的核心
所以看来是Popen结合ssh的问题!?
您有什么想法或建议吗?感谢您的帮助!
编辑/附录:我发现“multiprocessing”包的并行化方法确实在多个内核上运行。所以这似乎又是一个 NumPy 的问题。很抱歉之前没有对此进行测试!
我正在使用 Python 2.7.12 和 Numpy 1.11.1
最佳答案
我可以解决我的问题:
出于某种原因,我仍然不明白 - 正如我所说,我的 Linux 知识是一场灾难 - 在上述 Popen 环境中调用了一个不同的 python。
在控制台中,which python
给出'../anaconda2/bin/python',但是ssh <the very same computer> which python
给出“/usr/bin/python”。
Anaconda 似乎使用 MKL 库进行并行计算,这对于/usr/bin 中的 python 是未知的。
所以问题的根源是在不知道它的作用的情况下使用 ssh。同样的问题已经出现: Why does an SSH remote command get fewer environment variables then when run manually?
再次感谢您的关注。
关于python - 为什么矢量化的 numpy 方法在 python ssh 子进程中只使用一个核心,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43327119/