python - 为什么矢量化的 numpy 方法在 python ssh 子进程中只使用一个核心

标签 python numpy ssh subprocess popen

我需要一种算法,可以同时在不同的计算机上(使用不同的参数)执行文件“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/

相关文章:

python - 矢量化 np 逻辑 : zeroing out in z axis above point

python - 如何使用 Python 生成 SSH key 对

java - Java 中的 SSH 与命令和文件

python - 将一串数学函数转换为函数

Python。一次输入后套接字关闭

python - 集群作业调度程序 : tools

python - 从 DataFrame 中减去一个 Series,同时保持 DataFrame 结构不变

用于 GPIO Led blink 的 Python 线程类

python - 使用 zip 和 np.insert 将零部分插入 numpy 数组

python - 使用 Python 脚本进行 SSH 和 Screen