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

资源请求与分配

已发行

HAMi 使用标准 Kubernetes 资源请求语义,通过自定义资源字段声明 GPU 资源需求,实现零应用改动的 GPU 资源管理。

GPU 资源模型

HAMi 在 Kubernetes 资源模型基础上扩展了 GPU 资源语义,提供多个维度的资源控制:

资源名含义单位示例
nvidia.com/gpuGPU 设备数量整数3 表示使用 3 个 GPU 设备
nvidia.com/gpumem显存大小MB4000 表示 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 中的 resourceCountNameresourceMemoryNameresourceCoreName 参数自定义。详见 HAMi 全局配置

资源声明原则

  • nvidia.com/gpu 指定要使用的 GPU 设备数量(整数,如 3 表示 3 个 GPU 设备)
  • nvidia.com/gpumemnvidia.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: 1

MIG 模式配置

# values.yaml
devicePlugin:
  nvidia:
    migStrategy: "mixed"   # single | mixed | none

常见资源请求模式

场景nvidia.com/gpunvidia.com/gpumemnvidia.com/cores说明
轻量推理110001010 个 Pod 共享 1 GPU
标准推理12000-400020-303-5 个 Pod 共享 1 GPU
大模型推理1-210000-4000050-100独占或少量共享
训练任务1全部显存100独占 GPU
多卡训练4-8每卡全显存100独占多卡
开发测试1500-10005-10多人共享

小结

本章介绍了 HAMi 的资源请求与分配:

  • 资源模型nvidia.com/gpunvidia.com/gpumem 等字段声明 GPU 资源需求
  • 基本用法:按显存、百分比、设备数量分配
  • 应用场景:推理服务、训练推理混合、开发测试、指定策略
  • 高级配置:亲和性、类型过滤、优先级、超卖
  • MIG:支持硬件级隔离

参考资料

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