LSB_GPU_REQ

在一个语句中同时指定 GPU 需求。

语法

LSB_GPU_REQ = "[num=num_gpus[/task | host]] [:mode=shared | exclusive_process] [:mps=yes[,shared][,nocvd] | no | per_socket[,shared][,nocvd] | per_gpu[,shared][,nocvd]] [:j_exclusive=yes | no] [:aff=yes | no] [:block=yes | no] [:gpack=yes | no]"

描述

LSB_GPU_REQ 参数采用以下参数:
num =num_gpus [/任务 | 主机]
作业所需的物理 GPU 数。 缺省情况下,该数字是每个主机的数字。 您还可以通过在数字后指定 /task 来指定每个任务的数字。

如果 您指定了每个任务的编号, lsb.resources 文件中 ngpus_physical 资源的配置设置为 PER_TASK 或者 lsb.params 文件中设置了 RESOURCE_RESERVE_PER_TASK=Y 参数,那么此编号是每个任务请求的计数。

模式=共享 | 独占进程
作业运行时的 GPU 方式 ( sharedexclusive_process)。 缺省方式为 shared

共享 方式对应于 Nvidia 或 AMD DEFAULT 计算方式。 exclusive_process 方式对应于 Nvidia EXCLUSIVE_PROCESS 计算方式。

注: 使用 AMD GPU 时 (即,指定 gvendor=amd 时) ,请勿指定 exclusive_process
mps=yes[, nocvd][, shared] | per_socket[, shared][, nocvd] | per_gpu[, shared][, nocvd] | no
对分配给作业的 GPU 启用或禁用 Nvidia Multi-Process Service (MPS)。 有效使用 MPS 会导致 EXCLUSIVE_PROCESS 方式的行为与所有 MPS 客户机的 DEFAULT 方式相似。 MPS 始终允许多个客户机通过 MPS 服务器使用 GPU。
注: 要避免不一致的行为,请不要在使用 AMD GPU 时 (即,指定 gvendor=amd 时) 启用 mps 。 如果在集群,队列,应用程序和作业级别合并 GPU 需求的结果是 gvendor=amd ,并且启用了 mps (例如,如果在作业级别指定了 gvendor=amd 而未指定 mps=no,但在应用程序,队列或集群级别指定了 mps=yes ) ,那么 LSF 将忽略 mps 需求。

MPS 对于共享和独占过程 GPU 都很有用,并允许更有效地共享 GPU 资源和更好的 GPU 利用率。 请参阅 Nvidia 文档以获取更多信息和限制。

使用 MPS 时,请使用 EXCLUSIVE_PROCESS 方式来确保只有单个 MPS 服务器在使用 GPU ,这提供了额外的保险,即 MPS 服务器是该 GPU 的所有 CUDA 进程之间的单点仲裁。

您还可以通过添加 share 关键字 (使用逗号且没有空格) 来启用 MPS 守护程序共享 (例如, mps=yes,shared 在主机上启用 MPS 守护程序共享)。 如果启用共享,那么具有相同资源需求的同一用户提交的所有作业将共享主机,套接字或 GPU 上的同一 MPS 守护程序。

LSF 根据 mps 关键字的值,在每个主机,每个套接字或每个 GPU 的基础上启动 MPS 守护程序:

  • 如果设置了 mps=yes ,那么 LSF 将对每个作业的每个主机启动一个 MPS 守护程序。

    启用共享 (即,如果设置了 mps=yes,shared ) 时,对于同一用户提交的具有相同资源需求的所有作业, LSF 将对每个主机启动一个 MPS 守护程序。 这些作业都在主机上使用相同的 MPS 守护程序。

    禁用 CUDA_VISIBLE_DEVICES 环境变量 (即,如果设置了 mps=yes,nocvd ) 时, LSF 不会为任务设置 CUDA_VISIBLE_DEVICES<number> 环境变量,因此 LSF MPI 不会为任务设置 CUDA_VISIBLE_DEVICESLSF 只是设置任务的 CUDA_VISIBLE_DEVICES<number> 环境变量,而不是 CUDA_VISIBLE_DEVICESLSF MPICUDA_VISIBLE_DEVICES<number> 环境变量转换为 CUDA_VISIBLE_DEVICES 并为任务设置这些变量。

  • 如果设置了 mps=per_socket ,那么 LSF 将针对每个作业的每个套接字启动一个 MPS 守护程序。 当启用了共享 (即,如果设置了 mps=per_socket,shared ) 时, LSF 将针对具有相同资源需求的同一用户提交的所有作业,针对每个套接字启动一个 MPS 守护程序。 这些作业都对套接字使用相同的 MPS 守护程序。
  • 如果设置了 mps=per_gpu ,那么 LSF 将针对每个作业的每个 GPU 启动一个 MPS 守护程序。 启用共享时 (即,如果设置了 mps=per_gpu,shared ) , LSF 将针对同一用户提交的具有相同资源需求的所有作业,针对每个 GPU 启动一个 MPS 守护程序。 这些作业都对 GPU 使用相同的 MPS 守护程序。
