1

我正在计算集群上做一些实验。我的算法有两个步骤。第一个将其输出写入第二步将使用的一些文件。依赖关系是 1 到 n,这意味着一个 step2 程序需要 n step1 程序的输出。我不知道做什么既不腰集群资源也不让头节点忙。我目前的解决方案是:

提交脚本(这在头节点上运行)

for different params, p:
    run step 1 with p

sleep some time based on the an estimate of how much step 1 takes

for different params, q:
    run step 2 with q

第 2 步算法(在计算节点上运行)

while files are not ready:
    sleep a few minutes
do the step 2

有没有更好的方法来做到这一点?

4

1 回答 1

4

SGE 为此提供了作业依赖项和数组作业。您可以将阶段 1 计算提交为数组作业,然后使用qsub -hold_jid <phase 1 job ID|name> .... 这将使第 2 阶段的作业等到所有第 1 阶段的计算完成,然后才会被释放和分派。只要集群中有足够的插槽,阶段 1 的计算就会并行运行。

在提交脚本中,通过作业名称指定保留并以独特的方式命名每个数组作业可能很有用。例如

mkdir experiment_1; cd experiment_1
qsub -N phase1_001 -t 1-100 ./phase1
qsub -hold_jid phase1_001 -N phase2_001 ./phase2 q1
cd ..
mkdir experiment_2; cd experiment_2
qsub -N phase1_002 -t 1-42 ./phase1 parameter_file
qsub -hold_jid phase1_002 -N phase2_002 ./phase2 q2
cd ..

phase1这会将脚本的100 次执行安排为数组作业phase1_001,并将另外 42 次执行安排为数组作业phase1_002。如果集群上有 142 个 slot,则所有 142 个执行都将并行运行。然后phase2将在作业中的所有任务完成后分派脚本的一次执行,并在phase1_001作业中的所有任务完成后分派一次执行phase1_002。同样,它们可以并行运行。

数组 job 中的每个任务都将收到一个唯一$SGE_TASK_ID值,范围为 1 到 100 对于 job 中的任务phase1_001和从 1 到 42 对于 job 中的任务phase1_002。从中您可以计算p参数。

于 2012-05-12T14:00:36.387 回答