算力调度与 GPU 资源配额(Extended Resource + 调度 + 碎片治理)
一、背景
多团队共享 GPU 集群时,若不做调度与配额管控,会出现“一张卡被小任务独占”“某团队打满全部算力”的问题。需要结合 Extended Resource、调度策略与配额 治理。
二、环境信息
- K8s + nvidia-device-plugin(已注册
nvidia.com/gpu)
- 可选:Volcano / gpu-share 设备插件(支持算力与显存切分)
三、操作要点
1. Pod 申请整卡
1 2 3
| resources: limits: nvidia.com/gpu: 1
|
2. 命名空间配额(ResourceQuota)
1 2 3 4 5 6 7
| apiVersion: v1 kind: ResourceQuota metadata: { name: gpu-quota, namespace: team-a } spec: hard: nvidia.com/gpu: "4" limits.cuda: "8"
|
3. LimitRange 设置默认值
1 2 3 4 5 6 7 8
| apiVersion: v1 kind: LimitRange metadata: { name: gpu-limit, namespace: team-a } spec: limits: - type: Resource max: { nvidia.com/gpu: "2" } min: { nvidia.com/gpu: "1" }
|
4. 减少碎片 / 共享算力
- 调度策略:
MostAllocated(binpack)减少碎片;LeastAllocated 均衡
- GPU 共享:使用 gpu-share 或 MIG,把单卡按显存/算力分给多容器
- Volcano gang scheduling 保证分布式训练“全有或全无”
四、验证方式
1 2 3 4
| kubectl describe quota -n team-a kubectl get pods -n team-a -o jsonpath='{range .items[*]}{.spec.containers[0].resources.limits}{" "}'
|
五、常见问题
- GPU 碎片:小任务占整卡导致大任务Pending,用 binpack + 共享切分缓解
- 配额超限:
Forbidden: exceeded quota,需提配额或释放
- MIG 配置复杂:A100 切分后资源名变为
nvidia.com/mig-1g.5gb 等,调度需对应
- 共享显存隔离:gpu-share 依赖设备插件与容器运行时配合,隔离不彻底需业务层限流