算力调度与 GPU 资源配额(Extended Resource + 调度 + 碎片治理)
2026-08-11 09:57:40 # Kubernetes

一、背景

多团队共享 GPU 集群时,若不做调度与配额管控,会出现“一张卡被小任务独占”“某团队打满全部算力”的问题。需要结合 Extended Resource、调度策略与配额 治理。

二、环境信息

  • K8s + nvidia-device-plugin(已注册 nvidia.com/gpu
  • 可选:Volcano / gpu-share 设备插件(支持算力与显存切分)

三、操作要点

1. Pod 申请整卡

1
2
3
resources:
limits:
nvidia.com/gpu: 1 # 申请 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" # team-a 最多用 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 依赖设备插件与容器运行时配合,隔离不彻底需业务层限流