【问题标题】:How to utilize parallel nodes through Shell Script?如何通过 Shell Script 使用并行节点?
【发布时间】:2012-12-19 04:12:24
【问题描述】:

我正在尝试利用并行节点来运行数值模拟。我有节点 #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 脚本似乎继续一路走来……我想有更好的方法可以做到这一点,但我对此比较陌生,有人可以帮忙吗?

【问题讨论】:

    标签: linux shell parallel-processing nodes


    【解决方案1】:

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

    你需要做三件事:

    1. 在 ssh 行之后从循环中取出所有代码,然后放入 将其放入自己的脚本中(称为 docompute.sh)。
    2. 把那个脚本放在 每个计算节点,在 $PATH 变量的目录中 执行用户,以及
    3. 在父脚本中,替换 循环使用ssh compute-0-$n docompute.sh && 会得到你 通过在 背景。

    请参阅running same script over many machines 以讨论非常相似的内容。使用 & 在后台运行命令是关键。

    【讨论】:

    • & 如何与 ssh 行结合使用?当我在我的 ssh 行前面包含 & 命令时,我收到错误消息:'“不会分配伪终端,因为标准输入不是终端。不会分配伪终端,因为标准输入不是终端。” '
    • @Niteo,我认为 & 应该这样使用:ssh compute-0-$n &
    • 是的,这就是我实现它的方式,但我不相信我的机器/集群非常喜欢:/。
    • 抱歉,我并没有真正注意你的脚本第一次在做什么。我已将回复编辑为更有可能对您有用的内容。
    • 非常感谢 Bob,我相信我几乎可以让它工作了,还有一个问题,如果我想从执行 ssh 命令的父脚本传递一个变量(例如循环计数器)到docomp.sh,最好的方法是什么?
    【解决方案2】:

    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 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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 不幸的是,我没有运行脚本的集群的管理权限:/ 我无法将程序添加到集群中:(
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-09
      • 2015-03-01
      • 2020-09-24
      • 2017-07-21
      • 2019-09-10
      • 2019-10-20
      • 1970-01-01
      相关资源
      最近更新 更多