bsub

890 阅读17分钟

bsub

-R

在满足资源需求的主机上运行job。

描述

资源需求字符串描述作业需要的资源。LSF使用资源需求来选择执行作业的主机。资源需求字符串可以是简单的(应用于整个作业)、复合的(应用于指定数量的插槽)或替代的。 简单的资源需求字符串分为以下几部分。每个部分都有不同的语法。

  • select:指定从系统中选择执行主机的条件。
  • order:指示应如何排序满足条件的主句。
  • rusage:指定任务的预期资源消耗。
  • span:指示并行作业是否应该跨多个主机。
  • same:指示并行作业的所有进程必须在相同类型的主机上运行。
  • cu:指定在集群中分散作业的拓扑需求。
  • affinity:指定任务的CPU和内存绑定要求。

每个部分都必须键入方括号。每个资源需求部分之间必须有一个空格。

例:提交job到rhel6或者rhel7:

bsub -R "rhel6 || rhel7" myjob

下面的命令在HP-UX主机上运行名为myjob的作业,该主机负载较轻(CPU利用率),至少有15 MB交换内存可用。

bsub -R “swp > 15 && hpux order[ut]” myjob

您可以省略select关键字(及其方括号),但是如果包含select部分,它必须是资源需求字符串中的第一个字符串。如果不指定节名,则第一个资源要求字符串将被视为选择字符串(select[selection_string])。

例:以下的两个资源请求等价:

bsub -R "type==any order[ut] same[model] rusage[mem=1]" myjob

bsub -R "select[type==any] order[ut] same[model] rusage[mem=1]" myjob

如果需要在字符串中包含连字符(-)或其他非字母字符,请将文本用单引号括起来:

例:

bsub - r "select[hname!='host06-x12']"

选择字符串必须符合管理IBM Spectrum LSF中描述的严格的资源需求字符串语法。严格的资源需求语法只适用于选择部分。它不适用于其他资源需求部分(order, rusage, same, span,或cu)。如果rusage部分包含非消耗性资源,LSF将拒绝资源需求字符串。

如果在lsb.queues中设置了RESRSV_LIMIT,合并的应用程序级和作业级使用资源需求必须满足RESRSV_LIMIT设置的任何限制,否则作业将被拒绝。

Any resource for run queue length, such as r15s, r1m or r15m, specified in the resource requirements refers to the normalized run queue length.

默认情况下,select[]和rusage[]节中的内存(mem)和交换(swp)限制以KB为单位指定,使用LSF_UNIT_FOR_LIMITS参数在lsf.conf文件中为这些限制指定一个更大的单位(MB、GB、TB、PB、EB或ZB)。

以下的单位针对资源修去和限制:

  • KB or K
  • MB or M
  • GM or G
  • TB or T
  • PB or P
  • EB or E
  • ZB or Z

指定的单元被转换为由LSF_UNIT_FOR_LIMITS参数指定的适当值。转换后的极限值四舍五入到一个正整数。对于资源需求,您可以在select部分和rusage部分为mem、swp和tmp指定单位。

默认情况下,tmp resource 并不被LSF_UNIT_FOR_LIMITS支持,通过配置参数LSF_ENABLE_TMP_UNIT=Y 启用LSF_UNIT_FOR_LIMITS来支持tmp资源。

如果LSF_ENABLE_TMP_UNIT=Y LSF_UNIT_FOR_LIMIT=GB,存在以下的示例:

bsub -C 500MB -M 1G -S 1TB -F 1M -R "rusage[mem=512MB:swp=1GB:tmp=1TB]" sleep 100

本次作业提交的单位转换为以下单位:

bsub -C 1 -M 1 -S 1024 -F 1024 -R "rusage[mem=0.5:swp=1:tmp=1024]" sleep 100

多种资源请求

bsub -R "select[swp > 15]" -R "select[hpux] order[r15m]" -R rusage[mem=100]" -R "order[ut]" -R "same[type]" -R "rusage[tmp=50:duration=60]" -R "same[model]" myjob

