kubernetes需精准调度ai训练任务至指定gpu型号与数量,先验证节点gpu资源是否正确暴露,再通过标签和资源请求约束实现定向调度。

你需要让Kubernetes准确调度AI训练任务到特定数量、特定型号或能力的GPU上,而不是随便挑一张空闲卡就塞进去——比如要求必须是A100 80GB且独占2张,或者限定只能用支持MIG的H100节点,否则任务启动后会因CUDA版本不匹配、显存不足或算力缺失直接崩溃。
确认节点GPU资源已正确暴露
先验证集群是否真正“看见”了你想要的GPU类型和数量,而不是只显示nvidia.com/gpu: 4这种笼统数字。执行:
kubectl describe node
重点检查Allocatable字段下是否有nvidia.com/gpu、nvidia.com/mig、甚至nvidia.com/gpu-a100-80gb这类自定义资源名。如果只有nvidia.com/gpu,说明设备插件没启用MIG模式或没配置GPU型号标签;如果连nvidia.com/gpu都没有,驱动或device plugin根本没跑起来。
这一步跳过会导致后续所有调度规则失效——【Pod永远Pending,因为调度器压根不知道你要的资源存在】。
给GPU节点打上精准规格标签
方法一:手动打标(适合小规模或调试)
kubectl label node
方法二:通过Node Feature Discovery(NFD)自动识别并打标
部署NFD后,它会基于lspci、nvidia-smi -q输出自动注入gpu.nvidia.com/model=A100-SXM4-80GB、gpu.nvidia.com/mig-enabled=true等标准标签。比手动打标可靠,且能随硬件变更自动更新。
注意:标签名中不能含下划线,比如gpu_type会触发Kubernetes校验失败;大小写敏感,a100-80gb和A100-80GB是两个不同标签。
在Pod中声明GPU数量与规格约束
第一步:明确申请整卡还是MIG实例
若需整卡独占(如大模型训练),用标准资源字段:
resources:
limits:
nvidia.com/gpu: 2
第二步:绑定具体GPU型号与能力
在spec.nodeSelector中指定标签:
nodeSelector:
gpu.type: a100-80gb
gpu.mig.enabled: "false"
第三步:防止被调度到低配节点(关键防线)
加上affinity规则,强制排除非目标GPU:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: gpu.type
operator: In
values: ["a100-80gb"]
第四步:若使用MIG,改用mig资源名+对应规格标签
resources:
limits:
nvidia.com/mig-1g.5gb: 4
nodeSelector:
gpu.model: A100-SXM4-80GB
gpu.mig-profile: 1g.5gb
验证调度结果是否符合预期
创建Pod后立即执行:
kubectl get pod
看NODE列是否落在你标记过的A100节点上;再运行:
kubectl describe pod
若出现FailedScheduling事件,且提示“0/12 nodes are available: 12 node(s) didn’t match Pod’s node selector”,说明标签名拼错或节点未打标;若提示“0/12 nodes are available: 12 Insufficient nvidia.com/mig-1g.5gb”,说明该节点虽有A100但未启用MIG或未配置对应profile。











