Skip to content

02 - GPU 调度与资源管理

K8s 中的 GPU 支持

K8s 通过 Device Plugin 机制支持 GPU:

┌──────────────────────────────────────────────────────────┐
│  GPU Node                                                │
│                                                          │
│  ┌────────────────────┐  ┌────────────────────┐         │
│  │ NVIDIA Device      │  │ kubelet            │         │
│  │ Plugin (DaemonSet) │◄─│                    │         │
│  │                    │  │ 上报 GPU 资源        │         │
│  │ 发现 GPU 设备       │  │ nvidia.com/gpu: 4   │         │
│  └────────────────────┘  └────────────────────┘         │
│                                                          │
│  ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐                   │
│  │GPU 0 │ │GPU 1 │ │GPU 2 │ │GPU 3 │                   │
│  └──────┘ └──────┘ └──────┘ └──────┘                   │
└──────────────────────────────────────────────────────────┘

在 ACK 上使用 GPU

1. 创建 GPU 节点池

选择 GPU 实例规格:

规格族GPU 型号GPU 数量适用场景
ecs.gn7iA101-8推理
ecs.gn7A1001-8训练
ecs.gn6vV1001-8训练/推理
ecs.gn6eV100 (32GB)1-8大模型训练

2. 安装 GPU 组件

ACK 控制台 → 集群 → 组件管理 → 安装:

  • nvidia-device-plugin:GPU 设备发现和分配
  • gpu-manager(可选):GPU 共享和隔离

3. 验证 GPU

bash
# 查看节点 GPU 资源
kubectl describe nodes | grep nvidia.com/gpu

# 运行 GPU 测试 Pod
kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
  name: gpu-test
spec:
  restartPolicy: OnFailure
  containers:
  - name: cuda
    image: nvidia/cuda:12.0.0-base-ubuntu22.04
    command: ["nvidia-smi"]
    resources:
      limits:
        nvidia.com/gpu: 1
EOF

kubectl logs gpu-test

GPU 资源请求

yaml
resources:
  limits:
    nvidia.com/gpu: 2       # 请求 2 张 GPU

注意事项

  • GPU 只能在 limits 中声明,不需要 requests
  • GPU 不能请求小数(不能请求 0.5 个 GPU)
  • 如果需要 GPU 共享,使用阿里云 cGPUgpu-manager

GPU 共享(cGPU)

阿里云提供 cGPU 实现 GPU 显存和算力共享:

yaml
resources:
  limits:
    # cGPU 共享 GPU
    aliyun.com/gpu-mem: 4    # 请求 4GB 显存
    # 或者
    aliyun.com/gpu-count: 25 # 请求 25% 的 GPU 算力

Taint GPU 节点

防止普通 Pod 被调度到 GPU 节点浪费资源:

bash
# GPU 节点添加污点
kubectl taint nodes <gpu-node> nvidia.com/gpu=present:NoSchedule

# 训练 Pod 添加容忍
yaml
spec:
  tolerations:
  - key: "nvidia.com/gpu"
    operator: "Exists"
    effect: "NoSchedule"
  containers:
  - name: training
    image: my-training:latest
    resources:
      limits:
        nvidia.com/gpu: 4

下一步

03 - 分布式训练实战