LSF将多个-R选项合并为一个字符串,并选择一个满足所有资源需求的主机。-R选项节的数量是无限的。

多个-R选项只能用在order,same,rusage(not multi-phase),和select部分的简单资源请求字符串中和bsub和bmod两个命令一起使用。

当还定义了应用程序级和队列级cu部分时,作业级cu部分具有优先级,并覆盖应用程序级需求定义,而应用程序级需求定义又具有优先级,并覆盖队列级需求定义。

例:当在lsb.queues文件中指定了EXCLUSIVE=CU[enclosure] ,有一个计算单元类型enclosure在lsf.params文件中,和一个计算单元部分在lsf.host文件中,以下命令提交一个job运行在64slots 包括4个或更少的enclosure,并且只使用enclusure。

bsub -n 64 -R "cu[excl:type=enclosure:maxcus=4]" myjob

在lsf.shared文件中定义了一个叫做bigmem的资源,这个资源是独立的对于在lsf.cluster文件中定义的hostE,使用以下命令提交一个作业运行在hostE上:

bsub -R "bigmem" myjob

or

bsub -R "defined(bigmem)" myjob

verilog_lic 作为Verilog application应用的license的一个静态的共享资源,提交一个job在主机上运行当它有可用的license。

bsub -R "select[defined(verilog_lic)] rusage[verilog_lic=1]" myjob

以下任务请求20mb内存,2分钟申请1个license:

bsub -R "rusage[mem=20, license=1:duration=2]" myjob

以下作业需要20mb的内存,50mb的交换空间,持续1小时,1个license,持续2分钟:

bsub -R "rusage[mem=20:swp=50:duration=1h, license=1:duration=2]" myjob

以下作业需要20mb的内存,需要50mb的交换空间,需要1小时,需要1个license,需要2分钟。

bsub -R "rusage[mem=20,swp=50:duration=1h, license=1:duration=2]" myjob

该任务请求50mb交换空间,并在2小时内线性减少预留量,请求1个license 2分钟。

bsub -R "rusage[swp=50:duration=2h:decay=1, license=1:duration=2]" myjob

下面的作业请求两个持续时间相同但衰减不同的资源:

bsub -R "rusage[mem=20:duration=30:decay=1, lic=1:duration=30]" myjob

下面的作业使用一个多阶段的rusage字符串请求50 MB的内存为10分钟,然后是10 MB的内存为该作业的持续时间:

bsub -R "rusage[mem=(50 10):duration=(10):decay=(0)]" myjob

在下面的示例中,您运行的应用程序版本为1.5,是一个名为app_lic_v15的资源,而运行的应用程序版本为2.0.1,是一个名为app_lic_v201的资源。版本2.0.1的许可密钥向后兼容版本1.5,但版本1.5的许可密钥不与2.0.1兼容。

如果只能使用应用程序的一个版本运行作业,则提交作业时不要指定替代资源。要提交只使用app_lic_v201的作业:

bsub -R "rusage[app_lic_v201=1]" myjob

如果您可以使用应用程序的任意一个版本运行作业,请尝试保留应用程序的2.0.1版本。如果没有,您可以使用版本1.5。要在尝试app_lic_v15之前提交一个尝试app_lic_v201的作业:

bsub -R "rusage[app_lic_v201=1||app_lic_v15=1]" myjob

如果不同版本的应用程序需要不同的系统资源,您可以在rusage字符串中指定其他资源。为app_lic_v201提交一个使用20mb内存的作业,或者为app_lic_v15提交20mb内存和50mb交换空间的作业:。

bsub -R "rusage[mem=20:app_lic_v15=1||mem=20:swp=50:app_lic_v201=1]" myjob

您可以指定一个阈值,在进行分配之前,所使用的资源必须达到这个阈值。例如,:

bsub -R "rusage[bwidth=1:threshold=5]" myjob

例如,提交一个占用1单位带宽(资源bwidth)的作业,但是除非主机上的带宽等于或大于5,否则不应该调度该作业运行。在本例中,bwidth是一个正在减少的资源,并且阈值被解释为下限。如果所涉及的资源在增加,那么阈值将被解释为上限。

