go - 如何让 k8s 按照特定规则分配 gpu/npu 设备
问题描述
我在一台机器上有多个 gpu 卡,我需要让 k8s 按照我设置的一些规则分配 gpu/npus 设备。
例如,假设有 8 个 id 为 0-7 的 gpu 卡,只有 device0、device1、device6 和 device7 可用。现在我需要创建一个带有 2 个设备的 pod,这两个设备必须是 (device0, device1) 或 (device6, device7)。(device0, device6) 等其他设备组合无效。
有没有办法做到这一点?我正在使用 1.18 版的 kubernetes 并实现了我自己的设备插件。
解决方案
我不明白你为什么要写这样的规则:
每个 device-id 都小于 4
如果你想限制你应该使用的 GPU 数量,limits
这在Schedule GPUsrequests
上有很好的解释。因此,您可以将资源限制为仅 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
通过节点关联规则指定 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 的节点。
推荐阅读
- ios - 为什么我的按钮上的 addTarget 功能不起作用?
- javascript - 为什么在尝试迭代图像列表时指定的图像不会在点击时被删除?
- spss - 将 t-1 的记录值分配给所有案例
- javascript - jQuery 音频淡入淡出
- coq - 在 Coq 中区分目标
- c - 在 C 和 Linux 中执行实现 IPC 管道时输出行为突然
- c# - 我可以在 HTML 中制作自定义元素吗?如果是这样,怎么做?
- python - 如何在 Anaconda 中更新 Django?
- groovy - 使用 Groovy 解析 JSON
- python - 无论我做什么,我都会不断收到 AttributeError: 'str' object has no attribute 'read'