范围字符串

span 字符串指定并行作业的位置。 如果省略了 span ,那么 LSF 将从可用处理器集为作业分配所需的处理器。

语法

span 字符串支持以下语法:

范围 [hosts=1]
指示分配给此作业的所有处理器必须位于同一主机上。
span [块 = 值]
对于并行作业, LSF 将根据块大小向作业分配槽。 LSF 尝试在一个主机上打包尽可能多的块,然后转至下一个主机。 每个主机仅检查一次。
span [ptile=value]
指示每个主机上应该分配给作业的处理器数,其中 value 是下列其中一项:
  • 缺省 ptile 值,由 n 个处理器指定。 在以下示例中,作业请求每个可用主机上的 4 处理器,而不考虑该主机具有的处理器数:
    span[ptile=4]
  • 预定义的 ptile 值,由 "!" 指定。 以下示例使用预定义的最大作业槽限制 lsb.hosts (每个主机类型/型号的 MXJ) 作为其值:
    span[ptile='!']
    提示: 如果主机类型/型号未定义 MXJ ,那么将忽略 span[ptile='!'] 值。
    限制: 在 bash 3.0下, shell 未正确解释感叹号 (!)。 要使用预定义的 ptile 值 (ptile = '!') ,请使用 + H 选项禁用 "!" bash (sh + H) 中的样式历史记录替换。
  • 预定义的 ptile 值,每个主机类型或主机模型具有可选的多个 ptile 值:
    • 对于主机类型,必须指定same[type]在资源需求中。 在以下示例中,作业请求类型的主机上的 8 处理器HP以及类型为主机上的 2 个处理器LINUX以及 lsb.hosts (MXJ) 中针对其他主机类型的预定义最大作业插槽限制:
      span[ptile='!',HP:8,LINUX:2] same[type]
    • 对于主机模型,必须指定same[model]在资源需求中。 在以下示例中,作业请求模型主机上的 4 处理器PC1133以及 PC233型主机上的 2 处理器,以及 lsb.hosts (MXJ) 中针对其他主机型号的预定义最大作业插槽限制:
      span[ptile='!',PC1133:4,PC233:2] same[model]
范围 [条带]
对于并行作业, LSF 会跨候选主机的可用资源对作业的任务进行条带分割。

例如,如果使用以下命令提交请求四个任务的作业:

bsub -n 4 -R "span[stripe]" ./a.out

任务布置取决于可用资源:

  • 如果有一个候选主机,那么该主机有四个任务 (4)。
  • 如果有两个候选主机,那么每个主机都有两个任务 (2, 2)。
  • 如果有三个候选主机,那么一个主机有两个任务,另外两个主机各有一个任务 (2,1, 1)。
  • 如果有四个候选主机,那么每个主机都有一个任务 (1,1,1 , 1)。
span [stripe=max_tasks]
对于并行作业, LSF 会跨候选主机的可用资源对作业的任务进行条带分割,直至达到每个主机上指定的最大任务数。
范围 [hosts=-1]

禁用队列中的范围设置。 LSF 从可用处理器集为作业分配必需的处理器。

示例

以下示例适用于在具有以下空闲主机的集群中提交的作业:

