5

我正在尝试调整一些 bash 脚本以使它们在 ( ) 集群上运行。

各个任务由几个脚本执行,这些脚本由一个主脚本启动。到目前为止,这个主脚本在后台启动了多个脚本(通过附加&),使它们在一台多核机器上并行运行。我想用qsubs 替换这些调用以在集群节点之间分配负载。

但是,有些工作需要其他工作完成才能开始。到目前为止,这是通过wait主脚本中的语句实现的。但是,使用 Grid Engine 执行此操作的最佳方法是什么?

我已经在手册页中找到了这个问题以及-W after:jobid[:jobid...]文档,qsub但我希望有更好的方法。我们正在谈论首先并行运行的几个 thound 作业,然后在最后一个完成后同时运行另一组相同大小的作业。这意味着我必须根据很多工作排队很多工作。

我可以通过在两者之间使用一个虚拟工作来解决这个问题,除了依赖第一组工作之外什么都不做,第二组可以依赖这些工作。这会将依赖项的数量从数百万减少到数千,但仍然:感觉不对,我什至不确定 shell 是否会接受这么长的命令行。

  • 有没有办法等待所有的工作完成(比如qwait -u <user>)?
  • 或者从这个脚本提交的所有作业(类似qwait [-p <PID>])?

当然,使用qstatandsleepwhile循环中编写这样的东西是可能的,但我想这个用例很重要,足以拥有一个内置的解决方案,而我只是无法弄清楚这一点。

在这种情况下,您会推荐/使用什么?

附录一:

由于它是在评论中要求的:

$ qsub --version
version: 2.4.8

也许也有助于确定确切的系统:

