PBS批处理系统是否跨节点移动多个串行作业?

时间:2011-03-28 00:10:35

标签: pbs torque

如果我需要“并行”运行许多串行程序(因为问题很简单但很耗时 - 我需要为同一个程序读取许多不同的数据集),解决方案很简单如果我只是使用一个节点。我所做的就是在每个命令之后继续使用&符号提交串行作业,例如:在工作脚本中:

./program1 &
./program2 &
./program3 &
./program4

自然会在不同的处理器上运行每个串行程序。这在登录服务器或独立工作站上运行良好,当然也适用于只需要一个节点的批处理作业。

但是,如果我需要运行同一程序的110个不同实例来读取110个不同的数据集呢?如果我使用提交110 ./program#命令的脚本提交到多个节点(比如14),批处理系统是否会在不同节点上的不同处理器上运行每个作业,或者它是否会尝试在同一个节点上运行它们, 8个核心节点?

我曾尝试使用简单的MPI代码来读取不同的数据,但会产生各种错误,110个流程中的大约100个成功,其他流程崩溃。我也考虑了作业数组,但我不确定我的系统是否支持它。

我已经在各个数据集上广泛测试了串行程序 - 没有运行时错误,并且我没有超过每个节点上的可用内存。

2 个答案:

答案 0 :(得分:5)

不,PBS不会自动在节点之间分配作业。但这是一个常见的事情,你有几个选择。

  • 最简单且在某些方面最有利于您的是将任务分成1节点大小的块,并将这些捆绑包作为单独的作业提交。这将使您的工作更快地开始;单节点作业通常会比(比方说)14节点作业更快地进行调度,因为调度表中的单节点大小比14更多。如果所有作业花费大致相同的时间,则效果特别好因为那时分工非常简单。

  • 如果您确实希望在一个作业中完成所有操作(例如,为了简化簿记),您可能有也可能无法访问pbsdsh命令;对它进行了很好的讨论here。这使您可以在作业中的所有处理器上运行单个脚本。然后编写一个查询$ PBS_VNODENUM的脚本,找出它所在的nnodes * ppn作业,然后运行相应的任务。

  • 如果不是pbsdsh,Gnu parallel是另一个可以极大地简化这些任务的工具。它就像xargs,如果你熟悉它,但会并行运行命令,包括多个节点。所以你提交你的(比方说)14节点作业并让第一个节点运行gnu并行脚本。好处是,即使作业长度不同,这也会为您安排。我们为系统上的用户提供的建议是here使用gnu parallel来进行这些操作。请注意,如果您的系统上没有安装gnu parallel,并且由于某种原因您的系统管理员不会这样做,您可以在主目录中进行设置,这不是一个复杂的构建。

答案 1 :(得分:2)

您应该考虑job arrays

简单地说,您在shell脚本中插入#PBS -t 0-109(其中范围0-109可以是您想要的任何整数范围,但您声明您有110个数据集)并且扭矩将会:

  • 运行110个脚本实例,使用您指定的资源分配每个(在脚本中使用#PBS标记或在提交时作为参数)。
  • 为每个作业分配一个0到109之间的唯一整数到环境变量PBS_ARRAYID

假设您可以访问代码中的环境变量,您可以告诉每个作业在数据集编号PBS_ARRAYID上运行。