Как заставить k8s выделять устройства gpu / npu согласно определенному правилу c - PullRequest
5 голосов
/ 27 мая 2020

У меня есть несколько карт GPU на одной машине, и мне нужно разрешить k8s выделить устройство GPU / NPUS, следуя некоторым правилам, которые я установил.

Например, предположим, что имеется 8 карт gpu с идентификаторами от 0 до 7, и доступны только device0, device1, device6 и device7. Теперь мне нужно создать один модуль с 2 устройствами, эти два устройства должны быть либо (device0, device1), либо (device6, device7). Другие комбинации устройств, такие как (device0, device6), недопустимы.

Есть ли способ сделать это? Я использую Kubernetes версии 1.18 и реализовал собственный плагин для устройства.

1 Ответ

0 голосов
/ 28 мая 2020

Я не понимаю, зачем вы пишете такое правило:

каждый идентификатор устройства должен быть меньше 4

Если вы хотите ограничить количество графических процессоров вы должны использовать limits и requests, что хорошо объясняется в Schedule GPUs . Таким образом, вы можете просто ограничить ресурс только четырьмя графическими процессорами, например:

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

Если у вас разные типы графических процессоров на разных узлах, вы можете использовать labels, который вы можете прочитать здесь Кластеры, содержащие разные типы графических процессоров .

# 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

Если на ваших узлах работают разные версии графических процессоров, используйте метки узлов и селекторы узлов, чтобы запланировать модули для соответствующих графических процессоров. Ниже приведена иллюстрация этого рабочего процесса:

В рамках начальной загрузки узла определите тип оборудования графического процессора на ваших узлах и предоставьте его как метку узла.

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

Укажите типы графического процессора модуль можно использовать с помощью правил сопоставления узлов.

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

Это гарантирует, что модуль будет назначен узлу с Tesla K80 или Tesla P100 Nvidia GPU.

Вы можете найти другую соответствующую информацию на unofficial-kubernetes Scheduling gpus .

...