An affinity resource requirement string specifies CPU and memory binding requirements for a resource allocation that is topology aware. An affinity[] resource requirement section controls the allocation and distribution of processor units within a host according to the hardware topology information that LSF collects.

资源预定方式

通过在数字值之后使用/job、/host或/task关键字在资源使用字符串中指定资源预留方法。在资源字符串中指定的资源预留方法将覆盖lsb.resources文件的ReservationUsage部分中指定的全局设置。只能为可消耗资源指定资源预留方法。资源预留方法如下:

  • value/job:指定每个作业预留的指定资源。这等价于在lsb.resources文件的ReservationUsage部分通过METHOD的参数PER_JOB。

  • value/host:指定每个主机预留的指定资源。这等价于在lsb.resources文件的ReservationUsage部分通过METHOD的参数PER_HOST。

  • value/task:指定每个任务预留的指定资源。这等价于在lsb.resources文件的ReservationUsage部分通过METHOD的参数PER_TASK。

  • 基本语法:

    • resource_name=value/method:duration=value:decay=value
    • rusage[mem=10/host:duration=10:decay=0]
    • 多阶段限制:rusage[mem=(50 20)/task:duration=(10,5):decay=0]

复合资源需求

在某些情况下,不同的资源需求可能适用于并行作业的不同部分。例如,第一个执行主机可能需要更多内存或更快的处理器来进行最佳作业调度。复合资源需求允许您在队列级、应用程序级或作业级资源需求字符串中为作业中的某些插槽指定不同的需求。

复合资源需求字符串可以由应用程序级或队列级RES_REQ参数设置,或者在提交作业时与bsub -R选项一起使用。bmod -R选项接受挂起的作业的复合资源需求字符串,但不接受正在运行的作业。

当复合资源需求与在多个级别定义的资源需求合并时,特殊规则将生效。如果在任何级别(作业、应用程序或队列)使用复合资源需求,则应用复合多级资源需求组合。

复合资源需求字符串由一个或多个简单的资源需求字符串组成,如下所示:

num1*{simple_string1} + num2*{simple_string2} + ...

numx受影响的slots,simple_stringx简单资源需求字符串。

可以在每个组件表达式中使用相同的资源需求(简单的资源需求)。例如,对于静态字符串资源res1和res2,这样的资源要求是允许的:

“4*{select[io] same[res1] } + 4*{select[compute] same[res1]}”

对于这个资源需求,有两个简单的子表达式,R1和R2。对于这些子表达式中的每一个,所有的槽必须来自具有相同res1值的主机。但是,R1占用的主机可能与R2占用的主机不同。

可以指定一个全局相同的需求,该需求对复合资源需求字符串的多个子表达式生效。例如:

"{4*{select[io]} + 4*{select[compute]}} same[res1]"

该语法允许用户表示这两个子表达式必须驻留在具有相同res1值的主机上。

通常,在一个复合资源需求中可能有两个以上的子表达式。全局的相同将适用于所有主机。

括号的任意嵌套是不允许的。例如,您不能对复合资源需求的三个子表达式中的两个应用全局相同的应用程序。但是,对于整个复合表达式,每个子表达式可以有自己的局部相同和全局相同。例如,允许执行以下操作:

"{4*{same[res1]} + 4*{same[res1]}} same[res2]"

此外,具有全局相同的复合资源需求表达式可能是更大的替代资源需求字符串的一部分。

具有相同全局变量的复合资源需求表达式可以在以下:

  • 提交作业:bsub -R “res_req_string” <other_bsub_options> a.out
  • 应用配置(lsb.application file):RES_REQ = "res_req_string"
  • 队列配置(lsb.queues file):RES_REQ = "res_req_string"

语法:

  • 单个复合资源请求:

    • “{compound_res_req} same[same_string]”
  • 可选资源需求中的复合资源需求:

    • "{{compound_res_req} same[same_string]} || {alt_res_req}"
  • 在具有延迟的可选资源需求内的复合资源需求:

    • "{alt_res_req} || {{alt_res_req} || {{compound_res_req} same[same_string]}@delay"
    • 延迟选项是一个正整数。

