我正在尝试调整一些bash脚本,使它们在(pbs)群集上运行。
各个任务由几个由主脚本启动的脚本执行。
到目前为止,这些主要脚本在后台启动多个脚本(通过附加&
),使它们在一台多核机器上并行运行。
我想用qsub
替换这些调用来分配集群节点的负载。
但是,有些工作依赖于其他工作才能开始。
到目前为止,这是通过主脚本中的wait
语句实现的。
但是使用Grid Engine的最佳方法是什么?
我已在-W after:jobid[:jobid...]
手册页中找到了this question以及qsub
文档,但我希望有更好的方法。
我们正在谈论几个并行运行的thousend作业和另一个相同大小的一组,以便在最后一个完成之后同时运行。
这意味着我必须根据很多工作排队很多工作。
我可以通过在中间使用虚拟作业来减少这种情况,除了取决于第二组可能依赖的第一组作业之外什么都不做。 这样可以减少数百万到数千的依赖关系数量,但仍然存在问题:它是错误的,我甚至不确定shell是否会接受这么长的命令行。
qwait -u <user>
)?qwait [-p <PID>]
)?当然可以在qstat
循环中使用sleep
和while
编写类似的东西,但我想这个用例非常重要,可以有一个内置的解决方案我只是无法想出那个。
在这种情况下,您会推荐/使用什么?
附录I:
因为评论要求:
$ qsub --version
version: 2.4.8
也许有助于确定准确的pbs系统:
$ 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
[...]
附录II:
我已经尝试过Dmitri Chubarov给出的torque解决方案,但它没有按照描述的那样工作。
没有工作,它按预期工作:
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
我想这是因为第一个qsub
返回的作业ID中缺少数组指示:
testuser@headnode ~ $ qsub -t 1-2 ./test1.sh
2556.testserver.domain
正如您所看到的,没有...[]
表示这是一个作业数组。
另外,在qsub
输出中没有...[]
,但...-1
和...-2
表示数组。
所以剩下的问题是如何格式化-W depend=afterok:...
以使作业依赖于指定的作业数组。
答案 0 :(得分:6)
在评论中填写Jonathan建议的解决方案。
基于最初的Portable Batch System有几个资源管理器:OpenPBS,TORQUE和PBS Professional。这些系统显着不同,并且对诸如作业数组等新功能使用不同的命令语法。
作业数组是基于相同作业脚本提交多个类似作业的便捷方式。引自手册:
有时用户会希望提交大量的工作 相同的工作脚本。而不是使用脚本重复调用 qsub ,a 现在存在称为作业数组的功能,以允许创建 使用一个 qsub 命令的多个作业。
要提交作业数组,PBS提供以下语法:
qsub -t 0-10,13,15 script.sh
这提交的作业包含来自0,1,2,...,10,13,15的ID。
在脚本中,变量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 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之前的扭矩版本,可以使用不同的解决方案,该解决方案基于在要分离的批次作业之间提交虚拟分隔工作。
它使用三种依赖类型:on
,before
和after
。
考虑以下示例
$ 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及更高版本。