我在一台机器上有多块gpu卡,我需要让k8s按照我设定的规则分配gpunpus设备。
比如说,假设有8个gpu卡,id是0-7,只有device0、device1、device6和device7是可用的。现在我需要创建一个有2个设备的pod,这两个设备必须是(device0,device1)或(device6,device7)中的一个。其他的设备组合如(device0,device6)是无效的。
有什么方法可以做到吗? 我使用的是1.18版本的kubernetes,实现了自己的设备插件。
我不明白你为什么要写这样的规则。
每个设备的id都要小于4
如果你想限制GPU的数量,你应该使用 limits
和 requests
上有很好的解释。排程GPU.所以你可以像这样把资源只限制在4个GPU上。
apiVersion: v1
kind: Pod
metadata:
name: cuda-vector-add
spec:
restartPolicy: OnFailure
containers:
- name: cuda-vector-add
# https://github.com/kubernetes/kubernetes/blob/v1.7.11/test/images/nvidia-cuda/Dockerfile
image: "k8s.gcr.io/cuda-vector-add:v0.1"
resources:
limits:
nvidia.com/gpu: 4 # requesting 1 GPU
如果你在不同的节点上有不同类型的GPU,你就可以使用 labels
您可以在这里阅读 包含不同类型GPU的集群.
# Label your nodes with the accelerator type they have. kubectl label nodes <node-with-k80> accelerator=nvidia-tesla-k80 kubectl label nodes <node-with-p100> accelerator=nvidia-tesla-p100
如果你的节点正在运行不同版本的 GPU,那么使用节点标签和节点选择器将 pod 排程到适当的 GPU。以下是这个工作流程的说明。
作为Node引导的一部分,确定节点上的GPU硬件类型,并将其作为节点标签。
NVIDIA_GPU_NAME=$(nvidia-smi --query-gpu=gpu_name --format=csv,noheader --id=0)
source /etc/default/kubelet
KUBELET_OPTS="$KUBELET_OPTS --node-labels='alpha.kubernetes.io/nvidia-gpu-name=$NVIDIA_GPU_NAME'"
echo "KUBELET_OPTS=$KUBELET_OPTS" > /etc/default/kubelet
通过 Node Affinity 规则指定 pod 可以使用的 GPU 类型。
kind: pod
apiVersion: v1
metadata:
annotations:
scheduler.alpha.kubernetes.io/affinity: >
{
"nodeAffinity": {
"requiredDuringSchedulingIgnoredDuringExecution": {
"nodeSelectorTerms": [
{
"matchExpressions": [
{
"key": "alpha.kubernetes.io/nvidia-gpu-name",
"operator": "In",
"values": ["Tesla K80", "Tesla P100"]
}
]
}
]
}
}
}
spec:
containers:
-
name: gpu-container-1
resources:
limits:
alpha.kubernetes.io/nvidia-gpu: 2
这将确保pod将被调度到具有Tesla K80或Tesla P100 Nvidia GPU的节点上。
您可以在以下网站找到其他相关信息 非官方的-kubernetes 调度 gpus.