提交需要 GPU 资源的作业

使用 bsub -gpu 选项在作业提交期间指定 GPU 资源需求,或者将作业提交到在 GPU_REQ 参数中配置了 GPU 资源需求的队列或应用程序概要文件。 对于复杂的 GPU 资源需求(包括替代或复合资源需求),请使用 bsub -R 选项。

过程

  • 使用 bsub -gpu 选项可提交具有 GPU 资源需求的作业。

    bsub -gpu - | " [num= GPU数量 [/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 ] [:glink=yes ] [:gvendor=amd | nvidia ] [:gmodel=型号名称 [-内存大小 ]] [:gtile= tile_num |'!' ] [:gmem=内存值 ]"

    -
    指定作业不设置作业级别 GPU 需求。 使用不带字母的连字符来设置在集群,队列或应用程序概要文件级别定义的有效 GPU 需求。

    如果在集群,队列和应用程序概要文件级别指定了 GPU 需求,那么将单独合并 GPU 需求的每个选项 (nummodempsj_exclusivegmodelgtilegmemnvlink) 。 应用程序概要文件级别覆盖队列级别,这将覆盖集群级别的缺省 GPU 需求。

    如果在集群,队列或应用程序级别中未定义任何 GPU 需求,那么缺省值为 "num=1:mode=shared:mps=no:j_exclusive=no"

    num=num_gpus [/task | host]
    作业所需的物理 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 ,因此包调度处于禁用状态。

    供应商=AMD | nvidia
    指定 GPU 供应商类型。 LSF 分配具有指定供应商类型的 GPU。

    指定 amd 以请求 AMD GPU ,或指定 nvidia 以请求 Nvidia GPU。

    缺省情况下, LSF 请求 Nvidia GPU。

    gmodel=model_name [-mem_size] ( -mem_size )
    指定具有特定模型名称和 (可选) 其总 GPU 内存的 GPU。 缺省情况下, LSF 分配具有相同模型的 GPU (如果可用)。

    gmodel 关键字支持以下格式:

    gmodel=模型名称
    请求具有指定品牌和型号名称 (例如, TeslaK80) 的 GPU。
    gmodel=short_model_name
    请求具有特定品牌名称的 GPU (例如, Tesla , Quadro , NVS ,) 或模型类型名称 (例如, K80, P100)。
    gmodel= 模型名称 - 内存大小
    请求具有指定品牌名称和总 GPU 内存大小的 GPU。 GPU 内存大小由数字及其单元组成,其中包括 MGTMBGBTB (例如, 12G)。

    要在每个主机上查找可用的 GPU 模型名称,请运行 lsload –gpuloadlshosts –gpubhosts -gpu 命令。 模型名称字符串不包含空格字符。 此外,斜杠 (/) 和连字符 (-) 将替换为下划线字符 (_)。 例如, GPU 模型名称 "Tesla C2050 / C2070" 在 LSF中转换为 "TeslaC2050_C2070"。

    gmem=mem_value

    指定作业所需的每个 GPU 上的 GPU 内存。 mem_value 的格式与其他资源值相同 (例如,memswap) 在作业资源需求 (-R) 的 rusage 部分中。

    gtile=!| tile_num
    指定每个套接字的 GPU 数。 指定一个数字以显式定义主机上每个套接字的 GPU 数,或者指定惊叹号 (!) 以允许 LSF 自动计算该数字,这将沿着主机上的所有套接字平均划分 GPU。 LSF 保证即使是亲缘关系作业也满足 gtile 需求。 这意味着当无法满足 gtile 需求时, LSF 可能不会将 GPU 的亲缘关系分配给已分配的 CPU。

    如果没有为亲缘关系作业指定 gtile 关键字,那么 LSF 会尝试在分配了 GPU 的套接字上分配足够的 GPU。 如果最佳套接字上没有足够的 GPU ,那么作业无法转至此主机。

    如果未对非亲缘关系作业指定 gtile 关键字,那么 LSF 会尝试在同一套接字上分配足够的 GPU。 如果此属性不可用,那么 LSF 可能会在单独的 GPU 上分配 GPU。

    nvlink=yes
    LSFV 10.1 FP11 中已废弃。 请改为使用 glink 关键字。 对 GPU 之间的 NVLink 连接启用作业实施。 LSF 分配具有有效 NVLink 连接的 GPU。
    闪烁=是
    对 GPU 之间的特殊连接启用作业实施。 LSF 必须使用特定于 GPU 供应商的特殊连接来分配 GPU。

    如果作业请求 AMD GPU ,那么 LSF 必须分配具有 xGMI 连接的 GPU。 如果作业请求 Nvidia GPU ,那么 LSF 必须使用 NVLink 连接来分配 GPU。

    请勿将 glink 与过时的 nvlink 关键字一起使用。

    缺省情况下,当没有足够的 GPU 具有这些连接时, LSF 可以分配没有特殊连接的 GPU。

    mig=GI_size [ /CI_size ]
    指定 Nvidia Multi-Instance GPU (迁移) 设备需求。

    指定 MIG 作业所需的 GPU 实例大小。 有效的 GPU 实例大小为 1、2、3、4、7。

    可选择在指定的 GPU 实例大小和斜线字符 (/) 之后指定所请求的计算实例大小。请求的计算实例大小必须小于或等于请求的 GPU 实例大小。 此外, Nvidia 联格不支持以下 GPU/ 计算实例大小组合: 4/3,7/5,7/6。 如果未指定此值,那么缺省计算实例大小为 1。

    如果 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 选项的值。

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

    有关使用 bsub -gpu 命令选项的详细信息,请参阅 bsub -gpu

    例如,以下命令请求 2 Tesla GPU 在每个 GPU 上总大小为 12 GB ,在每个 GPU 上保留 8 GB GPU 内存,并将 GPU 均匀分布在主机上的所有套接字上。 提交作业后 NVIDIA 即可在 GPU 上运行,且所有分配的 GPU 必须具有 NVLink 连接:

    bsub -gpu "num=2:gmodel=Tesla-12G:gmem=8G:gtile='!':mps=yes:glink=nvlink ./myjob

  • 如果在应用程序概要文件或队列中指定了 GPU 资源需求,请将作业提交到具有 GPU 资源需求的应用程序概要文件或队列。

    bsub -app gpu_app ./myjob

    bsub -q "gpu_queue" ./myjob

  • 使用 bsub -R 命令选项可提交具有复杂 GPU 资源需求的作业。

    可能存在 bsub -gpu 选项和 GPU_REQ 参数语法无法涵盖的复杂 GPU 资源需求,包括复合 GPU 需求 (针对不同主机上的作业的不同 GPU 需求,或针对并行作业的不同部分的不同 GPU 需求) 和备用 GPU 需求 (如果一个作业可接受多组 GPU 需求)。

    以下 bsub -R 选项特定于 GPU 资源需求:

    bsub -R " span[gtile=tile_num | '!'] rusage[ngpus_physical=num_gpus:gmodel=model_name [-mem_size ]:gmem=mem_value:glink=yes]"

    • span [] 部分中,使用 gtile 关键字来指定在每个套接字上请求的 GPU 数。
    • rusage [] 部分中,使用 ngpus_physical 资源来请求物理 GPU 数,同时使用 gmodel 选项指定 GPU 模型 (以及可选的总内存大小) ,使用 gmem 选项指定保留的 GPU 内存量,使用 glink 选项仅请求具有特殊连接的 GPU (用于 AMD GPU 的xGMI 连接或用于 Nvidia GPU 的 NVLink 连接)。

    如果需要使用 modej_exclusivemps 选项,那么必须使用简单的 GPU 需求。 对于复杂的 GPU 资源需求,不能在 rusage [] 部分中使用这些选项。

    重要信息: 如果使用 bsub -R 命令选项在作业级别指定复杂的 GPU 资源需求,使用 lsb.queues 文件中的 RES_REQ 参数指定队列级别,或者使用 lsb.applications 文件中的 RES_REQ 参数指定应用程序概要文件级别,那么 LSF 将忽略所有级别的简单 GPU 需求 (即, LSF 将忽略 bsub -gpu 命令选项,即 lsf.conf 文件中的 LSB_GPU_REQ 参数)。 以及 lsb.queueslsb.applications 文件中的 GPU_REQ 参数)。

    有关指定资源需求 (包括复杂的 GPU 资源需求) 的更多详细信息,请参阅 指定资源需求

    例如,以下备用资源需求字符串指定具有 2 任务的并行作业,其中每个任务都在具有 4 K80 GPU 或 2 P100 GPU 的单独主机上运行,这些 GPU 在每个套接字上均分:

    bsub -n 2 -R "span[ptile=1,gtile=!] rusage[ngpus_physical=4:gmodel=K80 || ngpus_physical=2:gmodel=P100]" ./myjob

结果

分配 GPU 时 GPU 条件的顺序如下:

  1. 最大的 GPU 计算能力 (gpu_factor 值)。
  2. 具有直接 NVLink 连接的 GPU。
  3. 具有相同型号的 GPU ,包括 GPU 总内存大小。
  4. 最大可用 GPU 内存。
  5. 同一 GPU 上的并发作业数。
  6. 当前 GPU 方式。