bhosts
HOST_NAME          STATUS       JL/U    MAX  NJOBS    RUN  SSUSP  USUSP    RSV
host1              ok              -     32      0      0      0      0      0
host2              ok              -     32      0      0      0      0      0
host3              ok              -     32      0      0      0      0      0
host4              ok              -     32      0      0      0      0      0
host5              ok              -     32      0      0      0      0      0
  • 提交具有条带分割的作业:
    bsub -n 32 -R "span[stripe]" myjob

    查看具有条带分割的作业的任务分布:

    bjobs
    JOBID   USER    STAT  QUEUE      FROM_HOST   EXEC_HOST   JOB_NAME   SUBMIT_TIME
    118     userA   RUN   normal     hostA       7*host1     myjob      Nov 29 14:27
                                                 7*host2
                                                 6*host3
                                                 6*host4
                                                 6*host5

    任务将均匀分布到主机,并且任何其他任务都将分布到第一个主机。 host1 和 host2上有 7 个任务, host3, host4和 host5上有 6 个任务。

  • 使用 ptile提交作业:
    bsub -n 32 -R "span[ptile=8]" myjob

    使用 ptile查看作业的任务分布:

    bjobs
    JOBID   USER    STAT  QUEUE      FROM_HOST   EXEC_HOST   JOB_NAME   SUBMIT_TIME
    119     userA   RUN   normal     hostA       8*host1     myjob      Nov 29 14:29
                                                 8*host2
                                                 8*host3
                                                 8*host4

    任务与每个主机的精确 8 任务一起分发,但如果要分发的任务总数较少,那么最后一个主机的任务数可能少于 ptile 值。

  • 根据块大小提交作业:
    bsub -n 32 -R "span[block=8]" myjob

    根据块大小查看作业的任务分布:

    bjobs
    JOBID   USER    STAT  QUEUE      FROM_HOST   EXEC_HOST   JOB_NAME   SUBMIT_TIME
    120     userA   RUN   normal     hostA       32*host1    myjob      Nov 29 14:32

    任务打包在 8 的块中。

  • 向单个主机提交作业:
    bsub -n 32 -R "span[hosts=1]" myjob

    查看提交到单个主机的作业的任务分布:

    bjobs
    JOBID   USER    STAT  QUEUE      FROM_HOST   EXEC_HOST   JOB_NAME   SUBMIT_TIME
    121     userA   RUN   normal     hostA       32*host1    myjob      Nov 29 14:34

    将任务放入单个主机 (host1) 中。

可调整大小的作业

对于 span[hosts=1]的资源需求,调整大小请求仅限于作业的第一次执行主机上的插槽。 此行为消除了从最初分派作业时修改 span 表达式时产生的岐义。

对于 span[ptile=n],将在一定数量的主机上精确分配作业 n 个插槽,并在一个主机上分配介于 1 和 n 个插槽 (含) 之间的插槽。 即使请求了一系列插槽,也是如此。 例如,对于以下作业提交:
bsub -n "1,20" -R "span[ptile=2]" sleep 10000

此特殊范围行为不仅适用于调整请求大小。 仅当进行原始分配时,以及在进行额外的调整大小分配时,它才适用于可调整大小的作业。

如果每个主机只有一个插槽可用,那么将为作业分配一个插槽。

将处理具有部分填充的主机的调整大小请求,以便 LSF 不会选择作业已占用的主机上的任何插槽。 例如,通常将 ptile 功能部件与 span[ptile=1] 配合使用以调度互斥作业。

对于具有所请求的一系列插槽和 span[ptile=n]的可调整大小的作业 (自动调整可调整大小或其他) ,无论何时分配该作业的插槽,它都将接收以下任一项:
  • 请求的最大插槽数,包括每个主机上的 n 个插槽,以及一个主机上的 0 和 n-1 (含) 个插槽之间的插槽
  • 每个主机上的 n 个插槽,合计为小于最大值的某个值
例如,如果在 1 和 14 个额外槽之间的作业请求,并且 span[ptile=4] 是作业资源需求字符串的一部分,那么当将其他槽分配给该作业时,该作业将接收以下任一项:
  • 14 个插槽,其中 2 个插槽位于一个主机上, 4 个插槽位于每个 3 主机上
  • 4 , 8 或 12 个插槽,使每个主机分配 4 个插槽
注: 可处理作业不能具有复合资源需求。

示例

在运行并行互斥作业时,通常需要指定span[ptile=1]以便在每个主机上最多分配一个插槽。 对于可自动调整大小的作业,将在作业尚未使用的主机上分配新插槽。 以下作业提交指定此资源请求:
bsub -x -ar -app <appplicaion_file> -n "1,100" -R "span[ptile=1]" myjob

当将其他插槽分配给正在运行的作业时,这些插槽将位于新主机上,而不是已由该作业占用。

块调度

对于对网络等待时间不特别敏感的应用程序,或者您希望获取吞吐量的位置,可以为具有特定块大小的并行作业分配插槽。 作业指定的应用程序可能正在 n 核心组上作为线程进程运行,但使用 MPI 应用程序或块之间的其他套接字连接。 LSF 将根据块大小向作业分配插槽。 LSF 尝试在一个主机上打包尽可能多的块,然后转至下一个主机。 每个主机仅检查一次。 包含插槽块的主机无关紧要。 该作业可以在任何先前作业完成后立即启动。

例如,在下面的插图中,每种颜色都表示不同的作业。 有四个 16 路作业:

对于 bsub -n 16block=4,仅需要 4 x 4 插槽块。 包含插槽块的主机无关紧要。 该作业可以在任何先前作业完成后立即启动。