$ qsub --help
usage: qsub [-a date_time] [-A account_string] [-b secs]
      [-c [ none | { enabled | periodic | shutdown |
      depth=<int> | dir=<path> | interval=<minutes>}... ]
      [-C directive_prefix] [-d path] [-D path]
      [-e path] [-h] [-I] [-j oe] [-k {oe}] [-l resource_list] [-m n|{abe}]
      [-M user_list] [-N jobname] [-o path] [-p priority] [-P proxy_user] [-q queue]
      [-r y|n] [-S path] [-t number_to_submit] [-T type] [-u user_list] [-w] path
      [-W otherattributes=value...] [-v variable_list] [-V] [-x] [-X] [-z] [script]

由于到目前为止的注释指向作业数组,因此我在qsub手册页中搜索了以下结果:

[...]
DESCRIPTION
[...]
       In addition to the above, the following environment variables will be available to the batch job.
[...]
       PBS_ARRAYID
              each member of a job array is assigned a unique identifier (see -t)
[...]
OPTIONS
[...]
       -t array_request
               Specifies the task ids of a job array. Single task arrays are allowed.
               The array_request argument is an integer id or a range of integers. Multiple ids or id ranges can be combined in a comman delimeted list. Examples : -t 1-100 or -t 1,10,50-100
[...]

附录二:

我已经尝试过 Dmitri Chubarov 给出的解决方案,但它不像描述的那样工作。

如果没有作业阵列,它会按预期工作:

testuser@headnode ~ $ qsub -W depend=afterok:`qsub ./test1.sh` ./test2 && qstat
2553.testserver.domain
Job id                  Name             User            Time Use S Queue
----------------------- ---------------- --------------- -------- - -----
2552.testserver         Test1            testuser               0 Q testqueue
2553.testserver         Test2            testuser               0 H testqueue
testuser@headnode ~ $ qstat
Job id                  Name             User            Time Use S Queue
----------------------- ---------------- --------------- -------- - -----
2552.testserver         Test1            testuser               0 R testqueue
2553.testserver         Test2            testuser               0 H testqueue
testuser@headnode ~ $ qstat
Job id                  Name             User            Time Use S Queue
----------------------- ---------------- --------------- -------- - -----
2553.testserver         Test2            testuser               0 R testqueue

但是,使用作业数组第二个作业不会开始:

testuser@headnode ~ $ qsub -W depend=afterok:`qsub -t 1-2 ./test1.sh` ./test2 && qstat
2555.testserver.domain
Job id                  Name             User            Time Use S Queue
----------------------- ---------------- --------------- -------- - -----
2554-1.testserver       Test1-1          testuser               0 Q testqueue
2554-2.testserver       Test1-1          testuser               0 Q testqueue
2555.testserver         Test2            testuser               0 H testqueue
testuser@headnode ~ $ qstat
Job id                  Name             User            Time Use S Queue
----------------------- ---------------- --------------- -------- - -----
2554-1.testserver       Test1-1          testuser               0 R testqueue
2554-2.testserver       Test1-2          testuser               0 R testqueue
2555.testserver         Test2            testuser               0 H testqueue
testuser@headnode ~ $ qstat
Job id                  Name             User            Time Use S Queue
----------------------- ---------------- --------------- -------- - -----
2555.testserver         Test2            testuser               0 H testqueue

我猜这是由于第一个返回的作业 id 中缺少数组指示qsub

testuser@headnode ~ $ qsub -t 1-2 ./test1.sh
2556.testserver.domain

如您所见,没有...[]表明这是一个作业数组。此外,在qsub输出中没有...[]s 但...-1表示...-2数组。

所以剩下的问题是如何格式化-W depend=afterok:...以使作业依赖于指定的作业数组。

4

1 回答 1

6

按照 Jonathan 在评论中建议的解决方案填写。

有几个基于原始便携式批处理系统的资源管理器:OpenPBS、TORQUE 和 PBS Professional。系统出现了显着差异,并为作业数组等新功能使用不同的命令语法。

作业数组是基于同一个作业脚本提交多个相似作业的便捷方式。引用手册:

有时用户会希望基于相同的作业脚本提交大量作业。与使用脚本重复调用qsub不同,现在存在一种称为作业数组的功能,允许使用一个qsub命令创建多个作业。

要提交作业数组,PBS 提供以下语法:

 qsub -t 0-10,13,15 script.sh

这会提交 ID 为 0、1、2、...、10、13、15 的作业。

在脚本中,变量PBS_ARRAYID携带数组中作业的 id,可用于选择必要的配置。

作业数组有其特定的依赖选项。

扭矩

可能在 OP 中使用的 TORQUE 资源管理器。提供了其他依赖项选项,可以在以下示例中看到:

$ qsub -t 1-1000 script.sh
1234[].pbsserver.domainname
$ qsub -t 1001-2000 -W depend=afterokarray:1234[] script.sh
1235[].pbsserver.domainname

这将导致以下qstat输出

1234[]         script.sh    user          0 R queue
1235[]         script.sh    user          0 H queue   

在扭矩版本 3.0.4 上测试

完整的 afterokarray 语法在qsub(1)手册中。

PBS专业

在 PBS Professional 中,依赖项可以统一处理普通作业和数组作业。这是一个例子:

$ qsub -J 1-1000 -ry script.sh
1234[].pbsserver.domainname
$ qsub -J 1001-2000 -ry -W depend=afterok:1234[] script.sh
1235[].pbsserver.domainname

这将导致以下qstat输出

1234[]         script.sh    user          0 B queue
1235[]         script.sh    user          0 H queue   

扭矩版本更新

自 2.5.3 版以来,数组依赖项在 Torque 中可用。2.5 版的作业数组与 2.3 或 2.4 版的作业数组不兼容。特别[]是从版本 2.5 开始在 Torque 中引入了语法。

使用分隔符作业的更新

对于 2.5 之前的扭矩版本,可能会使用不同的解决方案,该解决方案基于在要分离的作业批次之间提交虚拟定界作业。它使用三种依赖类型:onbeforeafter

考虑以下示例

 $ DELIM=`qsub -Wdepend=on:1000 dummy.sh `
 $ qsub -Wdepend=beforeany:$DELIM script.sh
 1001.pbsserver.domainname
 ... another 998 jobs ...
 $ qsub -Wdepend=beforeany:$DELIM script.sh
 2000.pbsserver.domainname
 $ qsub -Wdepend=after:$DELIM script.sh
 2001.pbsserver.domainname
 ...

这将导致这样的队列状态

1000         dummy.sh    user          0 H queue
1001         script.sh   user          0 R queue   
...
2000         script.sh   user          0 R queue   
2001         script.sh   user          0 H queue
...   

也就是说,作业#2001 将仅在前 1000 个作业终止后运行。可能 TORQUE 2.4 中可用的基本作业数组工具也可用于提交脚本作业。

该解决方案也适用于 TORQUE 2.5 及更高版本。

于 2013-08-27T10:49:05.850 回答