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]"描述
- num =num_gpus [/任务 | 主机]
- 作业所需的物理 GPU 数。 缺省情况下,该数字是每个主机的数字。 您还可以通过在数字后指定 /task 来指定每个任务的数字。
如果 您指定了每个任务的编号, lsb.resources 文件中 ngpus_physical 资源的配置设置为 PER_TASK, 或者 lsb.params 文件中设置了 RESOURCE_RESERVE_PER_TASK=Y 参数,那么此编号是每个任务请求的计数。
- 模式=共享 | 独占进程
- 作业运行时的 GPU 方式 ( shared 或 exclusive_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_DEVICES 。 LSF 只是设置任务的 CUDA_VISIBLE_DEVICES<number> 环境变量,而不是 CUDA_VISIBLE_DEVICES。 LSF MPI 将 CUDA_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 配合使用,这可能会导致意外行为。 - 如果设置了 mps=yes ,那么 LSF 将对每个作业的每个主机启动一个 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=yes 和 block=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=yes 和 aff=yes ,那么 block=yes 设置优先,并且会禁用严格的 CPU-GPU 亲缘关系绑定 (即,会自动设置 aff=no )。 - gpack=yes | 否
- 仅适用于 共享 方式作业。 指定是否启用包调度。 如果设置为 yes,那么 LSF 会将多个共享方式 GPU 作业打包到已分配的 GPU。 LSF 按如下所示调度共享方式 GPU:
- LSF 根据已具有正在运行的作业的共享 GPU 数,然后按非互斥的 GPU 数对候选主机进行排序 (从最大到最小)。
如果在资源需求字符串中定义了 order [] 关键字,那么在对 order []进行排序之后, LSF 会按 gpack 策略 (先按已具有正在运行的作业的共享 GPU ,然后再按非互斥的 GPU 数) 对候选主机进行重新排序。 gpack 策略排序优先级高于 order [] 排序。
- LSF 根据正在运行的作业数对每个主机上的候选 GPU 进行排序 (从最大到最小)。
调度后,共享方式 GPU 作业打包到首先排序的已分配共享 GPU ,而不是新的共享 GPU。
如果启用了 Docker 属性亲缘关系,那么候选主机的顺序按 Docker 属性亲缘关系排序,然后再按 GPU 排序。
缺省情况下,设置了 gpack=no ,因此包调度处于禁用状态。
- LSF 根据已具有正在运行的作业的共享 GPU 数,然后按非互斥的 GPU 数对候选主机进行排序 (从最大到最小)。
如果 GPU_REQ_MERGE 参数在 lsb.params 文件中定义为 Y 或 y ,并且在多个级别 (至少两个缺省集群,队列,应用程序概要文件或作业级别需求) 指定 GPU 需求,那么将单独合并 GPU 需求的每个选项。 作业级别覆盖应用程序级别,这将覆盖队列级别,这将覆盖缺省集群 GPU 需求。 例如,如果在 -gpu 选项上定义了 GPU 需求的 mode 选项,并且在队列中定义了 mps 选项,那么将使用作业级别的方式和队列的 mps 值。
如果 GPU_REQ_MERGE 参数未在 lsb.params 文件中定义为 Y 或 y ,并且 在多个级别 (至少有两个缺省集群,队列,应用程序概要文件或作业级别需求) 指定了 GPU 需求,那么将替换整个 GPU 需求字符串。 整个作业级别 GPU 需求字符串将覆盖应用程序级别,这将覆盖队列级别,这将覆盖缺省 GPU 需求。
esub 参数 LSB_SUB4_GPU_REQ 修改 -gpu 选项的值。
LSF 首先选择满足拓扑需求的 GPU。 如果所选 GPU 的 GPU 方式不是所请求的方式,那么 LSF 会将 GPU 更改为所请求的方式。 例如,如果 LSF 将 exclusive_process GPU 分配给需要共享 GPU 的作业,那么 LSF 会在作业启动之前将 GPU 方式更改为共享,然后在作业完成时将方式更改回 exclusive_process 。
GPU 需求将转换为作业的 rusage 资源需求。 例如, num=2 将转换为rusage[ngpus_physical=2]. 使用 bjobs, bhist和 bacct 命令来查看合并的资源需求。
可能存在 bsub -gpu 选项和 GPU_REQ 参数语法无法涵盖的复杂 GPU 需求,包括复合 GPU 需求 (针对不同主机上的作业的不同 GPU 需求,或针对并行作业的不同部分的不同 GPU 需求) 和备用 GPU 需求 (如果要运行的作业可接受多组 GPU 需求)。 对于复杂的 GPU 需求,请使用 bsub -R 命令选项或 lsb.applications 或 lsb.queues 文件中的 RES_REQ 参数来定义资源需求字符串。
缺省值
未定义
另请参阅
- GPU_REQ
- bsub -gpu