调度算法
在离线业务混部
在离线业务混部是将多种应用在一个集群内部署,通过预测分析应用特性,实现业务对集群资源的充分利用;
参数名 |
取值范围 |
默认值 |
是否允许修改 |
作用范围 |
---|---|---|---|---|
colocation-enable |
true/false |
false |
允许 |
CCE Turbo |
从集群维度来看,混部是将多种应用在一个集群内部署,通过预测分析应用特性,实现业务对集群资源的充分利用;从节点维度来看,混部是将多个容器部署在同一个节点上,这些容器内的应用既包括在线类型,也包括离线类型。根据应用对资源质量需求的差异,在线应用可以归纳为延时敏感型LS(Latency Sensitive),通常对请求压力(QPS)或访问延迟(RT)等指标有明确的要求,对资源质量较为敏感;离线应用可以归纳为资源消耗型BE(Best Effort),通常是一些计算密集型的任务类应用,有较好的容错重试能力,对资源质量的要求相对较为宽松。
配置建议:
只有在HCE 2.0的OS节点支持
抢占调度
根据优先级规则为同一队列中高优先级任务执行抢占调度。
参数名 |
取值范围 |
默认值 |
是否允许修改 |
作用范围 |
---|---|---|---|---|
preempt |
true/false |
false |
允许 |
CCE Standard/CCE Turbo |
开启抢占调度后,在集群资源不足的场景,高优先级作业将会驱逐低优先级作业,获取资源运行
抢占能力与pod延迟创建能力不可同时开启
资源碎片最小化调度
将Pod调度到资源使用较高的节点(尽量不往空白节点分配),以减少资源碎片。
参数名 |
取值范围 |
默认值 |
是否允许修改 |
作用范围 |
---|---|---|---|---|
binpack |
开启和关闭插件:true/false 插件对应的配置参数如下: binpack.weight:非负整数。 binpack.cpu:非负整数。 binpack.memory:非负整数。 binpack.resources:用户自定义字符串 binpack.resources.<your_resource>:非负整数。 |
开启插件:true 插件对应的配置参数如下: binpack.weight:10 binpack.cpu:1 binpack.memory:1 binpack.resources:nvidia.com/gpu binpack.resources.nvidia.com/gpu:2 |
允许 |
CCE Standard/CCE Turbo |
arguments参数:
binpack.weight:binpack插件本身在所有插件打分中的权重。
binpack.cpu:CPU资源在所有资源中的权重,默认是1。
binpack.memory:内存资源在所有资源中的权重,默认是1。
binpack.resources:Pod请求的其他自定义资源类型,例如nvidia.com/gpu。可添加多个并用英文逗号隔开。
binpack.resources.<your_resource>:自定义资源在所有资源中的权重,可添加多个类型的资源,其中<your_resource>为binpack.resources参数中定义的资源类型。例如binpack.resources.nvidia.com/gpu。
配置建议:
建议使用默认配置,如果业务有特殊的述求,可以根据业务实际场景调整各权重值。
- 希望重点提高集群CPU资源利用率,减少CPU资源碎片,可以将binpack.cpu权重值提高为10
- 希望提高集群GPU资源利用率,减少GPU碎片,可以通过binpack.resources添加自定义资源(GPU),并设定权重值为10
提高binpack插件的打分权重值后,该插件对于节点选择的影响力提高,nodeorder等插件对于节点的打分影响力将会被削弱
负载感知调度
Volcano调度器提供节点CPU、Memory的负载感知调度能力,感知集群内节点CPU、Memory的负载情况,将Pod优先调度到负载较低的节点,实现节点负载均衡,避免出现因单个节点负载过高而导致的应用程序或节点故障。
参数名 |
取值范围 |
默认值 |
是否允许修改 |
作用范围 |
---|---|---|---|---|
usage |
true/false |
false |
允许 |
CCE Standard/CCE Turbo |
负载感知调度支持的配置参数如下:
参数 |
说明 |
默认值 |
---|---|---|
负载感知调度策略权重 |
增大该权重值,可提高负载感知策略在整体调度中的影响力。 |
5 |
CPU权重 |
增大该权重值,优先均衡CPU资源。 |
1 |
内存权重 |
增大该权重值,优先均衡内存资源。 |
1 |
真实负载阈值生效方式 |
|
硬约束 |
CPU真实负载阈值 |
节点CPU真实利用率超过该阈值后,会根据真实负载阈值生效方式,将工作负载优先或强制调度到其他节点。 |
80 |
内存真实负载阈值 |
节点内存真实利用率超过该阈值后,会根据真实负载阈值生效方式,将工作负载优先或强制调度到其他节点。 |
80 |
配置建议:
为达到最优的负载感知调度效果,可以选择关闭装箱(binpack)策略。装箱策略(binpack)根据Pod的Request资源信息,将Pod优先调度到资源消耗较多的节点,在一定程度上会影响负载感知调度的效果。多种策略的结合使用案例可参考资源利用率优化调度配置案例。
节点优选策略
优选节点的常用算法,通过模拟分配从各个维度为节点打分,找到最适合当前作业的节点。
参数名 |
取值范围 |
默认值 |
是否允许修改 |
作用范围 |
---|---|---|---|---|
nodeorder |
开启和关闭插件:true/false 打分参数: nodeaffinity.weight:非负整数。 podaffinity.weight:非负整数。 leastrequested.weight:非负整数。 balancedresource.weight:非负整数。 mostrequested.weight:非负整数。 tainttoleration.weight:非负整数。 imagelocality.weight:非负整数。 volumebinding.weight:非负整数。 podtopologyspread.weight:非负整数。 |
开启插件:TRUE nodeaffinity.weight:1。 podaffinity.weight:1。 leastrequested.weight:1。 balancedresource.weight:1。 mostrequested.weight:0。 tainttoleration.weight:1。 imagelocality.weight:1。 volumebinding.weight:1。 podtopologyspread.weight:2。 |
允许 |
CCE Standard/CCE Turbo |
打分参数:
nodeaffinity.weight:节点亲和性优先调度,默认值是1。
podaffinity.weight:Pod亲和性优先调度,默认值是1。
leastrequested.weight:资源分配最少的节点优先,默认值是1。
balancedresource.weight:节点上面的不同资源分配平衡的优先,默认值是1。
mostrequested.weight:资源分配最多的节点优先,默认值是0。
tainttoleration.weight:污点容忍高的优先调度,默认值是1。
imagelocality.weight:节点上面有Pod需要镜像的优先调度,默认值是1。
volumebinding.weight:Local PV延迟绑定调度,默认值是1。
podtopologyspread.weight:Pod拓扑调度,默认值是2。
配置建议:
建议使用默认配置,如果业务有特殊的述求,可以根据业务实际场景调整各权重值。
增大策略对应的权重值,可以使该策略在节点打分时发挥更大的影响力。
NodeOrder和Binpack对某个节点的给出的基础分值,并根据对应的权重值进行倍数放大,调整插件中某个策略的权重值后,该策略对于节点打分的整体影响力增加,其他插件对节点评分的影响力将会同步被削弱。
公平调度
DRF调度算法(Dominant Resource Fairness)可以根据作业使用的主导资源份额进行调度,资源份额较小的作业将具有更高优先级。
参数名 |
取值范围 |
默认值 |
是否允许修改 |
作用范围 |
---|---|---|---|---|
drf |
true/false |
true |
允许 |
CCE Standard/CCE Turbo |
DRF调度算法的全称是Dominant Resource Fairness,是基于容器组Domaint Resource的调度算法。volcano-scheduler观察每个Job请求的主导资源,并将其作为对集群资源使用的一种度量,根据Job的主导资源,计算Job的share值,在调度的过程中,具有较低share值的Job将具有更高的调度优先级。这样能够满足更多的作业,不会因为一个资源份额较大业务,导致大批资源份额小的业务无法调度。DRF调度算法能够确保在多种类型资源共存的环境下,尽可能满足分配的公平原则。
配置建议:
DRF调度算法优先考虑集群中业务的吞吐量,适用单次AI训练、单次大数据计算以及查询等批处理小业务场景。
组调度
将一组Pod看做一个整体进行资源分配。观察Job下的Pod已调度数量是否满足了最小运行数量,当Job的最小运行数量得到满足时,为Job下的所有Pod执行调度动作,否则,不执行。
参数名 |
取值范围 |
默认值 |
是否允许修改 |
作用范围 |
---|---|---|---|---|
gang |
true/false |
true |
允许 |
CCE Standard/CCE Turbo |
Gang调度策略是volcano-scheduler的核心调度算法之一,它满足了调度过程中的“All or nothing”的调度需求,避免Pod的任意调度导致集群资源的浪费。具体算法是,观察Job下的Pod已调度数量是否满足了最小运行数量,当Job的最小运行数量得到满足时,为Job下的所有Pod执行调度动作,否则,不执行。
配置建议:
基于容器组概念的Gang调度算法十分适合需要多进程协作的场景。AI场景往往包含复杂的流程,Data Ingestion、Data Analysts、Data Splitting、Trainer、Serving、Logging等,需要一组容器进行协同工作,就很适合基于容器组的Gang调度策略。MPI计算框架下的多线程并行计算通信场景,由于需要主从进程协同工作,也非常适合使用Gang调度策略。容器组下的容器高度相关也可能存在资源争抢,整体调度分配,能够有效解决死锁。
在集群资源不足的场景下,gang的调度策略对于集群资源的利用率的提升是非常明显的。
虚拟GPU资源调度
支持GPU虚拟化资源调度。
参数名 |
取值范围 |
默认值 |
是否允许修改 |
作用范围 |
---|---|---|---|---|
xGPU |
true/false |
true |
允许 |
CCE Standard/CCE Turbo |
支持GPU单卡算力、显存分割与隔离的调度能力
配置建议:
使用GPU的场景默认开启,不使用GPU资源可以选择关闭
昇腾NPU预选调度
支持昇腾NPU HCCS亲和预选调度
参数名 |
取值范围 |
默认值 |
是否允许修改 |
作用范围 |
---|---|---|---|---|
cce-gpu-topology-predicate |
true/false |
true |
允许 |
CCE Standard/CCE Turbo |
一台AI服务器上共有8块NPU 1980芯片,4P * 2方式。每4块NPU 1980芯片之间通过HCCS互联,4块之间通过PCIe swith互联。
HCCS互联的4块NPU 1980芯片较PCIe swith互联有更大的带宽,可以针对HCCS做亲和性调度发挥HCCS的带宽优势。
配置建议:
使用NPU的集群默认开启,不使用NPU资源可以关闭
昇腾NPU优选调度
支持昇腾NPU HCCS亲和优选调度
参数名 |
取值范围 |
默认值 |
是否允许修改 |
作用范围 |
---|---|---|---|---|
cce-gpu-topology-priority |
true/false |
true |
允许 |
CCE Standard/CCE Turbo |
优先占满一台节点的NPU 1980芯片,减少资源碎片
配置建议:
使用NPU的集群默认开启,不使用NPU资源可以关闭
专家模式
如果上述Volcano的典型配置无法满足您的业务场景,可以使用专家模式定制专属于您的调度策略
参数名 |
取值范围 |
默认值 |
是否允许修改 |
作用范围 |
---|---|---|---|---|
expert-mode |
json格式 |
actions: 'allocate, backfill, preempt' tiers: - plugins: - name: 'priority' - name: 'gang' - name: 'conformance' - name: 'lifecycle' arguments: lifecycle.MaxGrade: 10 lifecycle.MaxScore: 200.0 lifecycle.SaturatedTresh: 1.0 lifecycle.WindowSize: 10 - plugins: - name: 'drf' - name: 'predicates' - name: 'nodeorder' - plugins: - name: 'cce-gpu-topology-predicate' - name: 'cce-gpu-topology-priority' - name: 'cce-gpu' - plugins: - name: 'nodelocalvolume' - name: 'nodeemptydirvolume' - name: 'nodeCSIscheduling' - name: 'networkresource' |
允许 |
CCE Standard/CCE Turbo |
volcano-scheduler是负责Pod调度的组件,它由一系列action和plugin组成。action定义了调度各环节中需要执行的动作;plugin根据不同场景提供了action 中算法的具体实现细节。
您可以根据官方文档中对每个action和plugin的说明,定义专属于您的调度策略。
详情可参见:https://support.huaweicloud.com/usermanual-cce/cce_10_0193.html#section1
配置建议:
使用默认配置
该项配置有一定的使用门槛,需要对调度有深入了解的客户,才可以根据官方文档进行定制化修改调度策略。