优化 Kubernetes 中的 GPU 分配,核心目标是提高 GPU 利用率、降低成本、避免资源浪费,同时保证任务隔离与调度正确性。下面从资源模型、调度策略、共享与隔离、监控与弹性几个层面系统说明。
一、明确 GPU 资源模型(基础)
1. 使用官方 Device Plugin
- NVIDIA:
nvidia-device-plugin - 每个 GPU 作为
nvidia.com/gpu: 1 - Pod 只能整卡申请(默认)
resources:
limits:
nvidia.com/gpu: 1
✅ 适合:训练任务
❌ 问题:推理/小任务浪费严重
二、GPU 共享(提升利用率的关键)
1. 时间片 / 算力切分(推荐)
NVIDIA MPS / MIG
✅ MIG(A100 / H100)
- 物理切分 GPU
- 示例:
- 1×A100 → 7 个实例
- 资源变成:
nvidia.com/mig-1g.5gb: 1
✅ 强隔离
✅ 高利用率
❌ 仅限特定卡
✅ NVIDIA MPS(软共享)
⚠️ 隔离性差,需配合限流
2. 显存级共享(社区方案)
- Aliyun GPU Share
- Volcano GPU Share
- 支持:
aliyun.com/gpu-mem: 4096 # 4GB
✅ 低成本推理
❌ 无算力隔离
三、调度优化(避免“占而不用”)
1. 使用 Volcano / Koordinator
- 支持:
- Gang Scheduling
- GPU 拓扑感知
- Binpack / Spread
schedulerName: volcano
✅ 减少碎片化
✅ 训练任务友好
2. 节点亲和 & 污点
nodeSelector:
gpu-type: a100
tolerations:
- key: nvidia.com/gpu
✅ 防止非 GPU 任务占用
3. 设置 GPU 请求 ≠ 限制
resources:
requests:
nvidia.com/gpu: 1
limits:
nvidia.com/gpu: 1
避免“超额预约”
四、提高利用率的工程实践
1. 推理 & 训练分离
2. 自动缩容
3. 队列与优先级
五、监控与诊断(必须做)
核心指标
工具
dcgm-exporter- Prometheus + Grafana
kubectl describe node
六、典型优化方案组合
| 场景 | 推荐方案 |
|---|
| 大模型训练 | A100 + MIG + Volcano |
| 推理服务 | GPU Share + KEDA |
| 混合负载 | Koordinator |
| 成本敏感 | MPS + 显存共享 |
七、常见坑
- ❌ GPU 被 Init 容器占用
- ❌ 只设 limits 不设 requests
- ❌ 不监控导致“假繁忙”
- ❌ 推理用整卡
如果你愿意,我可以:
- 给你一套 生产级 GPU 调度 YAML
- 按你的 卡型(T4/A10/A100) 定制方案
- 对比 MIG vs MPS vs GPU Share
你现在的 GPU 使用场景是训练还是推理?用的什么卡?