【发布时间】:2018-12-29 08:48:15
【问题描述】:
这个问题很容易用一个例子来解释。我正在运行一个myscript.py dummy Python-MPI 脚本,其内容就在两行之后。
from subprocess import call
call(['which', 'python'])
默认情况下,MPI 集群节点可见的 Python 可执行文件是 /usr/bin/python。我在主目录中安装了另一个 Python 版本,可以通过运行 source myhome/python35tf/bin/activate 来激活它。
现在我登录到集群中的主节点(N-0)并在 shell 中运行以下两个命令。
source myhome/python35tf/bin/activate
srun -N 4 python myscript.py
这会产生以下输出。
/path-to-users/myhome/python35tf/bin/python
/path-to-users/myhome/python35tf/bin/python
/path-to-users/myhome/python35tf/bin/python
/path-to-users/myhome/python35tf/bin/python
至少有一个输出指向python35tf Python 可执行文件是有意义的,因为我在 N-0 节点中激活了它。但是为什么所有其他节点也在他们的环境中看到相同的 Python 可执行文件?他们不应该打印/usr/bin/python吗? srun如何保证所有节点的执行环境与N-0的执行环境同步?
[更新] 这里有一个相关的问题:How does OpenMPI Secure SHell into all the compute nodes from the master node?
【问题讨论】:
-
试试
srun env | grep ^PATH。PATH导出了吗?如果是,这就解释了为什么不使用usr/bin/python -
@GillesGouaillardet 那么您是否建议
srun命令在内部对每个工作节点进行 ssh 并在执行工作负载之前将 PATH 设置为与主节点匹配?为了证实这个理论,我尝试运行srun -N 2 printenv并观察到一些环境变量是同步的,但不是全部。是否有任何 OpenMPI 参考页面描述了它是如何工作的? (查看复制的内容和遗漏的内容) -
首先,
srun是SLURM命令,不是Open MPI命令。在内部,srun不是基于SSH,但它会在fork&exec'ing 二进制文件之前传播一些环境变量。 FWIW,在我的环境中,PATH由srun传播。