概述

HPC 集群的底层网络通常可以用根树表示,如”胖树”网络。在树状网络中,叶节点表示主机,内部节点表示交换机。通过树结构边数越少的主机之间通信延迟越小。

对于跨多主机的作业,通常希望将网络拓扑中距离较近的主机分配给作业,以最小化作业各任务之间的通信延迟。

LSF 计算单元(Compute Unit, CU)功能使 LSF 在调度时考虑树状网络拓扑。

配置步骤

步骤一:定义计算单元类型

lsb.params 中配置 COMPUTE_UNIT_TYPES 参数:

1
COMPUTE_UNIT_TYPES = switch! rack building

参数说明

  • 定义了三种 CU 类型:switch、rack、building
  • 顺序对应网络拓扑层级:switch(最细)→ rack → building(最粗)
  • ! 标记默认 CU 类型(本例中 switch 是默认类型)
  • 主机包含在最低层级的 CU 中(本例中是 switch)

层级关系

1
2
3
4
building
  └── rack
       └── switch
            └── hosts

步骤二:配置计算单元层次结构

lsb.hostsComputeUnit 部分配置主机组织结构:

1
2
3
4
5
6
7
8
9
10
11
Begin ComputeUnit
NAME     TYPE       MEMBER
s1       switch     (host01 host02 host03 host04)
s2       switch     (host05 host06 host07 host08)
...
r1       rack       (s1 s2)
r2       rack       (s3 s4)
...
b1       building   (r1 r2)
b2       building   (r3 r4)
End ComputeUnit

注意:与标准 LSF 主机组不同,CU 层次结构是严格的森林结构。每个 CU 和主机最多只能出现在一个父 CU 的成员列表中。

步骤三:使配置生效

1
badmin reconfig

验证配置

1
2
3
4
5
6
7
8
9
10
$ bmgroup -cu
NAME          TYPE          HOSTS
s1            switch        host01 host02 host03 host04
s2            switch        host05 host06 host07 host08
...
r1            rack          s1/ s2/
r2            rack          s3/ s4/
...
b1            building      r1/ r2/
b2            building      r3/ r4/

提交作业使用计算单元

基本用法:指定 CU 名称

CU 本质上是带有类型的 LSF 主机组,所有主机组功能都适用于 CU:

1
$ bsub -m "r1" -n 64 ./a.out

此作业请求 64 个槽位,全部必须在 CU r1 的主机上。

使用 cu[] 资源需求

使用默认 CU 类型

1
$ bsub -R "cu[]" -n 64 ./a.out

LSF 将作业放置在默认类型(本例中是 switch)的 CU 中的主机上。

指定 CU 类型

1
$ bsub -R "cu[type=rack]" -n 64 ./a.out

cu[] 关键字

关键字 说明 示例
type 指定 CU 类型 cu[type=rack]
pref 指定 CU 选择偏好 cu[pref=maxavail]
maxcus 限制作业跨越的最大 CU 数量 cu[maxcus=1]
excl 独占使用 CU cu[excl]

CU 选择偏好 (pref)

偏好值 说明 适用场景
minavail 优先选择空闲槽位最少的 CU 串行作业,避免 CU 碎片化
maxavail 优先选择空闲槽位最多的 CU 并行作业,最小化跨 CU 数量

示例

1
2
3
4
5
# 偏好空闲槽位最少的 CU(避免碎片化)
$ bsub -R "cu[pref=minavail]" ./a.out

# 偏好空闲槽位最多的 CU(减少延迟)
$ bsub -R "cu[pref=maxavail]" -n 64 ./a.out

限制 CU 数量 (maxcus)

限制作业可以跨越的 CU 数量:

1
2
3
4
5
# 限制在单个 CU 内运行
$ bsub -R "cu[maxcus=1]" ./a.out

# 最多跨越 10 个 CU
$ bsub -R "cu[maxcus=10]" ./a.out

注意:如果作业无法在指定数量的 CU 内放置,将保持 PEND 状态。

组合使用

尽可能少地使用 rack,但最多不超过 2 个:

1
$ bsub -R "cu[type=rack:pref=maxavail:maxcus=2]" -n 64 ./a.out

独占 CU (excl)

对于基准测试等需要避免其他作业干扰的场景,可以独占使用 CU。

步骤一:队列启用独占

lsb.queues 中配置:

1
2
3
4
5
6
Begin Queue
QUEUE_NAME = benchmark
...
EXCLUSIVE = CU[rack]
...
End Queue

此设置允许队列中的作业独占使用 rack 类型的 CU,以及更细粒度的 CU 类型和单个主机。

步骤二:提交独占作业

1
$ bsub -R "cu[type=rack:excl]" -n 64 ./a.out

作业将保持 PEND 直到 LSF 能够授予其一个或多个 rack 的独占使用权。作业运行后,其他作业不能调度到这些 rack。

配置参数汇总

参数 配置文件 说明
COMPUTE_UNIT_TYPES lsb.params 定义 CU 类型层级
ComputeUnit section lsb.hosts 定义 CU 成员结构
EXCLUSIVE = CU[type] lsb.queues 启用队列的 CU 独占功能

参考资料

  1. IBM Documentation - Using compute units for topology scheduling
  2. IBM Documentation - Best practices and tips for LSF