调度策略
已发行
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 类型
| Profile | GPU 切片 | 显存 | 适用场景 |
|---|---|---|---|
| 1g.10gb | 1/7 | 10GB | 轻量推理 |
| 2g.20gb | 2/7 | 20GB | 中等推理 |
| 3g.40gb | 3/7 | 40GB | 较重推理 |
| 4g.40gb | 4/7 | 40GB | 大模型推理 |
| 7g.80gb | 7/7 | 80GB | 独占整卡 |
配置
# 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混合策略
两级策略独立配置,灵活组合:
| 节点级策略 | 卡级策略 | 效果 | 典型场景 |
|---|---|---|---|
| binpack | binpack | 聚集 + 填充 | 成本优化、GPUaaS |
| binpack | spread | 聚集 + 分散 | 同节点多 GPU 均衡 |
| spread | binpack | 分散 + 填充 | 高可用 + 单卡高密度 |
| spread | spread | 全分散 | 高可用、负载均衡 |
| spread | topology | 分散 + 拓扑 | 训练集群最佳实践 |
配置示例
# 训练集群:节点分散 + 拓扑感知
scheduler:
policy:
nodeSchedulerPolicy: spread
gpuSchedulerPolicy: topology
---
# 推理集群:节点聚集 + 卡级分散
scheduler:
policy:
nodeSchedulerPolicy: binpack
gpuSchedulerPolicy: spread策略选择指南
场景推荐
| 场景 | 推荐策略 | 原因 |
|---|---|---|
| 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
}开发步骤
- 实现设备后端的
ScoreNode方法 - 注册自定义策略名称
- 在配置中指定策略名称
小结
本章介绍了 HAMi 的调度策略体系:
- 两级调度:节点级和 GPU 卡级策略独立配置
- BinPack:聚集优先,适合成本优化
- Spread:分散优先,适合高可用
- 拓扑感知:利用 GPU 互联拓扑,适合训练
- 动态 MIG:提供硬件级隔离,适合多租户
- 混合策略:灵活组合,覆盖各种场景