从云原生走向 AI 原生:一套面向未来的架构方法论 → 阅读《AI 原生基础设施》

调度策略

已发行

HAMi 提供两级调度策略:节点级和 GPU 卡级,支持 binpack、spread、拓扑感知和动态 MIG,满足从成本优化到性能极致的不同需求。

调度策略概述

HAMi 的调度策略分为两个层级:

┌─────────────────────────────────────────────┐
│           节点级策略(Node Policy)            │
│   控制 Pod 在不同节点间的分布                  │
│   策略:binpack | spread                     │
├─────────────────────────────────────────────┤
│           GPU 卡级策略(GPU Policy)           │
│   控制 Pod 在同一节点上的不同 GPU 卡间分布     │
│   策略:binpack | spread | topology          │
└─────────────────────────────────────────────┘
  • 节点级策略:决定 Pod 放到哪个节点
  • GPU 卡级策略:决定 Pod 使用节点上的哪张 GPU

两级策略独立配置,可以灵活组合。

BinPack 密集策略

优先将 Pod 调度到资源利用率最高的节点或 GPU 卡,实现"装箱"效果。

适用场景

  • 降低成本:减少使用的节点数,节省电力和运维成本
  • 最大化利用率:集中工作负载,留出空闲节点
  • GPUaaS: 提高每张 GPU 的共享密度

工作原理

3 张 GPU 当前使用情况:
  GPU-0: ████████░░ 80% 使用
  GPU-1: ████░░░░░░ 40% 使用
  GPU-2: ░░░░░░░░░░  0% 使用

BinPack 选择:GPU-0(使用率最高,剩余空间仍可容纳新 Pod)

配置

# values.yaml
scheduler:
  policy:
    nodeSchedulerPolicy: binpack    # 节点级 binpack
    gpuSchedulerPolicy: binpack     # 卡级 binpack
# 或通过 Pod 注解指定
metadata:
  annotations:
    hami.io/node-scheduler-policy: "binpack"
    hami.io/gpu-scheduler-policy: "binpack"

Spread 分散策略

优先将 Pod 调度到资源利用率最低的节点或 GPU 卡,实现"分散"效果。

适用场景

  • 高可用:工作负载分散到不同节点,单节点故障影响更小
  • 负载均衡:均匀分配资源,避免热点
  • 推理服务:多个推理实例分散部署,提高可用性

工作原理

3 张 GPU 当前使用情况:
  GPU-0: ████████░░ 80% 使用
  GPU-1: ████░░░░░░ 40% 使用
  GPU-2: ░░░░░░░░░░  0% 使用

Spread 选择:GPU-2(使用率最低,有最多可用空间)

配置

# values.yaml
scheduler:
  policy:
    nodeSchedulerPolicy: spread     # 节点级 spread
    gpuSchedulerPolicy: spread      # 卡级 spread

拓扑感知策略

利用 GPU 互连拓扑(NVLink、NVSwitch、PCIe)优化设备选择,将需要协作的多卡工作负载放在通信延迟最低的设备组合上。

适用场景

  • 大模型训练:多卡之间频繁通信,拓扑影响吞吐
  • 分布式训练:AllReduce 等集合通信对延迟敏感
  • 多卡推理:Tensor Parallel 需要低延迟设备间通信

工作原理

GPU 拓扑示例:
  GPU-0 ←→ GPU-1 : NVLink(高带宽)
  GPU-2 ←→ GPU-3 : NVLink(高带宽)
  GPU-0 ←→ GPU-2 : PCIe(低带宽)

需要 2 卡的训练任务 → 优先选择 GPU-0 + GPU-1(NVLink 互联)

配置

# values.yaml
scheduler:
  policy:
    gpuSchedulerPolicy: topology    # 卡级拓扑感知

前提条件

  • 需要 NVIDIA GPU
  • 需要安装 NVML 库
  • 调度器能够读取 GPU 拓扑信息

动态 MIG 策略

在支持 MIG 的 NVIDIA GPU 上,根据工作负载需求动态创建 MIG 实例。

适用场景

  • 强隔离需求:MIG 提供硬件级隔离,每个实例完全独立
  • 多租户环境:不同租户之间零干扰
  • 混合负载:不同大小的任务使用不同 MIG profile

MIG Profile 类型

ProfileGPU 切片显存适用场景
1g.10gb1/710GB轻量推理
2g.20gb2/720GB中等推理
3g.40gb3/740GB较重推理
4g.40gb4/740GB大模型推理
7g.80gb7/780GB独占整卡

配置

# values.yaml
devicePlugin:
  nvidia:
    migStrategy: "mixed"   # 启用 MIG
# Pod 使用 MIG 实例
apiVersion: v1
kind: Pod
metadata:
  name: mig-inference
spec:
  containers:
  - name: serving
    image: vllm:latest
    resources:
      limits:
        nvidia.com/mig-2g.20gb: 1

混合策略

两级策略独立配置,灵活组合:

节点级策略卡级策略效果典型场景
binpackbinpack聚集 + 填充成本优化、GPUaaS
binpackspread聚集 + 分散同节点多 GPU 均衡
spreadbinpack分散 + 填充高可用 + 单卡高密度
spreadspread全分散高可用、负载均衡
spreadtopology分散 + 拓扑训练集群最佳实践

配置示例

# 训练集群:节点分散 + 拓扑感知
scheduler:
  policy:
    nodeSchedulerPolicy: spread
    gpuSchedulerPolicy: topology

---
# 推理集群:节点聚集 + 卡级分散
scheduler:
  policy:
    nodeSchedulerPolicy: binpack
    gpuSchedulerPolicy: spread

策略选择指南

图 1: 调度策略决策流程
图 1: 调度策略决策流程

场景推荐

场景推荐策略原因
AI 云服务(GPUaaS)binpack/binpack最大化 GPU 密度,降低成本
企业推理平台spread/spread高可用,单节点故障影响小
大模型训练spread/topology分散到多节点 + 拓扑优化通信
开发测试环境binpack/binpack集中使用少量 GPU
训练推理混合binpack/spread集中使用节点 + 卡级分散推理
多租户平台spread/spread隔离 + 均衡

自定义策略开发

HAMi 支持通过设备抽象层的 ScoreNode 接口开发自定义调度策略:

// ScoreNode 接口定义
type Devices interface {
    ScoreNode(
        node string,
        podDevices PodDevices,
        previous float32,
        policy string,
    ) float32
}

开发步骤

  1. 实现设备后端的 ScoreNode 方法
  2. 注册自定义策略名称
  3. 在配置中指定策略名称

小结

本章介绍了 HAMi 的调度策略体系:

  • 两级调度:节点级和 GPU 卡级策略独立配置
  • BinPack:聚集优先,适合成本优化
  • Spread:分散优先,适合高可用
  • 拓扑感知:利用 GPU 互联拓扑,适合训练
  • 动态 MIG:提供硬件级隔离,适合多租户
  • 混合策略:灵活组合,覆盖各种场景

参考资料

创建于 2026/06/04 更新于 2026/06/05 1760 字 阅读约 4 分钟