重要信息: 不支持将 EXCLUSIVE_THREAD 方式与 MPS 配合使用,这可能会导致意外行为。
j_exclusive=yes | 否
指定分配的 GPU 是否可供其他作业使用。 当方式设置为 exclusive_process时,将自动设置 j_exclusive=yes 选项。
aff=yes | 否
指定是否强制实施严格的 GPU-CPU 亲缘关系绑定。 如果设置为 no,那么 LSF 将在维护 CPU 亲缘关系时放宽 GPU 亲缘关系。 缺省情况下, aff=yes 设置为保持严格的 GPU-CPU 亲缘关系绑定。
注: aff=yes 设置与 block=yes 冲突 (当任务数大于请求的 GPU 数时,将已分配的 GPU 作为块分发)。 这是因为严格的 CPU-GPU 绑定根据 CPU NUMA 标识将 GPU 分配给任务,这与分配的 GPU 作为块的分布相冲突。 如果在 GPU 需求字符串中同时指定了 aff=yesblock=yes ,那么 block=yes 设置优先,并且会禁用严格的 CPU-GPU 亲缘关系绑定 (即,会自动设置 aff=no )。
block=yes | 否
指定是否启用块分发,即,当任务数大于请求的 GPU 数时,将作业的已分配 GPU 作为块分发。 如果设置为 yes,那么当任务数大于请求的 GPU 数时, LSF 会将作业的所有已分配 GPU 作为块分发。 缺省情况下,设置了 block=no ,因此不会将已分配的 GPU 作为块分发。

例如,如果 GPU 作业请求在具有 4 GPU 和 40 个任务的主机上运行,那么块分发会为列组 0-9 分配 GPU0 ,为列组 10-19 分配 GPU1 ,为坦克 20-29 分配 GPU2 ,为列组 30-39 分配 GPU3 。

注: block=yes 设置与 aff=yes (严格的 CPU-GPU 亲缘关系绑定) 冲突。 这是因为严格的 CPU-GPU 绑定根据 CPU NUMA 标识将 GPU 分配给任务,这与分配的 GPU 作为块的分布相冲突。 如果在 GPU 需求字符串中同时指定了 block=yesaff=yes ,那么 block=yes 设置优先,并且会禁用严格的 CPU-GPU 亲缘关系绑定 (即,会自动设置 aff=no )。
gpack=yes | 否
仅适用于 共享 方式作业。 指定是否启用包调度。 如果设置为 yes,那么 LSF 会将多个共享方式 GPU 作业打包到已分配的 GPU。 LSF 按如下所示调度共享方式 GPU:
  1. LSF 根据已具有正在运行的作业的共享 GPU 数,然后按非互斥的 GPU 数对候选主机进行排序 (从最大到最小)。

    如果在资源需求字符串中定义了 order [] 关键字,那么在对 order []进行排序之后, LSF 会按 gpack 策略 (先按已具有正在运行的作业的共享 GPU ,然后再按非互斥的 GPU 数) 对候选主机进行重新排序。 gpack 策略排序优先级高于 order [] 排序。

  2. LSF 根据正在运行的作业数对每个主机上的候选 GPU 进行排序 (从最大到最小)。

调度后,共享方式 GPU 作业打包到首先排序的已分配共享 GPU ,而不是新的共享 GPU。

如果启用了 Docker 属性亲缘关系,那么候选主机的顺序按 Docker 属性亲缘关系排序,然后再按 GPU 排序。

缺省情况下,设置了 gpack=no ,因此包调度处于禁用状态。

如果 GPU_REQ_MERGE 参数在 lsb.params 文件中定义为 Yy ,并且在多个级别 (至少两个缺省集群,队列,应用程序概要文件或作业级别需求) 指定 GPU 需求,那么将单独合并 GPU 需求的每个选项。 作业级别覆盖应用程序级别,这将覆盖队列级别,这将覆盖缺省集群 GPU 需求。 例如,如果在 -gpu 选项上定义了 GPU 需求的 mode 选项,并且在队列中定义了 mps 选项,那么将使用作业级别的方式和队列的 mps 值。

如果 GPU_REQ_MERGE 参数未在 lsb.params 文件中定义为 Yy ,并且 在多个级别 (至少有两个缺省集群,队列,应用程序概要文件或作业级别需求) 指定了 GPU 需求,那么将替换整个 GPU 需求字符串。 整个作业级别 GPU 需求字符串将覆盖应用程序级别,这将覆盖队列级别,这将覆盖缺省 GPU 需求。

esub 参数 LSB_SUB4_GPU_REQ 修改 -gpu 选项的值。

LSF 首先选择满足拓扑需求的 GPU。 如果所选 GPU 的 GPU 方式不是所请求的方式,那么 LSF 会将 GPU 更改为所请求的方式。 例如,如果 LSFexclusive_process GPU 分配给需要共享 GPU 的作业,那么 LSF 会在作业启动之前将 GPU 方式更改为共享,然后在作业完成时将方式更改回 exclusive_process

GPU 需求将转换为作业的 rusage 资源需求。 例如, num=2 将转换为rusage[ngpus_physical=2]. 使用 bjobsbhistbacct 命令来查看合并的资源需求。

可能存在 bsub -gpu 选项和 GPU_REQ 参数语法无法涵盖的复杂 GPU 需求,包括复合 GPU 需求 (针对不同主机上的作业的不同 GPU 需求,或针对并行作业的不同部分的不同 GPU 需求) 和备用 GPU 需求 (如果要运行的作业可接受多组 GPU 需求)。 对于复杂的 GPU 需求,请使用 bsub -R 命令选项或 lsb.applicationslsb.queues 文件中的 RES_REQ 参数来定义资源需求字符串。

重要信息: 只能使用 -gpu 选项, lsf.conf 文件中的 LSB_GPU_REQ 参数或 lsb.queueslsb.applications 文件中的 GPU_REQ 参数来定义 modej_exclusivemps 选项。 不能将这些选项与 bsub -R 命令选项中的 rusage 资源需求字符串或 lsb.queueslsb.applications 文件中的 RES_REQ 参数配合使用。

缺省值

未定义

另请参阅

  • GPU_REQ
  • bsub -gpu