2

我正在尝试利用并行节点来运行数值模拟。我有节点 #0 到 12,我希望单独使用它们来运行模拟的单独部分。本质上,我需要在一个节点上评估 x=1 到 4 的 f(x),然后在下一个节点上评估 x=5 到 9 的 f(x),然后是 x = 10 到 14 的 f(x)下一个,然后从那里开始。最初,我尝试使用如下循环:

n=0
while [ $n -le 12 ]
do
   ssh compute-0-$n
   #evaluate the f(x) for the x values that I want
   exit
   n=$(($n+1))
done

但这不起作用,因为每当我使用 ssh compute-0-$n 命令跳转到节点时,与原始 shell 脚本的连接似乎停止了,当我退出节点时,shell 脚本似乎继续快乐方式...我想有更好的方法来实现这一点,但我对此比较陌生,有人可以帮忙吗?

4

3 回答 3

1

首先要了解的是,当您运行 ssh(不带 &)时,ssh 本身会一直运行直到完成。它在远程主机上打开一个新的 shell,并读取命令——但不是来自启动它的脚本的命令。ssh 会话不知道启动它的脚本;它正在等待来自标准输入的命令。

你需要做三件事:

  1. 从 ssh 行之后的循环中取出所有代码,并将其放入自己的脚本中(称为 docompute.sh)。
  2. 将该脚本放在每个计算节点上,在执行用户的 $PATH 变量中的目录中,然后
  3. 在父脚本中,将循环中的所有内容替换为ssh compute-0-$n docompute.sh &. 通过&在后台运行 ssh 进程,您可以获得所需的并行度。

请参阅在许多机器上运行相同的脚本以讨论非常相似的内容。使用 & 在后台运行命令是关键。

于 2012-12-19T04:17:43.797 回答
1

GNU Parallel 正是为此类任务而设计的。

evaluate_f() {
  x="$1"
  # do some crazy computation
}
seq 48 | env_parallel --env evaluate_f -Snode{1..12} evaluate_f {}

如果机器没有真正被称为 node1 .. node12,那么它会变得更长一点:

seq 48 | env_parallel --env evaluate_f -Snode1,nodeb,nodeIII,node0100,node0x5,node6,nodeg,nodeVIII,node01001,node0xa,node11,nodel evaluate_f {}

如果文件中有节点:

seq 48 | env_parallel --env evaluate_f --slf my_nodefile evaluate_f {}

这样做的目的是将函数复制evaluate_f到远程服务器并在其中使用一个参数从seq 48. 默认情况下,它将在服务器中的每个 cpu-core 运行一个作业。如果您的计算不是多线程的并且没有大量的磁盘 I/O,那么这是有道理的。这可以通过 --jobs 进行更改。

env_parallel在版本 20160322 中引入,因此请确保您的版本比该版本更新。

GNU Parallel 是一个通用的并行器,可以轻松地在同一台机器上或在您可以通过 ssh 访问的多台机器上并行运行作业。

如果您想在 4 个 CPU 上运行 32 个不同的作业,那么并行化的直接方法是在每个 CPU 上运行 8 个作业:

简单的调度

GNU Parallel 会在完成后生成一个新进程 - 保持 CPU 处于活动状态,从而节省时间:

GNU 并行调度

安装

您应该使用您的包管理器安装 GNU Parallel,但如果 GNU Parallel 没有为您的发行版打包,您可以进行个人安装,这不需要 root 访问权限。这样做可以在 10 秒内完成:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

有关其他安装选项,请参阅http://git.savannah.gnu.org/cgit/parallel.git/tree/README

学到更多

查看更多示例:http ://www.gnu.org/software/parallel/man.html

观看介绍视频:https ://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

浏览教程:http ://www.gnu.org/software/parallel/parallel_tutorial.html

注册电子邮件列表以获得支持:https ://lists.gnu.org/mailman/listinfo/parallel

于 2017-07-04T12:56:35.043 回答
0

如果在 ubuntu 中,你可以使用 odp 程序。

该程序利用并行 ssh 同时运行命令。用户只需将自己的数据中心配置和脚本写入配置文件,然后使用该程序并行执行即可。

这是网址:http: //sourceforge.net/projects/odp/

于 2012-12-19T04:23:32.707 回答