限制

  • 复合资源需求不能包含||操作符。复合资源需求不能在任何多个-R选项中定义(包括)。
  • 复合资源需求不能包含cu关键字balance或excl,只能与其他cu关键字(包括pref、type、maxcus和usablecuslots)正常工作。
  • 可调整大小的作业可以有复合资源需求,但只有由复合资源需求的最后一项表示的作业部分才有资格自动调整大小。当您使用bresize release来释放插槽时,您只能释放由复合资源需求的最后一项表示的插槽。如果需要释放之前的槽位,可以重复执行bresize release命令释放后面的最后一个槽位。
  • 复合资源需求不能在有保证的资源池的定义中指定。
  • 使用复合资源的并行作业的资源分配是按所列的顺序对每个复合资源项进行的,而不是考虑所有可能的组合。因不满足一个资源需求项而被拒绝的主机将不会在后续的资源需求项中被重新考虑。

对于没有使用bsub -n命令指定的总槽位数的作业,可以省略最后的numx。最后的资源需求将被应用到零个或多个未被计算的插槽上:

  • num_slots=(num1+num2+num3+...)

对于使用bsub -n min, max命令指定的槽数最小和最大的作业,复合资源要求中的槽数必须与指定的最小和最大槽数兼容。

您可以通过资源需求规范指定插槽或处理器的数量。例如,您可以指定一个作业需要10个插槽或处理器:在内存大于5000mb的主机上有一个插槽或处理器,在内存大于1000mb的主机上有另外9个插槽或处理器: 

bsub -R "1*{mem>5000} +9*{mem>1000}" a.out

指定GPU复合资源使用以下的关键字和参数:

  • 在rusage[]中,使用ngpus_physical资源请求physical GPUs的数量,同时通过gmodel指定GPU类型,gmem指定显存,glink请求特别的GPU(xGMI connections for AMD GPUs or NVLink connections for Nvidia GPUs),以及用mig参数指定多实例的NvidiaGPU。
  • 在span[]中,使用gtile关键字指定在每个socket上GPU的数量。

在下面的例子中,请求5台主机,第一台预留2个GPU分布在第一台的每个socket上,其余4台主机拥有1个GPU在每个节点上,同时有10G内存预留给每个GPU:

bsub -R "1*{span[gtile=!] rusage[ngpus_physical=2:gmem=1G]} + 4*{span[ptile=1] rusage[ngpus_physical=1:gmem=10**G]}" ./app

Alternative resource requirements

在某些情况下,一个作业要运行,可以接受一组以上的资源需求。LSF提供指定替代资源需求的能力。

可选资源需求由两个或多个单独的简单或复合资源需求组成。每个单独的资源需求描述一个备选方案。

当一个作业带着可选资源需求提交时,所选择的可选资源必须满足强制性的第一次执行主机。如果没有一个替代方案能够满足强制性的第一次执行主机,作业将会PEND。

可选资源需求字符串可以在应用程序级或队列级RES_REQ参数中指定,也可以在提交作业时与bsub -R一起使用。bmod -R也接受挂起作业的替代资源需求字符串。

合并作业、应用程序和队列替代资源需求的规则与复合资源需求的规则相同。

替代资源需求不能与下列特性一起使用:

  • 多个bsub -R 命令。
  • taskstarter job,包括那些tssub命令。
  • 使用toplib的HPC集成主机,包括cpuset和Blue Gene主机。
  • 计算单元部分指定balance和excl部分。

如果指定了可选资源需求的作业被重新排队,它将在调度期间考虑所有可选资源需求。如果指定了@D延迟时间,它将被解释为等待,从原始提交时间开始。对于重新启动作业,@D延迟时间从重新启动作业提交时间开始。

可选资源需求由两个或多个单独的资源需求组成。每个单独的资源需求描述一个备选方案。如果无法找到满足第一个资源需求的资源,那么将尝试下一个资源需求,以此类推,直到满足该需求。

