我在一台机器中有多个GPU卡,我需要让k8s按照我设置的一些规则分配gpu/npus设备。
例如,假设有 8 个 GPU 卡的 id 为 0-7,并且只有设备 0、设备 1、设备 6 和设备 7 可用。现在我需要创建一个包含 2 个设备的 pod,这两个设备必须是 (device0, device 1( 或 (device6, device 7( 中的任何一个。其他设备组合(如 (设备 0、设备 6((无效。
有什么办法可以做到这一点吗? 我正在使用 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。以下是此工作流的图示:
作为节点引导的一部分,请确定节点上的 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
指定容器可以通过节点关联性规则使用的 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 调度 GPU 上找到其他相关信息。