首页 > 解决方案 > 如何让 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 并实现了我自己的设备插件。

标签: gokubernetespluginsgpuscheduling

解决方案


我不明白你为什么要写这样的规则:

每个 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 的节点。

您可以在unofficial-kubernetes Scheduling gpus上找到其他相关信息。


推荐阅读