此打包策略受资源需求字符串的 span 部分中的关键字 block (“span[block=value]”) 支持。 还可以在 lsb.queueslsb.applications中的 RES_REQ 参数中配置 “span[block=value]”

为作业指定块大小时, LSF 仅分配该作业的块大小的倍数。 例如,对于块大小为 4 的作业:

  • bsub -n 2,13: 4 , 8 或 12 个插槽分配给作业 (大小为 4 的块)。
  • bsub -n 5: 作业被拒绝。
  • bsub -n 9,10: 作业被拒绝。
  • bsub -n 2,3: 作业被拒绝。
  • bsub -n 12: 接受作业,并分配大小为 4 的 3 块。
  • bsub -n 2: 作业被拒绝。
  • bsub -n 3: 作业被拒绝。

-n min,max 中的最小值将以静默方式更改为块的倍数。 例如:

bsub -n 2,8 -R span[block=4] sleep 1d

更改为:

bsub -n 4,8 -R span[block=4] sleep 1d

LSF 尝试将尽可能多的块打包到一个主机中,然后转至下一个主机。 例如,假定 host1 具有 8 个插槽, host2 具有 8 个插槽, host3 也具有 8 个插槽,其中每个主机的 2 个插槽由其他作业使用。 对于具有 -n 9 "span[block=3]”的作业,分配将为:

  • host1: 6 插槽
  • host2: 3 插槽

以下是如何显示主机及其静态和动态资源信息,指定作业的块大小和资源需求以及查看输出的示例:

bhosts
HOST_NAME  STATUS   JL/U   MAX  NJOBS   RUN  SSUSP  USUSP    RSV 
hostA      ok        -     8      0     0      0      0      0
hostB      ok        -     8      0     0      0      0      0
hostC      ok        -     8      0     0      0      0      0
hostD      unavail   -     1      0     0      0      0      0
hostE      ok        -     4      0     0      0      0      0
hostF      ok        -     4      0     0      0      0      0
 
bsub -n 24 -R "order[slots] span[block=4]" sleep 1d
Job <418> is submitted to default queue <normal>.
 
bjobs
JOBID  USER  STAT  QUEUE  FROM_HOST  EXEC_HOST  JOB_NAME  SUBMIT_TIME
418    user1 RUN   normal hostE      8*hostC    sleep 1d  Sep  4 21:36
                                     8*hostB    sleep 1d  Sep  4 21:36
                                     8*hostA    sleep 1d  Sep  4 21:36
 
bhosts
HOST_NAME  STATUS    JL/U   MAX  NJOBS   RUN  SSUSP  USUSP   RSV
hostA      closed     -     8      8     8      0      0     0
hostB      closed     -     8      8     8      0      0     0
hostC      closed     -     8      8     8      0      0     0
hostD      unavail    -     1      0     0      0      0     0
hostE      ok         -     4      0     0      0      0     0
hostF      ok         -     4      0     0      0      0     0

以下是在提交具有资源需求的作业时如何使用 “span[block=value]” 的一些其他示例:

  • 要按主机类型或主机模型指定预定义的块值,请使用!:

    bsub -n "2,10" –R "span[block='!'] same[type]" myjob

  • 要按主机类型或主机模型指定具有可选多个块值的预定义块值,请执行以下操作:

    bsub -n "2,10" –R “span[block='!',HP:8,SGI:8,LINUX:2] same[type]" myjob

    如果主机类型/型号未定义 MXJ ,那么缺省预定义块值为 1。

“span[block=value]” 可由 bjobs -lbhist -lbqueues -lbapp -lbacct -l显示。

使用块调度功能时,请注意以下事项:

  • 对于队列主机限制 (HOSTLIMIT_PER_JOB) , mbatchd 将不会拒绝具有 block=x 的作业,因为只能在调度期间获取确切的已分配主机数。
  • 不能同时指定 “span[block=value]”“span[ptile=value]” 。 不能同时指定 “span[block=value]”“span[host=value]” ,因为范围不能接受多个条件,并且多个 -R 不支持多个范围定义。
  • 对于 LSF 多集群功能,使用作业转发模型时,无法将具有 block=x 的作业转发到版本低于 9.1.2的远程集群。 使用租赁模型时,无法将具有 block=x 的作业分配给从版本低于 9.1.2的远程集群租赁的主机。