资源管理#
通过SkyForm AIP集群资源管理,将分散在不同节点上的物理资源聚合起来,根据系统内存、闲置CPU容量、可用GPU、磁盘空间等参数,以及用户的作业定义来为应用作业调度并分配资源,支持数百万个作业,数千台主机的超大规模集群。
什么是资源#
在SkyForm AIP系统中,CPU、GPU、内存、作业槽、存储等均为系统中的资源。集群则可以看作是一堆资源的集合。
SkyForm AIP系统持续的进行供需匹配。一旦集群中的某一个或多个主机可提供的资源能满足某个作业定义的资源要求,且该作业满足当前生效的调度策略,该作业就被分配至这个或这些主机上执行。
资源定义#
资源分标签资源和动态资源。标签资源定义在SkyForm AIP的配置文件cb.yaml里,而基本主机动态资源由aip服务自动从各主机自动获取或由RESS(资源传感器)引入到系统中。
根据值的类型,资源被划分为:
数值型(number):该类型资源的值为一个数值,比如可用的内存、主机CPU等。
字串型(text):该类型资源的值为一个字符串,比如主机类型、主机状态等。
标签型(tag):表示某些具体特性是否可用。
资源可以定义范围:主机绑定,集群共享,部分主机共享。
小技巧
定制动态资源由RESS定义和提供。
资源传感器RESS#
资源传感器(RESS)是一个定期输出YAML资源说明的可运行程序,只要该程序按照一定的规则命名和输出,定制的资源就自动加入到SkyForm AIP中,可被作业定义,由调度器进行调度。
例如,RESS通过输出以下内容增加了两个集群资源netres2和lic:
通过命令,我们可以看到这两个资源的值:
SkyForm AIP服务启动时,会自动检测在其daemon安装目录(如/opt/skyformai/sbin)里有以下文件名的可执行文件:
ress.master: 会在第一调度器主机上执行,并读取其输出。所有集群级的资源应该由ress.master检测更新并传递给SkyForm AIP。
ress.host: 会在每个主机上启动,并读取其输出。每个主机特有的资源(如FPGA)应该由ress.host检测更新并传递给SkyForm AIP。
ress.hostname: 会在主机名为hostname的主机上启动,并读取其输出。用户部分集群主机共享的资源,如一个硬件加速设备可同时被多个主机共享,就可在其中一台主机上增加ress.hostname,并在输出项locale中说明被哪几台主机共享。
RESS里定义的资源具有以下属性:
资源名(resource):作业可以用资源名来指定对此资源的需求。
资源描述(description):以描述资源和提示资源的使用。
类型(type):可分数值型(number),字串型(text),标签型(tag)。
数值升降(direction):描述数值型资源的多少属性,如可用内存是数值越大资源越多(decrease),而网络流量是数值越大资源越少(increase)。
释放(release):在作业暂停时作业是否释放资源。如作业暂停时会释放CPU和网络流量,但不会释放内存。
指定型(assign):有些资源如网络带宽或内存在分配时没有指定的单位,而GPU和端口在分配时由调度器指定具体某个资源,以免各个作业间互相发生冲突。
任务资源(slotresource):即每个任务需要分配一份资源,如内存,GPU等,而有些资源是作业级的,即不管一个作业有多少个任务,都只需分配一份资源,如存储容量。
资源值(value):当前资源的值。
范围(locale):节点类资源(如可用内存,GPU)或是集群资源,如网络流量和存储容量是整个集群共享的像FPGA、GPU等人工智能加速硬件就可以以资源的方式通过RESS加到SkyForm AIP中。
RESS的例子:/opt/skyformai/sbin/ress.master
#!/bin/bash
while true; do
echo "- resource: clksnd"
echo " description: The second value of the current clock"
echo " type: number"
echo " direction: increase"
echo " value:" `date +%S`
echo " locale: master node01"
echo "---"
sleep 10
done
以上的例子中,管理主机上的cbls会启动ress.master脚本,插入名为clksnd的数值型资源,这个资源只在master和node01两台主机上有效。
ress脚本编写好后,可以直接运行,确保输出的YAML格式正确,然后再放到/opt/skyformai/sbin目录中,并重启相应主机的cbls。以上的例子,重启管理主机master上的cbls:
cadmin lsrestart master
资源配额#
SkyForm AIP可对数值型资源设置配额,限制对资源的使用,防止某个用户或用户组过多占据资源。
系统里可以设置任意多的资源配额,每个配额为消费者限定每时每刻能使用的最多资源量。
消费者可以是以下单元的任意组合:
队列群或单个队列
用户/用户组群或单个用户/用户组
主机/主机群或单个主机/主机群
项目名
应用名
可设资源配额为:
作业槽总量
作业数总量
数值型资源(如GPU数),包括RESS插入的数值型资源的总量。
小技巧
关于队列、用户/用户组、和主机/主机组的设置,请参考*配置*。
资源配额设置在系统配置文件cb.yaml的底部。
例子1:
- name: limit1
queues: medium low
users: all ~u001
slots: 130
定义在队列medium和low上,除了用户u001以外的所有用户的所有作业操数为130。
例子2:
- name: limit2
per_queue: medium low
per_host: all
jobs: 2
定义对medium和low,每个队列里,在每个主机上的作业数为2。
例子3:
- name: limit3
per_user: all
resources: [mem,5000] [gpu, 2]
定义每个用户内存配额为5GB,GPU数为2。
配额还可定义有效的时间窗。例子:
slots: '[2 1:8:0-5:18:0] [5 5:18:01-1:7:59]'
以上的例子定义在周一的8:00到周五的18:00,作业槽配额为2,在周五18:01到周一的7:59,作业槽配额为5。
resources: '[mem,500000 1:8:0-5:18:0] [gpu,5 9:00-18:00]'
以上的例子定义在周一的8:00到周五的18:00,内存的配额为500GB,每天9点到18点,GPU的配额数为5个。
作业资源需求#
作业提交时可以定义作业所需的资源来帮助调度器为作业安排最优的运行资源,作业提交的资源需求可以用csub -R“字串”参数定义。字串中可以含有以下字节:
选择部分(select)。 选择部分指定选择执行主机的标准:select[…]
排序部分(order)。 排序部分说明对符合选择标准的主机进行排序: order[…]
资源使用部分(usage)。 资源使用部分确定作业的预期资源消耗: rusage[…]
作业跨越部分(span)。 作业跨越部分指示并行作业是否应该跨越多个主机: span[…]
资源组替代选择(same)。 多台主机为并行作业选择的资源应具有相同的资源值: same[…]
例子1:
csub -R "type==x86_64Windows order[ut] rusage[mem=100]" myjob
选择Windows主机,按CPU利用率排序,作业使用(预留)100MB内存。
例子2:
csub -n 16 -R "span[hosts=1] rusage[gpu=8]" myjob
作业需要16个CPU,16个CPU必须在同一台主机上,即整个作业需要8个GPU。
例子3:
csub -n 64 -R "same[model] myjob
作业需要64个CPU核,64个核必须分布在相同的CPU型号的主机上(集群由不同型号CPU的服务组成)
集群中的可用资源可以用命令cinfo列出。
多节异构作业资源需求#
对于类似TensorFlow的深度学习应用,一个作业由多个部分组成。提交此类作业时,可以使用多节资源需求。多节资源需求的语法为:n1{资源需求} n2{资源需求}…
其中n1,n2为CPU核数,如:
4{mem>10} 5{rusage[gpu=1]}
表示作业一共需要9个核,前面4核需要在内存大于10MB的主机上,后面5核每核需要1个GPU。
更多例子,请查阅 csub。