资源请求与分配
HAMi 使用标准 Kubernetes 资源请求语义,通过自定义资源字段声明 GPU 资源需求,实现零应用改动的 GPU 资源管理。
GPU 资源模型
HAMi 在 Kubernetes 资源模型基础上扩展了 GPU 资源语义,提供多个维度的资源控制:
| 资源名 | 含义 | 单位 | 示例 |
|---|---|---|---|
nvidia.com/gpu | GPU 设备数量 | 整数 | 3 表示使用 3 个 GPU 设备 |
nvidia.com/gpumem | 显存大小 | MB | 4000 表示 4GB 显存 |
nvidia.com/gpumem-percentage | 显存百分比 | % | 50 表示 50% 显存 |
nvidia.com/cores | 算力核心占比 | % | 30 表示 30% 算力 |
注意: 上表中的资源名为 NVIDIA GPU 的默认配置(通过
nvidia.resourceCountName等参数设置)。不同厂商有不同的默认资源名,例如昇腾 NPU 常见为huawei.com/Ascend910B3、寒武纪 MLU 为cambricon.com/vmlu、海光 DCU 为hygon.com/dcunum等。资源名可通过 ConfigMap 中的resourceCountName、resourceMemoryName、resourceCoreName参数自定义。详见 HAMi 全局配置。
资源声明原则
nvidia.com/gpu指定要使用的 GPU 设备数量(整数,如3表示 3 个 GPU 设备)nvidia.com/gpumem或nvidia.com/gpumem-percentage指定每个设备的显存配额(二选一)nvidia.com/cores可选,限制每个设备的算力使用比例(百分比)
基本用法
按显存和算力分配
最常用的方式,指定 GPU 设备数量和显存大小:
apiVersion: v1
kind: Pod
metadata:
name: ai-inference
spec:
containers:
- name: inference
image: tensorflow-serving:latest
resources:
limits:
nvidia.com/gpu: 3 # 使用 3 个 GPU 设备
nvidia.com/gpumem: 4000 # 每个设备分配 4GB 显存此 Pod 使用 3 个 GPU 设备,每个设备分配 4000MB 显存。
按显存百分比分配
使用百分比而非绝对值,适配不同型号的 GPU:
apiVersion: v1
kind: Pod
metadata:
name: ai-inference-pct
spec:
containers:
- name: inference
image: pytorch:latest
resources:
limits:
nvidia.com/gpu: 2 # 使用 2 个 GPU 设备
nvidia.com/gpumem-percentage: 40 # 分配 40% 显存按设备数量分配
直接申请整张卡:
apiVersion: v1
kind: Pod
metadata:
name: training-job
spec:
containers:
- name: training
image: pytorch:latest
resources:
limits:
nvidia.com/gpu: 1 # 使用 1 整张 GPU
nvidia.com/gpumem: 32000 # 分配 32GB 显存多卡分配
申请多张 GPU:
apiVersion: v1
kind: Pod
metadata:
name: multi-gpu-training
spec:
containers:
- name: training
image: pytorch:latest
resources:
limits:
nvidia.com/gpu: 4 # 使用 4 张 GPU
nvidia.com/gpumem: 32000 # 每张卡 32GB 显存应用场景与示例
场景 1:AI 推理服务
多个模型推理任务共享 GPU,最常见的使用场景:
# 模型 A:轻量级推理
apiVersion: v1
kind: Pod
metadata:
name: model-a
spec:
containers:
- name: serving
image: model-a:latest
resources:
limits:
nvidia.com/gpu: 1 # 使用 1 个 GPU
nvidia.com/gpumem: 2000 # 2GB 显存
nvidia.com/cores: 20 # 20% 算力
---
# 模型 B:中等推理
apiVersion: v1
kind: Pod
metadata:
name: model-b
spec:
containers:
- name: serving
image: model-b:latest
resources:
limits:
nvidia.com/gpu: 1 # 使用 1 个 GPU
nvidia.com/gpumem: 4000 # 4GB 显存
nvidia.com/cores: 30 # 30% 算力注意: GPU 共享通过多个 Pod 各请求
nvidia.com/gpu: 1+ 部分nvidia.com/gpumem实现。调度器将它们分配到同一个 GPU 设备上,只要总显存不超过物理显存。nvidia.com/cores可选,用于限制每个 Pod 的算力占比。
场景 2:训练与推理混合
同一集群中训练任务和推理任务共存:
# 训练任务:独占大部分 GPU 资源
apiVersion: v1
kind: Pod
metadata:
name: training-job
spec:
containers:
- name: training
image: pytorch:latest
resources:
limits:
nvidia.com/gpu: 1 # 独占 1 个 GPU
nvidia.com/gpumem: 40000 # 40GB 显存(A100)
---
# 推理任务:共享 GPU,少量资源
apiVersion: v1
kind: Pod
metadata:
name: inference-server
spec:
containers:
- name: serving
image: vllm:latest
resources:
limits:
nvidia.com/gpu: 1 # 使用 1 个 GPU
nvidia.com/gpumem: 8000 # 8GB 显存
nvidia.com/cores: 20 # 20% 算力场景 3:开发测试环境
为每个开发人员分配小份额 GPU:
apiVersion: v1
kind: Pod
metadata:
name: dev-notebook
spec:
containers:
- name: jupyter
image: jupyter/pytorch-notebook:latest
resources:
limits:
nvidia.com/gpu: 1 # 使用 1 个 GPU
nvidia.com/gpumem: 2000 # 2GB 显存
nvidia.com/cores: 10 # 10% 算力10 个开发人员可以共享同一张 24GB 显存的 GPU,每人 2GB 显存 + 10% 算力。
场景 4:指定调度策略
apiVersion: v1
kind: Pod
metadata:
name: inference-with-policy
annotations:
hami.io/node-scheduler-policy: "spread"
hami.io/gpu-scheduler-policy: "binpack"
spec:
containers:
- name: serving
image: vllm:latest
resources:
limits:
nvidia.com/gpu: 3 # 使用 3 个 GPU 设备
nvidia.com/gpumem: 4000 # 每个设备 4GB 显存高级配置
节点亲和性
将工作负载调度到特定 GPU 类型的节点:
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: gpu-model
operator: In
values: ["A100", "A100-80G"]GPU 类型过滤
metadata:
annotations:
hami.io/gpu-type: "A100" # 只使用 A100
# hami.io/gpu-type: "Ascend910B" # 使用昇腾UUID 白黑名单
metadata:
annotations:
hami.io/gpu-uuid-white-list: "GPU-xxx,GPU-yyy"优先级与抢占
metadata:
annotations:
hami.io/task-priority: "10"
spec:
priorityClassName: high-priority资源超卖
在 Helm values.yaml 中配置超卖系数:
scheduler:
overcommit:
enabled: true
deviceMemoryScaling: 1.5 # 显存超卖 1.5 倍
deviceCoreScaling: 1.2 # 算力超卖 1.2 倍注意: 超卖会提高利用率但增加资源争用风险,建议只在推理场景使用,并配合监控观察实际利用率。
NVIDIA MIG 支持
NVIDIA Multi-Instance GPU(MIG)提供硬件级隔离:
apiVersion: v1
kind: Pod
metadata:
name: mig-inference
spec:
containers:
- name: serving
image: vllm:latest
resources:
limits:
nvidia.com/mig-1g.10gb: 1MIG 模式配置
# values.yaml
devicePlugin:
nvidia:
migStrategy: "mixed" # single | mixed | none常见资源请求模式
| 场景 | nvidia.com/gpu | nvidia.com/gpumem | nvidia.com/cores | 说明 |
|---|---|---|---|---|
| 轻量推理 | 1 | 1000 | 10 | 10 个 Pod 共享 1 GPU |
| 标准推理 | 1 | 2000-4000 | 20-30 | 3-5 个 Pod 共享 1 GPU |
| 大模型推理 | 1-2 | 10000-40000 | 50-100 | 独占或少量共享 |
| 训练任务 | 1 | 全部显存 | 100 | 独占 GPU |
| 多卡训练 | 4-8 | 每卡全显存 | 100 | 独占多卡 |
| 开发测试 | 1 | 500-1000 | 5-10 | 多人共享 |
小结
本章介绍了 HAMi 的资源请求与分配:
- 资源模型:
nvidia.com/gpu、nvidia.com/gpumem等字段声明 GPU 资源需求 - 基本用法:按显存、百分比、设备数量分配
- 应用场景:推理服务、训练推理混合、开发测试、指定策略
- 高级配置:亲和性、类型过滤、优先级、超卖
- MIG:支持硬件级隔离