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.gn7i | A10 | 1-8 | 推理 |
| ecs.gn7 | A100 | 1-8 | 训练 |
| ecs.gn6v | V100 | 1-8 | 训练/推理 |
| ecs.gn6e | V100 (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-testGPU 资源请求
yaml
resources:
limits:
nvidia.com/gpu: 2 # 请求 2 张 GPU注意事项:
- GPU 只能在
limits中声明,不需要requests - GPU 不能请求小数(不能请求 0.5 个 GPU)
- 如果需要 GPU 共享,使用阿里云
cGPU或gpu-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