替代资源需求由复合资源需求或原子资源需求定义:

bsub -R "{C1 | R1 } || {C2 | R2 }@D2 || ... || {Cn | Rn }@Dn"

  • ||分隔可选资源与下一个可选资源

  • C是一个复合资源请求

  • R选项是一个资源需求,它与当前的LSF资源需求相同,除非存在以下情况:

    • No rusage OR(||)
    • No 计算单元请求cu[...]
  • D选项是一个正整数:

    • @D是可选参数:在提交时间D分钟后才评估可选资源要求,并且被requeed的作业仍然使用提交时间而不是请求时间。没有D1,因为第一种选择总是立即计算。
    • D2<=D3<=D4<=D......
    • 不指定@D意味着,如果之前的可选资源方式不能用于获得作业的分配,则将毫不延迟地评估后面的可选的方法。

例如:如果你有一个连续的作业,但是你有备选的资源请求(如果LSF匹配你的资源失败,便会尝试另一个)。

bsub -R "{ select[type==any] order[ut] same[model] rusage[mem=1] } || { select[type==any] order[ls] same[ostype] rusage[mem=5] }" myjob

你也可以添加一个延迟,在你尝试第二个可选资源的时候。

bsub -R "{ select[type==any] order[ut] same[model] rusage[mem=1] } || { select[type==any] order[ls] same[ostype] rusage[mem=5] }@4" myjob 你也可以有比2个更多的备选资源的方法:

bsub -R "{select[type==any] order[ut] same[model] rusage[mem=1] } || { select[type==any] order[ut] same[model] rusage[mem=1] } || { select[type==any] order[ut] same[model] rusage[mem=1] }@3 || { select[type==any] order[ut] same[model] rusage[mem=1] }@6" myjob

一些并行作业可能需要复合资源需求。您可以以同样的方式指定并行作业的替代方案。也就是说,你可以有几个可供选择的部分,每个部分都用大括号({})括起来,用||分隔:

bsub -n 2 -R "{ 1*{ select[type==any] order[ut] same[model] rusage[mem=1]} + 1 *{ select[type==any] order[ut] same[model] rusage[mem=1] } } || { 1*{ select[type==any] order[ut] same[model]

rusage[mem=1]} + 1*{ select[type==any] order[ut] same[model] rusage[mem=1] } }@6" myjob

或者,复合资源需求部分可以有两个需要相同资源的槽:

bsub -n 2 -R "{ 1*{ select[type==any] order[ut] same[model] rusage[mem=1]} +1*{ select[type==any] order[ut] same[model] rusage[mem=1] } } || { 2*{ select[type==any] order[ut] same[model] rusage[mem=1] } }@10" myjob 可选的资源需求可用于指示作业需要多少任务。例如,一个任务可能在Solaris主机类型上请求4个任务,或者在Linux86主机类型上请求8个任务。如果在作业级别提供了-n选项,那么指定的值必须与资源需求字符串所隐含的值一致:

bsub -R " {8*{type==LINUX86}} || {4*{type==SOLARIS}}" a.out

如果产生冲突,job提交将被拒绝:

bsub -n 3 -R " {8*{type==LINUX86}} || {4*{type==SOLARIS}}" a.outsocket

要指定其他GPU资源要求,请使用以下关键字和选项:

  • 在rusage[]部分使用ngpus_physical 资源请求物理GPU的数量,gmodel指定GPU的类型、gmem指定GPU显存、glink请求特定的连接的GPU(xGMI连接AMDD GPU。NVLink 连接Nvidia 多示例GPU)、mig指定Nvidia 多实例GPU硬件请求。
  • 在span[]部分,使用gtile关键字指定每个socket请求的GPU数量。

下面的例子请求4个主机拥有1K80 GPU在每个节点,或者1个节点的每个socket有2P100 GPU:

bsub -R "{4*{span[ptile=1] rusage[ngpus_physical=1:gmodel=K80]}} || {1*{span[gtile=1] rusage[ngpus_physical=2:gmodel=P100]}}" ./app